diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6d9685f3..7b47e656 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -19,10 +19,10 @@ jobs:
       - name: Checkout
         uses: actions/checkout@v4
         
-      - name: .NET 7.0
-        uses: actions/setup-dotnet@v3
+      - name: .NET 9.0
+        uses: actions/setup-dotnet@v4
         with:
-          dotnet-version: 7.0.x
+          dotnet-version: 9.0.x
 
       - name: Build
         run: |
@@ -51,6 +51,7 @@ jobs:
         shell: powershell
 
       - name: Publish Artifacts
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
+          name: 'ci_${{ matrix.TEST_SUITE }}_${{ matrix.FIREBIRD_SELECTION }}_${{ env.CONFIGURATION }}'
           path: '.\\out\\'
diff --git a/build.ps1 b/build.ps1
index c5b84ce4..9a321609 100644
--- a/build.ps1
+++ b/build.ps1
@@ -8,7 +8,9 @@ $baseDir = Split-Path -Parent $PSCommandPath
 . "$baseDir\include.ps1"
 
 $outDir = "$baseDir\out"
-$version = ''
+$versionProvider = ''
+$versionEFCore = ''
+$versionEF6 = ''
 
 function Clean() {
 	if (Test-Path $outDir) {
@@ -29,19 +31,28 @@ function Build() {
 	b 'Restore' $False
 	b 'Restore'
 	b 'Build'
-	$script:version = (Get-Item $baseDir\src\FirebirdSql.Data.FirebirdClient\bin\$Configuration\$(Get-UsedTargetFramework)\FirebirdSql.Data.FirebirdClient.dll).VersionInfo.ProductVersion -replace '(\d+)\.(\d+)\.(\d+)(-[a-z0-9]+)?(.*)','$1.$2.$3$4'
+}
+
+function Versions() {
+	function v($file) {
+		return (Get-Item $file).VersionInfo.ProductVersion -replace '(\d+)\.(\d+)\.(\d+)(-[a-z0-9]+)?.*','$1.$2.$3$4'
+	}
+	$script:versionProvider = v $baseDir\src\FirebirdSql.Data.FirebirdClient\bin\$Configuration\net8.0\FirebirdSql.Data.FirebirdClient.dll
+	$script:versionEFCore = v $baseDir\src\FirebirdSql.EntityFrameworkCore.Firebird\bin\$Configuration\net8.0\FirebirdSql.EntityFrameworkCore.Firebird.dll
+	$script:versionEF6 = v $baseDir\src\EntityFramework.Firebird\bin\$Configuration\net48\EntityFramework.Firebird.dll
 }
 
 function NuGets() {
-	cp $baseDir\src\FirebirdSql.Data.FirebirdClient\bin\$Configuration\FirebirdSql.Data.FirebirdClient.$version.nupkg $outDir
-	cp $baseDir\src\EntityFramework.Firebird\bin\$Configuration\EntityFramework.Firebird.$version.nupkg $outDir
-	cp $baseDir\src\FirebirdSql.EntityFrameworkCore.Firebird\bin\$Configuration\FirebirdSql.EntityFrameworkCore.Firebird.$version.nupkg $outDir
+	cp $baseDir\src\FirebirdSql.Data.FirebirdClient\bin\$Configuration\FirebirdSql.Data.FirebirdClient.$versionProvider.nupkg $outDir
+	cp $baseDir\src\FirebirdSql.EntityFrameworkCore.Firebird\bin\$Configuration\FirebirdSql.EntityFrameworkCore.Firebird.$versionEFCore.nupkg $outDir
+	cp $baseDir\src\EntityFramework.Firebird\bin\$Configuration\EntityFramework.Firebird.$versionEF6.nupkg $outDir
 
-	cp $baseDir\src\FirebirdSql.Data.FirebirdClient\bin\$Configuration\FirebirdSql.Data.FirebirdClient.$version.snupkg $outDir
-	cp $baseDir\src\EntityFramework.Firebird\bin\$Configuration\EntityFramework.Firebird.$version.snupkg $outDir
-	cp $baseDir\src\FirebirdSql.EntityFrameworkCore.Firebird\bin\$Configuration\FirebirdSql.EntityFrameworkCore.Firebird.$version.snupkg $outDir
+	cp $baseDir\src\FirebirdSql.Data.FirebirdClient\bin\$Configuration\FirebirdSql.Data.FirebirdClient.$versionProvider.snupkg $outDir
+	cp $baseDir\src\FirebirdSql.EntityFrameworkCore.Firebird\bin\$Configuration\FirebirdSql.EntityFrameworkCore.Firebird.$versionEFCore.snupkg $outDir
+	cp $baseDir\src\EntityFramework.Firebird\bin\$Configuration\EntityFramework.Firebird.$versionEF6.snupkg $outDir
 }
 
 Clean
 Build
+Versions
 NuGets
diff --git a/docs/entity-framework-core.md b/docs/entity-framework-core.md
index e1489915..e5b2a5c3 100644
--- a/docs/entity-framework-core.md
+++ b/docs/entity-framework-core.md
@@ -1,4 +1,4 @@
-# Entity Framework Core 7.x
+# Entity Framework Core 8.x
 
 * Install `FirebirdSql.EntityFrameworkCore.Firebird` from NuGet.
 * Create your `DbContext`.
diff --git a/include.ps1 b/include.ps1
index 3031b02b..a713a7a9 100644
--- a/include.ps1
+++ b/include.ps1
@@ -4,8 +4,4 @@ function Check-ExitCode() {
 		echo "Non-zero ($exitCode) exit code. Exiting..."
 		exit $exitCode
 	}
-}
-
-function Get-UsedTargetFramework() {
-	return 'net7.0'
 }
\ No newline at end of file
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 610fbe8f..e01e0d79 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -1,11 +1,10 @@
 <Project>
+	<Import Project="Versions.props" />
 	<PropertyGroup>
 		<LangVersion>latest</LangVersion>
 		<DebugType>portable</DebugType>
 	</PropertyGroup>
 	<PropertyGroup>
-		<VersionPrefix>10.0.0</VersionPrefix>
-		<VersionSuffix></VersionSuffix>
 		<Company>FirebirdSQL</Company>
 		<Product>NETProvider</Product>
 		<Authors>FirebirdSQL</Authors>
@@ -20,6 +19,9 @@
 		<SymbolPackageFormat>snupkg</SymbolPackageFormat>
 		<PackageLicenseFile>license.txt</PackageLicenseFile>
 	</PropertyGroup>
+	<PropertyGroup>
+		<CopyrightEndYear>2024</CopyrightEndYear>
+	</PropertyGroup>
 
 	<!-- SourceLink -->
 	<PropertyGroup Condition="'$(SkipSourceLink)'!='true'">
@@ -27,7 +29,7 @@
 		<EmbedUntrackedSources>true</EmbedUntrackedSources>
 	</PropertyGroup>
 	<ItemGroup Condition="'$(SkipSourceLink)'!='true'">
-		<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1">
+		<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0">
 			<PrivateAssets>all</PrivateAssets>
 			<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
 		</PackageReference>
diff --git a/src/EntityFramework.Firebird.Tests/EntityFramework.Firebird.Tests.csproj b/src/EntityFramework.Firebird.Tests/EntityFramework.Firebird.Tests.csproj
index 1e04b33f..c3eb7d65 100644
--- a/src/EntityFramework.Firebird.Tests/EntityFramework.Firebird.Tests.csproj
+++ b/src/EntityFramework.Firebird.Tests/EntityFramework.Firebird.Tests.csproj
@@ -1,7 +1,6 @@
 ﻿<Project Sdk="Microsoft.NET.Sdk">
 	<PropertyGroup>
-		<!-- Figure out a way to run it on net4.8 (FirebirdSql.Data.TestsBase uses IAsyncDisposable) -->
-		<TargetFramework>net7.0</TargetFramework>
+		<TargetFramework>net9.0</TargetFramework>
 		<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
 		<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
 		<SkipSourceLink>true</SkipSourceLink>
@@ -12,17 +11,22 @@
 		<OutputType>Exe</OutputType>
 		<StartupObject>FirebirdSql.Data.TestsBase.Program</StartupObject>
 	</PropertyGroup>
-	<ItemGroup Condition="'$(TargetFramework)'=='net7.0'">
+	<ItemGroup>
+		<Using Include="NUnit.Framework.Legacy.ClassicAssert" Alias="Assert" />
+		<Using Include="NUnit.Framework.Legacy.CollectionAssert" Alias="CollectionAssert" />
+		<Using Include="NUnit.Framework.Legacy.StringAssert" Alias="StringAssert" />
+	</ItemGroup>
+	<ItemGroup Condition="'$(TargetFramework)'=='net9.0'">
+		<!-- left in repo as an example/documentation for .NET Framework -->
 		<None Remove="app.config" />
 	</ItemGroup>
 	<ItemGroup>
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
-		<PackageReference Include="NUnit" Version="3.13.3" />
-		<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
-		<PackageReference Include="NUnitLite" Version="3.13.3" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+		<PackageReference Include="NUnit" Version="4.2.2" />
+		<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
+		<PackageReference Include="NUnitLite" Version="4.2.2" />
 	</ItemGroup>
 	<ItemGroup>
-		<ProjectReference Include="..\FirebirdSql.Data.FirebirdClient\FirebirdSql.Data.FirebirdClient.csproj" />
 		<ProjectReference Include="..\EntityFramework.Firebird\EntityFramework.Firebird.csproj" />
 	</ItemGroup>
 	<ItemGroup>
diff --git a/src/EntityFramework.Firebird.Tests/EntityFrameworkTestsBase.cs b/src/EntityFramework.Firebird.Tests/EntityFrameworkTestsBase.cs
index cc8936ad..d54eaafa 100644
--- a/src/EntityFramework.Firebird.Tests/EntityFrameworkTestsBase.cs
+++ b/src/EntityFramework.Firebird.Tests/EntityFrameworkTestsBase.cs
@@ -28,6 +28,7 @@ public abstract class EntityFrameworkTestsBase : FbTestsBase
 	static EntityFrameworkTestsBase()
 	{
 #if !NETFRAMEWORK
+		// example/documentation for .NET Framework
 		System.Data.Common.DbProviderFactories.RegisterFactory(FbProviderServices.ProviderInvariantName, FirebirdClientFactory.Instance);
 #endif
 		DbConfiguration.SetConfiguration(new FbTestDbContext.Conf());
diff --git a/src/EntityFramework.Firebird/EntityFramework.Firebird.csproj b/src/EntityFramework.Firebird/EntityFramework.Firebird.csproj
index a2bb4236..7a028340 100644
--- a/src/EntityFramework.Firebird/EntityFramework.Firebird.csproj
+++ b/src/EntityFramework.Firebird/EntityFramework.Firebird.csproj
@@ -9,14 +9,15 @@
 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
 	</PropertyGroup>
 	<PropertyGroup>
+		<Version>$(EF6ProviderVersion)</Version>
 		<AssemblyTitle>NETProvider - Entity Framework Provider</AssemblyTitle>
-		<Copyright>(c) 2014-2023</Copyright>
+		<Copyright>(c) 2014-$(CopyrightEndYear)</Copyright>
 	</PropertyGroup>
 	<PropertyGroup>
 		<PackageId>EntityFramework.Firebird</PackageId>
 		<Title>Firebird Entity Framework Provider</Title>
 		<PackageDescription>The Entity Framework provider for Firebird enables you to develop .NET applications that connect to the Firebird database using Entity Framework.</PackageDescription>
-		<PackageTags>firebird;firebirsql;firebirdclient;entityframewor;adonet;database</PackageTags>
+		<PackageTags>firebird firebirsql firebirdclient entityframewor adonet database</PackageTags>
 	</PropertyGroup>
 	<PropertyGroup Condition="'$(Configuration)'=='Release'">
 		<DefineConstants>EF6;TRACE</DefineConstants>
@@ -45,7 +46,7 @@
 		<None Include="..\..\firebird-logo.png" Pack="true" PackagePath="" />
 	</ItemGroup>
 	<ItemGroup>
-		<PackageReference Include="EntityFramework" Version="6.4.4" />
+		<PackageReference Include="EntityFramework" Version="$(EF6ReferencePackageVersion)" />
 	</ItemGroup>
 	<ItemGroup Condition="'$(TargetFramework)'=='net48'">
 		<Reference Include="System.Configuration" />
@@ -53,7 +54,10 @@
 	</ItemGroup>
 	<ItemGroup Condition="'$(TargetFramework)'=='netstandard2.1'">
 	</ItemGroup>
-	<ItemGroup>
+	<ItemGroup Condition="'$(Configuration)'!='Debug'">
+		<PackageReference Include="FirebirdSql.Data.FirebirdClient" Version="$(EF6ReferenceProviderVersion)" />
+	</ItemGroup>
+	<ItemGroup Condition="'$(Configuration)'=='Debug'">
 		<ProjectReference Include="..\FirebirdSql.Data.FirebirdClient\FirebirdSql.Data.FirebirdClient.csproj" />
 	</ItemGroup>
 </Project>
diff --git a/src/FirebirdSql.Data.FirebirdClient.Tests/BlobStreamTests.cs b/src/FirebirdSql.Data.FirebirdClient.Tests/BlobStreamTests.cs
new file mode 100644
index 00000000..6631ff77
--- /dev/null
+++ b/src/FirebirdSql.Data.FirebirdClient.Tests/BlobStreamTests.cs
@@ -0,0 +1,86 @@
+﻿using System.IO;
+using System.Security.Cryptography;
+using System.Threading.Tasks;
+using FirebirdSql.Data.TestsBase;
+using NUnit.Framework;
+
+namespace FirebirdSql.Data.FirebirdClient.Tests;
+
+[TestFixtureSource(typeof(FbServerTypeTestFixtureSource), nameof(FbServerTypeTestFixtureSource.Default))]
+[TestFixtureSource(typeof(FbServerTypeTestFixtureSource), nameof(FbServerTypeTestFixtureSource.Embedded))]
+public class BlobStreamTests : FbTestsBase
+{
+	public BlobStreamTests(FbServerType serverType, bool compression, FbWireCrypt wireCrypt)
+		: base(serverType, compression, wireCrypt)
+	{ }
+
+	[Test]
+	public async Task FbBlobStreamReadTest()
+	{
+		var id_value = RandomNumberGenerator.GetInt32(int.MinValue, int.MaxValue);
+		var insert_values = RandomNumberGenerator.GetBytes(100000 * 4);
+
+		await using (var transaction = await Connection.BeginTransactionAsync())
+		{
+			await using (var insert = new FbCommand("INSERT INTO TEST (int_field, blob_field) values(@int_field, @blob_field)", Connection, transaction))
+			{
+				insert.Parameters.Add("@int_field", FbDbType.Integer).Value = id_value;
+				insert.Parameters.Add("@blob_field", FbDbType.Binary).Value = insert_values;
+				await insert.ExecuteNonQueryAsync();
+			}
+			await transaction.CommitAsync();
+		}
+
+		await using (var select = new FbCommand($"SELECT blob_field FROM TEST WHERE int_field = {id_value}", Connection))
+		{
+			await using var reader = await select.ExecuteReaderAsync();
+			while (await reader.ReadAsync())
+			{
+				await using var output = new MemoryStream();
+				await using (var stream = reader.GetStream(0))
+				{
+					await stream.CopyToAsync(output);
+				}
+
+				var select_values = output.ToArray();
+				CollectionAssert.AreEqual(insert_values, select_values);
+			}
+		}
+	}
+
+	[Test]
+	public async Task FbBlobStreamWriteTest()
+	{
+		var id_value = RandomNumberGenerator.GetInt32(int.MinValue, int.MaxValue);
+		var insert_values = RandomNumberGenerator.GetBytes(100000 * 4);
+
+		await using (var transaction = await Connection.BeginTransactionAsync())
+		{
+			await using (var insert = new FbCommand("INSERT INTO TEST (int_field, blob_field) values(@int_field, @blob_field)", Connection, transaction))
+			{
+				insert.Parameters.Add("@int_field", FbDbType.Integer).Value = id_value;
+				insert.Parameters.Add("@blob_field", FbDbType.Binary).Value = insert_values;
+				await insert.ExecuteNonQueryAsync();
+			}
+
+			await using (var select = new FbCommand($"SELECT blob_field FROM TEST WHERE int_field = {id_value}", Connection, transaction))
+			{
+				await using var reader = await select.ExecuteReaderAsync();
+				while (await reader.ReadAsync())
+				{
+					await using var stream = reader.GetStream(0);
+					await stream.WriteAsync(insert_values);
+
+					break;
+				}
+			}
+			await transaction.CommitAsync();
+		}
+
+		await using (var select = new FbCommand($"SELECT blob_field FROM TEST WHERE int_field = {id_value}", Connection))
+		{
+			var select_values = (byte[])await select.ExecuteScalarAsync();
+			CollectionAssert.AreEqual(insert_values, select_values);
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/FirebirdSql.Data.FirebirdClient.Tests/FbBlobTests.cs b/src/FirebirdSql.Data.FirebirdClient.Tests/FbBlobTests.cs
index 61537d06..d81d3a3e 100644
--- a/src/FirebirdSql.Data.FirebirdClient.Tests/FbBlobTests.cs
+++ b/src/FirebirdSql.Data.FirebirdClient.Tests/FbBlobTests.cs
@@ -44,6 +44,7 @@ public async Task BinaryBlobTest()
 				insert.Parameters.Add("@blob_field", FbDbType.Binary).Value = insert_values;
 				await insert.ExecuteNonQueryAsync();
 			}
+
 			await transaction.CommitAsync();
 		}
 
diff --git a/src/FirebirdSql.Data.FirebirdClient.Tests/FbCommandTests.cs b/src/FirebirdSql.Data.FirebirdClient.Tests/FbCommandTests.cs
index c5bf8f0a..44ba7c15 100644
--- a/src/FirebirdSql.Data.FirebirdClient.Tests/FbCommandTests.cs
+++ b/src/FirebirdSql.Data.FirebirdClient.Tests/FbCommandTests.cs
@@ -187,6 +187,22 @@ public async Task NamedParametersReuseTest()
 		}
 	}
 
+	[Test]
+	public async Task NamedParametersPublicAccessor()
+	{
+		await using (var command = new FbCommand("select * from test where int_field >= @x1 and int_field <= @x2", Connection))
+		{
+			Assert.IsNotNull(command.NamedParameters, "Unexpected null reference.");
+			Assert.IsTrue(command.NamedParameters.Count == 0, "Expected count 0 of named parameters before command prepare.");
+
+			await command.PrepareAsync();
+
+			Assert.IsTrue(command.NamedParameters.Count == 2, "Expected count 2 of named parameters after command prepare.");
+			Assert.AreEqual(command.NamedParameters[0], "@x1");
+			Assert.AreEqual(command.NamedParameters[1], "@x2");
+		}
+	}
+
 	[Test]
 	public async Task ExecuteStoredProcTest()
 	{
@@ -631,7 +647,7 @@ public async Task GetCommandExplainedPlanNoPlanTest()
 	}
 
 	[Test]
-	public async Task ReadsTimeWithProperPrecision()
+	public async Task ReadsTimeWithProperPrecisionTest()
 	{
 		await using (var cmd = Connection.CreateCommand())
 		{
@@ -642,7 +658,7 @@ public async Task ReadsTimeWithProperPrecision()
 	}
 
 	[Test]
-	public async Task PassesTimeSpanWithProperPrecision()
+	public async Task PassesTimeSpanWithProperPrecisionTest()
 	{
 		var ts = TimeSpan.FromTicks(14321000);
 		await using (var cmd = Connection.CreateCommand())
@@ -655,7 +671,7 @@ public async Task PassesTimeSpanWithProperPrecision()
 	}
 
 	[Test]
-	public async Task ReadsDateTimeWithProperPrecision()
+	public async Task ReadsDateTimeWithProperPrecisionTest()
 	{
 		await using (var cmd = Connection.CreateCommand())
 		{
@@ -666,7 +682,7 @@ public async Task ReadsDateTimeWithProperPrecision()
 	}
 
 	[Test]
-	public async Task PassesDateTimeWithProperPrecision()
+	public async Task PassesDateTimeWithProperPrecisionTest()
 	{
 		var dt = new DateTime(635583639614321000);
 		await using (var cmd = Connection.CreateCommand())
@@ -679,7 +695,41 @@ public async Task PassesDateTimeWithProperPrecision()
 	}
 
 	[Test]
-	public async Task ExecuteNonQueryReturnsMinusOneOnNonInsertUpdateDelete()
+	public async Task HighLowSurrogatePassingTest()
+	{
+		await using (var cmd = Connection.CreateCommand())
+		{
+			const string Value = "😊!";
+			cmd.CommandText = "select cast(@value1 as varchar(2) character set utf8), cast(@value2 as char(2) character set utf8) from rdb$database";
+			cmd.Parameters.Add("value1", Value);
+			cmd.Parameters.Add("value2", Value);
+			await using (var reader = await cmd.ExecuteReaderAsync())
+			{
+				await reader.ReadAsync();
+				Assert.AreEqual(Value, reader[0]);
+				Assert.AreEqual(Value, reader[1]);
+			}
+		}
+	}
+
+	[Test]
+	public async Task HighLowSurrogateReadingTest()
+	{
+		await using (var cmd = Connection.CreateCommand())
+		{
+			const string Value = "😊!";
+			cmd.CommandText = "select cast(x'F09F988A21' as varchar(2) character set utf8), cast(x'F09F988A21' as char(2) character set utf8) from rdb$database";
+			await using (var reader = await cmd.ExecuteReaderAsync())
+			{
+				await reader.ReadAsync();
+				Assert.AreEqual(Value, reader[0]);
+				Assert.AreEqual(Value, reader[1]);
+			}
+		}
+	}
+
+	[Test]
+	public async Task ExecuteNonQueryReturnsMinusOneOnNonInsertUpdateDeleteTest()
 	{
 		await using (var cmd = Connection.CreateCommand())
 		{
diff --git a/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs b/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs
index 1aa2e50e..c87c804b 100644
--- a/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs
+++ b/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs
@@ -313,7 +313,7 @@ public async Task ReadBinaryTest()
 			{
 				bytes[i] = (byte)random.Next(byte.MinValue, byte.MaxValue);
 			}
-			var binaryString = $"x'{BitConverter.ToString(bytes).Replace("-", string.Empty)}'";
+			var binaryString = $"x'{Convert.ToHexString(bytes)}'";
 
 			await using (var command = new FbCommand($"select {binaryString} from TEST", Connection, transaction))
 			{
diff --git a/src/FirebirdSql.Data.FirebirdClient.Tests/FbServicesTests.cs b/src/FirebirdSql.Data.FirebirdClient.Tests/FbServicesTests.cs
index 96f38823..d667f2c4 100644
--- a/src/FirebirdSql.Data.FirebirdClient.Tests/FbServicesTests.cs
+++ b/src/FirebirdSql.Data.FirebirdClient.Tests/FbServicesTests.cs
@@ -60,6 +60,49 @@ public async Task BackupRestoreTest()
 		await Connection.CloseAsync();
 	}
 
+	[Test]
+	public async Task BackupRestoreZipTest()
+	{
+		if (!EnsureServerVersionAtLeast(new Version(4, 0, 0, 0)))
+			return;
+
+		var backupName = $"{Guid.NewGuid()}.bak";
+		var csb = BuildServicesConnectionStringBuilder(ServerType, Compression, WireCrypt, true);
+		var connectionString = csb.ToString();
+		await BackupPartHelper(backupName, connectionString, x =>
+		{
+			x.Options |= FbBackupFlags.Zip;
+		});
+		await RestorePartHelper(backupName, connectionString);
+		// test the database was actually restored fine
+		await Connection.OpenAsync();
+		await Connection.CloseAsync();
+	}
+
+	[Test]
+	public async Task BackupRestoreVerbIntTest()
+	{
+		if (!EnsureServerVersionAtLeast(new Version(3, 0, 0, 0)))
+			return;
+
+		var backupName = $"{Guid.NewGuid()}.bak";
+		var csb = BuildServicesConnectionStringBuilder(ServerType, Compression, WireCrypt, true);
+		var connectionString = csb.ToString();
+		await BackupPartHelper(backupName, connectionString, x =>
+		{
+			x.Verbose = false;
+			x.VerboseInterval = 1_000_000;
+		});
+		await RestorePartHelper(backupName, connectionString, x =>
+		{
+			x.Verbose = false;
+			x.VerboseInterval = 1_000_000;
+		});
+		// test the database was actually restored fine
+		await Connection.OpenAsync();
+		await Connection.CloseAsync();
+	}
+
 	[Test]
 	public async Task BackupRestoreParallelTest()
 	{
@@ -453,7 +496,7 @@ public async Task NFixupTest()
 		Assert.DoesNotThrowAsync(() => Connection.OpenAsync());
 	}
 
-	static Task BackupPartHelper(string backupName, string connectionString)
+	static Task BackupPartHelper(string backupName, string connectionString, Action<FbBackup> configure = null)
 	{
 		var backupSvc = new FbBackup();
 		backupSvc.ConnectionString = connectionString;
@@ -462,9 +505,10 @@ static Task BackupPartHelper(string backupName, string connectionString)
 		backupSvc.Verbose = true;
 		backupSvc.Statistics = FbBackupRestoreStatistics.TotalTime | FbBackupRestoreStatistics.TimeDelta;
 		backupSvc.ServiceOutput += ServiceOutput;
+		configure?.Invoke(backupSvc);
 		return backupSvc.ExecuteAsync();
 	}
-	static Task RestorePartHelper(string backupName, string connectionString)
+	static Task RestorePartHelper(string backupName, string connectionString, Action<FbRestore> configure = null)
 	{
 		var restoreSvc = new FbRestore();
 		restoreSvc.ConnectionString = connectionString;
@@ -474,6 +518,7 @@ static Task RestorePartHelper(string backupName, string connectionString)
 		restoreSvc.Statistics = FbBackupRestoreStatistics.TotalTime | FbBackupRestoreStatistics.TimeDelta;
 		restoreSvc.BackupFiles.Add(new FbBackupFile(backupName, 2048));
 		restoreSvc.ServiceOutput += ServiceOutput;
+		configure?.Invoke(restoreSvc);
 		return restoreSvc.ExecuteAsync();
 	}
 
diff --git a/src/FirebirdSql.Data.FirebirdClient.Tests/FbZonedDateTimeTypeTests.cs b/src/FirebirdSql.Data.FirebirdClient.Tests/FbZonedDateTimeTypeTests.cs
index ca94f33e..b69dc704 100644
--- a/src/FirebirdSql.Data.FirebirdClient.Tests/FbZonedDateTimeTypeTests.cs
+++ b/src/FirebirdSql.Data.FirebirdClient.Tests/FbZonedDateTimeTypeTests.cs
@@ -47,6 +47,14 @@ public void EqualityFalse(FbZonedDateTime expected, FbZonedDateTime actual)
 		Assert.AreNotEqual(expected, actual);
 	}
 
+	[Test]
+	public void ConvertToDateTimeShouldNotThrow()
+	{
+		var fbZonedDateTime = new FbZonedDateTime(new DateTime(2020, 12, 4, 10, 38, 0, DateTimeKind.Utc), "UTC");
+		
+		Assert.DoesNotThrow(() => Convert.ChangeType(fbZonedDateTime, typeof(DateTime)));
+	}
+
 	public void DateTimeShouldBeUtc()
 	{
 		Assert.Throws<ArgumentException>(() =>
diff --git a/src/FirebirdSql.Data.FirebirdClient.Tests/FbZonedTimeTypeTests.cs b/src/FirebirdSql.Data.FirebirdClient.Tests/FbZonedTimeTypeTests.cs
index c0309b38..959c2a57 100644
--- a/src/FirebirdSql.Data.FirebirdClient.Tests/FbZonedTimeTypeTests.cs
+++ b/src/FirebirdSql.Data.FirebirdClient.Tests/FbZonedTimeTypeTests.cs
@@ -46,4 +46,12 @@ public void EqualityFalse(FbZonedTime expected, FbZonedTime actual)
 	{
 		Assert.AreNotEqual(expected, actual);
 	}
+
+	[Test]
+	public void ConvertToTimeSpanShouldNotThrow()
+	{
+		var fbZonedTime = new FbZonedTime(TimeSpan.FromMinutes(142), "UTC");
+
+		Assert.DoesNotThrow(() => Convert.ChangeType(fbZonedTime, typeof(TimeSpan)));
+	}
 }
diff --git a/src/FirebirdSql.Data.FirebirdClient.Tests/FirebirdSql.Data.FirebirdClient.Tests.csproj b/src/FirebirdSql.Data.FirebirdClient.Tests/FirebirdSql.Data.FirebirdClient.Tests.csproj
index 9ca84ea9..1fe8ead8 100644
--- a/src/FirebirdSql.Data.FirebirdClient.Tests/FirebirdSql.Data.FirebirdClient.Tests.csproj
+++ b/src/FirebirdSql.Data.FirebirdClient.Tests/FirebirdSql.Data.FirebirdClient.Tests.csproj
@@ -1,6 +1,6 @@
 ﻿<Project Sdk="Microsoft.NET.Sdk">
 	<PropertyGroup>
-		<TargetFramework>net7.0</TargetFramework>
+		<TargetFramework>net9.0</TargetFramework>
 		<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
 		<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
 		<SkipSourceLink>true</SkipSourceLink>
@@ -12,10 +12,15 @@
 		<StartupObject>FirebirdSql.Data.TestsBase.Program</StartupObject>
 	</PropertyGroup>
 	<ItemGroup>
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
-		<PackageReference Include="NUnit" Version="3.13.3" />
-		<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
-		<PackageReference Include="NUnitLite" Version="3.13.3" />
+		<Using Include="NUnit.Framework.Legacy.ClassicAssert" Alias="Assert" />
+		<Using Include="NUnit.Framework.Legacy.CollectionAssert" Alias="CollectionAssert" />
+		<Using Include="NUnit.Framework.Legacy.StringAssert" Alias="StringAssert" />
+	</ItemGroup>
+	<ItemGroup>
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+		<PackageReference Include="NUnit" Version="4.2.2" />
+		<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
+		<PackageReference Include="NUnitLite" Version="4.2.2" />
 	</ItemGroup>
 	<ItemGroup>
 		<ProjectReference Include="..\FirebirdSql.Data.FirebirdClient\FirebirdSql.Data.FirebirdClient.csproj" />
diff --git a/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsBlob.cs b/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsBlob.cs
index 0b5fc37e..7d678514 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsBlob.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsBlob.cs
@@ -69,7 +69,7 @@ public GdsBlob(GdsDatabase database, GdsTransaction transaction, long blobId)
 
 	#region Protected Methods
 
-	protected override void Create()
+	public override void Create()
 	{
 		try
 		{
@@ -81,7 +81,7 @@ protected override void Create()
 			throw;
 		}
 	}
-	protected override async ValueTask CreateAsync(CancellationToken cancellationToken = default)
+	public override async ValueTask CreateAsync(CancellationToken cancellationToken = default)
 	{
 		try
 		{
@@ -94,7 +94,7 @@ protected override async ValueTask CreateAsync(CancellationToken cancellationTok
 		}
 	}
 
-	protected override void Open()
+	public override void Open()
 	{
 		try
 		{
@@ -105,7 +105,7 @@ protected override void Open()
 			throw;
 		}
 	}
-	protected override async ValueTask OpenAsync(CancellationToken cancellationToken = default)
+	public override async ValueTask OpenAsync(CancellationToken cancellationToken = default)
 	{
 		try
 		{
@@ -117,7 +117,87 @@ protected override async ValueTask OpenAsync(CancellationToken cancellationToken
 		}
 	}
 
-	protected override void GetSegment(Stream stream)
+	public override int GetLength()
+	{
+		try
+		{
+			if (!IsOpen)
+				Open();
+
+			var bufferLength = 20;
+			var buffer = new byte[bufferLength];
+
+			_database.Xdr.Write(IscCodes.op_info_blob);
+			_database.Xdr.Write(_blobHandle);
+			_database.Xdr.Write(0);
+			_database.Xdr.WriteBuffer(new byte[] { IscCodes.isc_info_blob_total_length }, 1);
+			_database.Xdr.Write(bufferLength);
+
+			_database.Xdr.Flush();
+
+			var response = (GenericResponse)_database.ReadResponse();
+
+			var responseLength = bufferLength;
+
+			if (response.Data.Length < bufferLength)
+			{
+				responseLength = response.Data.Length;
+			}
+
+			Buffer.BlockCopy(response.Data, 0, buffer, 0, responseLength);
+
+			var length = IscHelper.VaxInteger(buffer, 1, 2);
+			var size = IscHelper.VaxInteger(buffer, 3, (int)length);
+
+			return (int)size;
+		}
+		catch (IOException ex)
+		{
+			throw IscException.ForIOException(ex);
+		}
+	}
+
+	public override async ValueTask<int> GetLengthAsync(CancellationToken cancellationToken = default)
+	{
+		try
+		{
+			if (!IsOpen)
+				await OpenAsync(cancellationToken).ConfigureAwait(false);
+
+			var bufferLength = 20;
+			var buffer = new byte[bufferLength];
+
+			await _database.Xdr.WriteAsync(IscCodes.op_info_blob, cancellationToken).ConfigureAwait(false);
+			await _database.Xdr.WriteAsync(_blobHandle, cancellationToken).ConfigureAwait(false);
+			await _database.Xdr.WriteAsync(0, cancellationToken).ConfigureAwait(false);
+			await _database.Xdr.WriteBufferAsync(new byte[] { IscCodes.isc_info_blob_total_length }, 1, cancellationToken).ConfigureAwait(false);
+			await _database.Xdr.WriteAsync(bufferLength, cancellationToken).ConfigureAwait(false);
+
+			await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);
+
+			var response = (GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);
+
+			var responseLength = bufferLength;
+
+			if (response.Data.Length < bufferLength)
+			{
+				responseLength = response.Data.Length;
+			}
+
+			Buffer.BlockCopy(response.Data, 0, buffer, 0, responseLength);
+
+			var length = IscHelper.VaxInteger(buffer, 1, 2);
+			var size = IscHelper.VaxInteger(buffer, 3, (int)length);
+
+			return (int)size;
+		}
+		catch (IOException ex)
+		{
+			throw IscException.ForIOException(ex);
+		}
+	}
+
+	public override void GetSegment(Stream stream)
 	{
 		var requested = SegmentSize;
 
@@ -145,7 +225,7 @@ protected override void GetSegment(Stream stream)
 
 			if (buffer.Length == 0)
 			{
-				// previous	segment	was	last, this has no data
+				// previous segment was last, this has no data
 				return;
 			}
 
@@ -166,7 +246,7 @@ protected override void GetSegment(Stream stream)
 			throw IscException.ForIOException(ex);
 		}
 	}
-	protected override async ValueTask GetSegmentAsync(Stream stream, CancellationToken cancellationToken = default)
+	public override async ValueTask GetSegmentAsync(Stream stream, CancellationToken cancellationToken = default)
 	{
 		var requested = SegmentSize;
 
@@ -194,7 +274,7 @@ protected override async ValueTask GetSegmentAsync(Stream stream, CancellationTo
 
 			if (buffer.Length == 0)
 			{
-				// previous	segment	was	last, this has no data
+				//previous segment was last, this has no data
 				return;
 			}
 
@@ -216,7 +296,120 @@ protected override async ValueTask GetSegmentAsync(Stream stream, CancellationTo
 		}
 	}
 
-	protected override void PutSegment(byte[] buffer)
+	public override byte[] GetSegment()
+	{
+		var requested = SegmentSize;
+
+		try
+		{
+			_database.Xdr.Write(IscCodes.op_get_segment);
+			_database.Xdr.Write(_blobHandle);
+			_database.Xdr.Write(requested < short.MaxValue - 12 ? requested : short.MaxValue - 12);
+			_database.Xdr.Write(DataSegment);
+			_database.Xdr.Flush();
+
+			var response = (GenericResponse)_database.ReadResponse();
+
+			RblRemoveValue(IscCodes.RBL_segment);
+			if (response.ObjectHandle == 1)
+			{
+				RblAddValue(IscCodes.RBL_segment);
+			}
+			else if (response.ObjectHandle == 2)
+			{
+				RblAddValue(IscCodes.RBL_eof_pending);
+			}
+
+			var buffer = response.Data;
+
+			if (buffer.Length == 0)
+			{
+				//previous segment was last, this has no data
+				return Array.Empty<byte>();
+			}
+
+			var posInInput = 0;
+			var posInOutput = 0;
+
+			var tmp = new byte[requested * 2];
+			while (posInInput < buffer.Length)
+			{
+				var len = (int)IscHelper.VaxInteger(buffer, posInInput, 2);
+				posInInput += 2;
+
+				Array.Copy(buffer, posInInput, tmp, posInOutput, len);
+				posInOutput += len;
+				posInInput += len;
+			}
+
+			var actualBuffer = new byte[posInOutput];
+			Array.Copy(tmp, actualBuffer, posInOutput);
+
+			return actualBuffer;
+		}
+		catch (IOException ex)
+		{
+			throw IscException.ForIOException(ex);
+		}
+	}
+	public override async ValueTask<byte[]> GetSegmentAsync(CancellationToken cancellationToken = default)
+	{
+		var requested = SegmentSize;
+
+		try
+		{
+			await _database.Xdr.WriteAsync(IscCodes.op_get_segment, cancellationToken).ConfigureAwait(false);
+			await _database.Xdr.WriteAsync(_blobHandle, cancellationToken).ConfigureAwait(false);
+			await _database.Xdr.WriteAsync(requested < short.MaxValue - 12 ? requested : short.MaxValue - 12, cancellationToken).ConfigureAwait(false);
+			await _database.Xdr.WriteAsync(DataSegment, cancellationToken).ConfigureAwait(false);
+			await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);
+
+			var response = (GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);
+
+			RblRemoveValue(IscCodes.RBL_segment);
+			if (response.ObjectHandle == 1)
+			{
+				RblAddValue(IscCodes.RBL_segment);
+			}
+			else if (response.ObjectHandle == 2)
+			{
+				RblAddValue(IscCodes.RBL_eof_pending);
+			}
+
+			var buffer = response.Data;
+
+			if (buffer.Length == 0)
+			{
+				// previous segment was last, this has no data
+				return Array.Empty<byte>();
+			}
+
+			var posInInput = 0;
+			var posInOutput = 0;
+
+			var tmp = new byte[requested * 2];
+			while (posInInput < buffer.Length)
+			{
+				var len = (int)IscHelper.VaxInteger(buffer, posInInput, 2);
+				posInInput += 2;
+
+				Array.Copy(buffer, posInInput, tmp, posInOutput, len);
+				posInOutput += len;
+				posInInput += len;
+			}
+
+			var actualBuffer = new byte[posInOutput];
+			Array.Copy(tmp, actualBuffer, posInOutput);
+
+			return actualBuffer;
+		}
+		catch (IOException ex)
+		{
+			throw IscException.ForIOException(ex);
+		}
+	}
+
+	public override void PutSegment(byte[] buffer)
 	{
 		try
 		{
@@ -232,7 +425,7 @@ protected override void PutSegment(byte[] buffer)
 			throw IscException.ForIOException(ex);
 		}
 	}
-	protected override async ValueTask PutSegmentAsync(byte[] buffer, CancellationToken cancellationToken = default)
+	public override async ValueTask PutSegmentAsync(byte[] buffer, CancellationToken cancellationToken = default)
 	{
 		try
 		{
@@ -249,14 +442,14 @@ protected override async ValueTask PutSegmentAsync(byte[] buffer, CancellationTo
 		}
 	}
 
-	protected override void Seek(int position)
+	public override void Seek(int offset, int seekMode)
 	{
 		try
 		{
 			_database.Xdr.Write(IscCodes.op_seek_blob);
 			_database.Xdr.Write(_blobHandle);
-			_database.Xdr.Write(SeekMode);
-			_database.Xdr.Write(position);
+			_database.Xdr.Write(seekMode);
+			_database.Xdr.Write(offset);
 			_database.Xdr.Flush();
 
 			var response = (GenericResponse)_database.ReadResponse();
@@ -268,14 +461,14 @@ protected override void Seek(int position)
 			throw IscException.ForIOException(ex);
 		}
 	}
-	protected override async ValueTask SeekAsync(int position, CancellationToken cancellationToken = default)
+	public override async ValueTask SeekAsync(int offset, int seekMode, CancellationToken cancellationToken = default)
 	{
 		try
 		{
 			await _database.Xdr.WriteAsync(IscCodes.op_seek_blob, cancellationToken).ConfigureAwait(false);
 			await _database.Xdr.WriteAsync(_blobHandle, cancellationToken).ConfigureAwait(false);
-			await _database.Xdr.WriteAsync(SeekMode, cancellationToken).ConfigureAwait(false);
-			await _database.Xdr.WriteAsync(position, cancellationToken).ConfigureAwait(false);
+			await _database.Xdr.WriteAsync(seekMode, cancellationToken).ConfigureAwait(false);
+			await _database.Xdr.WriteAsync(offset, cancellationToken).ConfigureAwait(false);
 			await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);
 
 			var response = (GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);
@@ -288,20 +481,20 @@ protected override async ValueTask SeekAsync(int position, CancellationToken can
 		}
 	}
 
-	protected override void Close()
+	public override void Close()
 	{
 		_database.ReleaseObject(IscCodes.op_close_blob, _blobHandle);
 	}
-	protected override ValueTask CloseAsync(CancellationToken cancellationToken = default)
+	public override ValueTask CloseAsync(CancellationToken cancellationToken = default)
 	{
 		return _database.ReleaseObjectAsync(IscCodes.op_close_blob, _blobHandle, cancellationToken);
 	}
 
-	protected override void Cancel()
+	public override void Cancel()
 	{
 		_database.ReleaseObject(IscCodes.op_cancel_blob, _blobHandle);
 	}
-	protected override ValueTask CancelAsync(CancellationToken cancellationToken = default)
+	public override ValueTask CancelAsync(CancellationToken cancellationToken = default)
 	{
 		return _database.ReleaseObjectAsync(IscCodes.op_cancel_blob, _blobHandle, cancellationToken);
 	}
@@ -327,6 +520,7 @@ private void CreateOrOpen(int op, BlobParameterBuffer bpb)
 
 			_blobId = response.BlobId;
 			_blobHandle = response.ObjectHandle;
+			_isOpen = true;
 		}
 		catch (IOException ex)
 		{
@@ -350,6 +544,7 @@ private async ValueTask CreateOrOpenAsync(int op, BlobParameterBuffer bpb, Cance
 
 			_blobId = response.BlobId;
 			_blobHandle = response.ObjectHandle;
+			_isOpen = true;
 		}
 		catch (IOException ex)
 		{
diff --git a/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsStatement.cs b/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsStatement.cs
index f920c270..f6d33d15 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsStatement.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsStatement.cs
@@ -19,6 +19,7 @@
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.IO;
+using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 using FirebirdSql.Data.Common;
@@ -1246,7 +1247,7 @@ protected void WriteRawParameter(IXdrWriter xdr, DbField field)
 					else
 					{
 						var svalue = field.DbValue.GetString();
-						if ((field.Length % field.Charset.BytesPerCharacter) == 0 && svalue.Length > field.CharCount)
+						if ((field.Length % field.Charset.BytesPerCharacter) == 0 && svalue.EnumerateRunesEx().Count() > field.CharCount)
 						{
 							throw IscException.ForErrorCodes(new[] { IscCodes.isc_arith_except, IscCodes.isc_string_truncation });
 						}
@@ -1271,7 +1272,7 @@ protected void WriteRawParameter(IXdrWriter xdr, DbField field)
 					else
 					{
 						var svalue = field.DbValue.GetString();
-						if ((field.Length % field.Charset.BytesPerCharacter) == 0 && svalue.Length > field.CharCount)
+						if ((field.Length % field.Charset.BytesPerCharacter) == 0 && svalue.EnumerateRunesEx().Count() > field.CharCount)
 						{
 							throw IscException.ForErrorCodes(new[] { IscCodes.isc_arith_except, IscCodes.isc_string_truncation });
 						}
@@ -1394,7 +1395,7 @@ protected async ValueTask WriteRawParameterAsync(IXdrWriter xdr, DbField field,
 					else
 					{
 						var svalue = await field.DbValue.GetStringAsync(cancellationToken).ConfigureAwait(false);
-						if ((field.Length % field.Charset.BytesPerCharacter) == 0 && svalue.Length > field.CharCount)
+						if ((field.Length % field.Charset.BytesPerCharacter) == 0 && svalue.EnumerateRunesEx().Count() > field.CharCount)
 						{
 							throw IscException.ForErrorCodes(new[] { IscCodes.isc_arith_except, IscCodes.isc_string_truncation });
 						}
@@ -1419,7 +1420,7 @@ protected async ValueTask WriteRawParameterAsync(IXdrWriter xdr, DbField field,
 					else
 					{
 						var svalue = await field.DbValue.GetStringAsync(cancellationToken).ConfigureAwait(false);
-						if ((field.Length % field.Charset.BytesPerCharacter) == 0 && svalue.Length > field.CharCount)
+						if ((field.Length % field.Charset.BytesPerCharacter) == 0 && svalue.EnumerateRunesEx().Count() > field.CharCount)
 						{
 							throw IscException.ForErrorCodes(new[] { IscCodes.isc_arith_except, IscCodes.isc_string_truncation });
 						}
@@ -1532,10 +1533,11 @@ protected object ReadRawValue(IXdrReader xdr, DbField field)
 				else
 				{
 					var s = xdr.ReadString(innerCharset, field.Length);
+					var runes = s.EnumerateRunesEx().ToList();
 					if ((field.Length % field.Charset.BytesPerCharacter) == 0 &&
-						s.Length > field.CharCount)
+						runes.Count > field.CharCount)
 					{
-						return s.Substring(0, field.CharCount);
+						return new string([.. runes.Take(field.CharCount).SelectMany(x => x)]);
 					}
 					else
 					{
@@ -1629,10 +1631,11 @@ protected async ValueTask<object> ReadRawValueAsync(IXdrReader xdr, DbField fiel
 				else
 				{
 					var s = await xdr.ReadStringAsync(innerCharset, field.Length, cancellationToken).ConfigureAwait(false);
+					var runes = s.EnumerateRunesEx().ToList();
 					if ((field.Length % field.Charset.BytesPerCharacter) == 0 &&
-						s.Length > field.CharCount)
+						runes.Count > field.CharCount)
 					{
-						return s.Substring(0, field.CharCount);
+						return new string([.. runes.Take(field.CharCount).SelectMany(x => x)]);
 					}
 					else
 					{
diff --git a/src/FirebirdSql.Data.FirebirdClient/Client/Native/FbClientFactory.cs b/src/FirebirdSql.Data.FirebirdClient/Client/Native/FbClientFactory.cs
index 98bc44bd..c816d19a 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Client/Native/FbClientFactory.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Client/Native/FbClientFactory.cs
@@ -83,7 +83,7 @@ public static IFbClient Create(string dllName)
 				{
 					result = BuildFbClient(dllName);
 					cache.Add(dllName, result);
-					ShutdownHelper.RegisterFbClientShutdown(() => NativeHelpers.CallIfExists(() => result.fb_shutdown(0, 0)));
+					ShutdownHelper.RegisterFbClientShutdown(() => NativeHelpers.CallIfExists(nameof(IFbClient.fb_shutdown), () => result.fb_shutdown(0, 0)));
 					return result;
 				}
 				finally
diff --git a/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesBlob.cs b/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesBlob.cs
index 6ca97a51..b363b5b3 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesBlob.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesBlob.cs
@@ -70,7 +70,7 @@ public FesBlob(FesDatabase database, FesTransaction transaction, long blobId)
 
 	#region Protected Methods
 
-	protected override void Create()
+	public override void Create()
 	{
 		ClearStatusVector();
 
@@ -88,9 +88,11 @@ protected override void Create()
 
 		_database.ProcessStatusVector(_statusVector);
 
+		_isOpen = true;
+
 		RblAddValue(IscCodes.RBL_create);
 	}
-	protected override ValueTask CreateAsync(CancellationToken cancellationToken = default)
+	public override ValueTask CreateAsync(CancellationToken cancellationToken = default)
 	{
 		ClearStatusVector();
 
@@ -108,12 +110,14 @@ protected override ValueTask CreateAsync(CancellationToken cancellationToken = d
 
 		_database.ProcessStatusVector(_statusVector);
 
+		_isOpen = true;
+
 		RblAddValue(IscCodes.RBL_create);
 
 		return ValueTask2.CompletedTask;
 	}
 
-	protected override void Open()
+	public override void Open()
 	{
 		ClearStatusVector();
 
@@ -130,8 +134,10 @@ protected override void Open()
 			new byte[0]);
 
 		_database.ProcessStatusVector(_statusVector);
+
+		_isOpen = true;
 	}
-	protected override ValueTask OpenAsync(CancellationToken cancellationToken = default)
+	public override ValueTask OpenAsync(CancellationToken cancellationToken = default)
 	{
 		ClearStatusVector();
 
@@ -149,10 +155,56 @@ protected override ValueTask OpenAsync(CancellationToken cancellationToken = def
 
 		_database.ProcessStatusVector(_statusVector);
 
+		_isOpen = true;
+
 		return ValueTask2.CompletedTask;
 	}
 
-	protected override void GetSegment(Stream stream)
+	public override int GetLength()
+	{
+		ClearStatusVector();
+
+		var buffer = new byte[20];
+
+		_database.FbClient.isc_blob_info(
+			_statusVector,
+			ref _blobHandle,
+			1,
+			new byte[] { IscCodes.isc_info_blob_total_length },
+			(short)buffer.Length,
+			buffer);
+
+		_database.ProcessStatusVector(_statusVector);
+
+		var length = IscHelper.VaxInteger(buffer, 1, 2);
+		var size = IscHelper.VaxInteger(buffer, 3, (int)length);
+
+		return (int)size;
+	}
+
+	public override ValueTask<int> GetLengthAsync(CancellationToken cancellationToken = default)
+	{
+		ClearStatusVector();
+
+		var buffer = new byte[20];
+
+		_database.FbClient.isc_blob_info(
+			_statusVector,
+			ref _blobHandle,
+			1,
+			new byte[] { IscCodes.isc_info_blob_total_length },
+			(short)buffer.Length,
+			buffer);
+
+		_database.ProcessStatusVector(_statusVector);
+
+		var length = IscHelper.VaxInteger(buffer, 1, 2);
+		var size = IscHelper.VaxInteger(buffer, 3, (int)length);
+
+		return ValueTask2.FromResult((int)size);
+	}
+
+	public override void GetSegment(Stream stream)
 	{
 		var requested = (short)SegmentSize;
 		short segmentLength = 0;
@@ -168,7 +220,6 @@ protected override void GetSegment(Stream stream)
 			requested,
 			tmp);
 
-
 		RblRemoveValue(IscCodes.RBL_segment);
 
 		if (_statusVector[1] == new IntPtr(IscCodes.isc_segstr_eof))
@@ -190,7 +241,7 @@ protected override void GetSegment(Stream stream)
 
 		stream.Write(tmp, 0, segmentLength);
 	}
-	protected override ValueTask GetSegmentAsync(Stream stream, CancellationToken cancellationToken = default)
+	public override ValueTask GetSegmentAsync(Stream stream, CancellationToken cancellationToken = default)
 	{
 		var requested = (short)SegmentSize;
 		short segmentLength = 0;
@@ -231,7 +282,98 @@ protected override ValueTask GetSegmentAsync(Stream stream, CancellationToken ca
 		return ValueTask2.CompletedTask;
 	}
 
-	protected override void PutSegment(byte[] buffer)
+	public override byte[] GetSegment()
+	{
+		var requested = (short)(SegmentSize - 2);
+		short segmentLength = 0;
+
+		ClearStatusVector();
+
+		var tmp = new byte[requested];
+
+		var status = _database.FbClient.isc_get_segment(
+			_statusVector,
+			ref _blobHandle,
+			ref segmentLength,
+			requested,
+			tmp);
+
+
+		RblRemoveValue(IscCodes.RBL_segment);
+
+		if (_statusVector[1] == new IntPtr(IscCodes.isc_segstr_eof))
+		{
+			RblAddValue(IscCodes.RBL_eof_pending);
+			return Array.Empty<byte>();
+		}
+
+		if (status == IntPtr.Zero || _statusVector[1] == new IntPtr(IscCodes.isc_segment))
+		{
+			RblAddValue(IscCodes.RBL_segment);
+		}
+		else
+		{
+			_database.ProcessStatusVector(_statusVector);
+		}
+
+		var actualSegment = tmp;
+		if (actualSegment.Length != segmentLength)
+		{
+			tmp = new byte[segmentLength];
+			Array.Copy(actualSegment, tmp, segmentLength);
+			actualSegment = tmp;
+		}
+
+		return actualSegment;
+	}
+	public override ValueTask<byte[]> GetSegmentAsync(CancellationToken cancellationToken = default)
+	{
+		var requested = (short)SegmentSize;
+		short segmentLength = 0;
+
+		ClearStatusVector();
+
+		var tmp = new byte[requested];
+
+		var status = _database.FbClient.isc_get_segment(
+			_statusVector,
+			ref _blobHandle,
+			ref segmentLength,
+			requested,
+			tmp);
+
+
+		RblRemoveValue(IscCodes.RBL_segment);
+
+		if (_statusVector[1] == new IntPtr(IscCodes.isc_segstr_eof))
+		{
+			RblAddValue(IscCodes.RBL_eof_pending);
+			return ValueTask2.FromResult(Array.Empty<byte>());
+		}
+		else
+		{
+			if (status == IntPtr.Zero || _statusVector[1] == new IntPtr(IscCodes.isc_segment))
+			{
+				RblAddValue(IscCodes.RBL_segment);
+			}
+			else
+			{
+				_database.ProcessStatusVector(_statusVector);
+			}
+		}
+
+		var actualSegment = tmp;
+		if (actualSegment.Length != segmentLength)
+		{
+			tmp = new byte[segmentLength];
+			Array.Copy(actualSegment, tmp, segmentLength);
+			actualSegment = tmp;
+		}
+
+		return ValueTask2.FromResult(actualSegment);
+	}
+
+	public override void PutSegment(byte[] buffer)
 	{
 		ClearStatusVector();
 
@@ -243,7 +385,7 @@ protected override void PutSegment(byte[] buffer)
 
 		_database.ProcessStatusVector(_statusVector);
 	}
-	protected override ValueTask PutSegmentAsync(byte[] buffer, CancellationToken cancellationToken = default)
+	public override ValueTask PutSegmentAsync(byte[] buffer, CancellationToken cancellationToken = default)
 	{
 		ClearStatusVector();
 
@@ -258,16 +400,38 @@ protected override ValueTask PutSegmentAsync(byte[] buffer, CancellationToken ca
 		return ValueTask2.CompletedTask;
 	}
 
-	protected override void Seek(int position)
+	public override void Seek(int position, int seekOperation)
 	{
-		throw new NotSupportedException();
+		ClearStatusVector();
+
+		var resultingPosition = 0;
+		_database.FbClient.isc_seek_blob(
+			_statusVector,
+			ref _blobHandle,
+			(short)seekOperation,
+			position,
+			ref resultingPosition);
+
+		_database.ProcessStatusVector(_statusVector);
 	}
-	protected override ValueTask SeekAsync(int position, CancellationToken cancellationToken = default)
+	public override ValueTask SeekAsync(int position, int seekOperation, CancellationToken cancellationToken = default)
 	{
-		throw new NotSupportedException();
+		ClearStatusVector();
+
+		var resultingPosition = 0;
+		_database.FbClient.isc_seek_blob(
+			_statusVector,
+			ref _blobHandle,
+			(short)seekOperation,
+			position,
+			ref resultingPosition);
+
+		_database.ProcessStatusVector(_statusVector);
+
+		return ValueTask2.CompletedTask;
 	}
 
-	protected override void Close()
+	public override void Close()
 	{
 		ClearStatusVector();
 
@@ -275,7 +439,7 @@ protected override void Close()
 
 		_database.ProcessStatusVector(_statusVector);
 	}
-	protected override ValueTask CloseAsync(CancellationToken cancellationToken = default)
+	public override ValueTask CloseAsync(CancellationToken cancellationToken = default)
 	{
 		ClearStatusVector();
 
@@ -286,7 +450,7 @@ protected override ValueTask CloseAsync(CancellationToken cancellationToken = de
 		return ValueTask2.CompletedTask;
 	}
 
-	protected override void Cancel()
+	public override void Cancel()
 	{
 		ClearStatusVector();
 
@@ -294,7 +458,7 @@ protected override void Cancel()
 
 		_database.ProcessStatusVector(_statusVector);
 	}
-	protected override ValueTask CancelAsync(CancellationToken cancellationToken = default)
+	public override ValueTask CancelAsync(CancellationToken cancellationToken = default)
 	{
 		ClearStatusVector();
 
diff --git a/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesStatement.cs b/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesStatement.cs
index 8d29d76d..6dc7de2f 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesStatement.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesStatement.cs
@@ -371,11 +371,13 @@ public override void Execute(int timeout, IDescriptorFiller descriptorFiller)
 		descriptorFiller.Fill(_parameters, 0);
 
 		ClearStatusVector();
-		NativeHelpers.CallIfExists(() =>
-		{
-			_database.FbClient.fb_dsql_set_timeout(_statusVector, ref _handle, (uint)timeout);
-			_database.ProcessStatusVector(_statusVector);
-		});
+		NativeHelpers.CallIfExists(
+			nameof(IFbClient.fb_dsql_set_timeout),
+			() =>
+			{
+				_database.FbClient.fb_dsql_set_timeout(_statusVector, ref _handle, (uint)timeout);
+				_database.ProcessStatusVector(_statusVector);
+			});
 
 		ClearStatusVector();
 
@@ -441,11 +443,13 @@ public override async ValueTask ExecuteAsync(int timeout, IDescriptorFiller desc
 		await descriptorFiller.FillAsync(_parameters, 0, cancellationToken).ConfigureAwait(false);
 
 		ClearStatusVector();
-		NativeHelpers.CallIfExists(() =>
-		{
-			_database.FbClient.fb_dsql_set_timeout(_statusVector, ref _handle, (uint)timeout);
-			_database.ProcessStatusVector(_statusVector);
-		});
+		NativeHelpers.CallIfExists(
+			nameof(IFbClient.fb_dsql_set_timeout),
+			() =>
+			{
+				_database.FbClient.fb_dsql_set_timeout(_statusVector, ref _handle, (uint)timeout);
+				_database.ProcessStatusVector(_statusVector);
+			});
 
 		ClearStatusVector();
 
diff --git a/src/FirebirdSql.Data.FirebirdClient/Client/Native/IFbClient.cs b/src/FirebirdSql.Data.FirebirdClient/Client/Native/IFbClient.cs
index 15aa3148..f49b09f0 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Client/Native/IFbClient.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Client/Native/IFbClient.cs
@@ -23,8 +23,8 @@
 namespace FirebirdSql.Data.Client.Native;
 
 /// <summary>
-/// This is the interface that the dynamically-generated class uses to call the native library. 
-/// Each connection can specify different client library to use even on the same OS. 
+/// This is the interface that the dynamically-generated class uses to call the native library.
+/// Each connection can specify different client library to use even on the same OS.
 /// IFbClient and FbClientactory classes are implemented to support this feature.
 /// Public visibility added, because auto-generated assembly can't work with internal types
 /// </summary>
@@ -68,6 +68,14 @@ IntPtr isc_open_blob2(
 		short bpbLength,
 		byte[] bpbAddress);
 
+	IntPtr isc_blob_info(
+		[In, Out] IntPtr[] statusVector,
+		ref BlobHandle blobHandle,
+		short itemListBufferLength,
+		byte[] itemListBuffer,
+		short resultBufferLength,
+		byte[] resultBuffer);
+
 	IntPtr isc_get_segment(
 		[In, Out] IntPtr[] statusVector,
 		[MarshalAs(UnmanagedType.I4)] ref BlobHandle blobHandle,
@@ -81,6 +89,13 @@ IntPtr isc_put_segment(
 		short segBufferLength,
 		byte[] segBuffer);
 
+	IntPtr isc_seek_blob(
+		[In, Out] IntPtr[] statusVector,
+		[MarshalAs(UnmanagedType.I4)] ref BlobHandle blobHandle,
+		short mode,
+		int offset,
+		ref int resultingBlobPosition);
+
 	IntPtr isc_cancel_blob(
 		[In, Out] IntPtr[] statusVector,
 		[MarshalAs(UnmanagedType.I4)] ref BlobHandle blobHandle);
@@ -260,4 +275,4 @@ IntPtr isc_transaction_info(
 		byte[] resultBuffer);
 
 #pragma warning restore IDE1006
-}
+}
\ No newline at end of file
diff --git a/src/FirebirdSql.Data.FirebirdClient/Common/BlobBase.cs b/src/FirebirdSql.Data.FirebirdClient/Common/BlobBase.cs
index 828b80c2..7214d5e8 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Common/BlobBase.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Common/BlobBase.cs
@@ -29,14 +29,17 @@ internal abstract class BlobBase
 	private int _segmentSize;
 
 	protected long _blobId;
+	protected bool _isOpen;
 	protected int _position;
 	protected TransactionBase _transaction;
 
 	public abstract int Handle { get; }
 	public long Id => _blobId;
 	public bool EOF => (_rblFlags & IscCodes.RBL_eof_pending) != 0;
+	public bool IsOpen => _isOpen;
 
-	protected int SegmentSize => _segmentSize;
+	public int SegmentSize => _segmentSize;
+	public int Position => _position;
 
 	public abstract DatabaseBase Database { get; }
 
@@ -203,26 +206,32 @@ public async ValueTask WriteAsync(byte[] buffer, int index, int count, Cancellat
 		}
 	}
 
-	protected abstract void Create();
-	protected abstract ValueTask CreateAsync(CancellationToken cancellationToken = default);
+	public abstract void Create();
+	public abstract ValueTask CreateAsync(CancellationToken cancellationToken = default);
 
-	protected abstract void Open();
-	protected abstract ValueTask OpenAsync(CancellationToken cancellationToken = default);
+	public abstract void Open();
+	public abstract ValueTask OpenAsync(CancellationToken cancellationToken = default);
 
-	protected abstract void GetSegment(Stream stream);
-	protected abstract ValueTask GetSegmentAsync(Stream stream, CancellationToken cancellationToken = default);
+	public abstract int GetLength();
+	public abstract ValueTask<int> GetLengthAsync(CancellationToken cancellationToken = default);
 
-	protected abstract void PutSegment(byte[] buffer);
-	protected abstract ValueTask PutSegmentAsync(byte[] buffer, CancellationToken cancellationToken = default);
+	public abstract byte[] GetSegment();
+	public abstract ValueTask<byte[]> GetSegmentAsync(CancellationToken cancellationToken = default);
 
-	protected abstract void Seek(int position);
-	protected abstract ValueTask SeekAsync(int position, CancellationToken cancellationToken = default);
+	public abstract void GetSegment(Stream stream);
+	public abstract ValueTask GetSegmentAsync(Stream stream, CancellationToken cancellationToken = default);
 
-	protected abstract void Close();
-	protected abstract ValueTask CloseAsync(CancellationToken cancellationToken = default);
+	public abstract void PutSegment(byte[] buffer);
+	public abstract ValueTask PutSegmentAsync(byte[] buffer, CancellationToken cancellationToken = default);
 
-	protected abstract void Cancel();
-	protected abstract ValueTask CancelAsync(CancellationToken cancellationToken = default);
+	public abstract void Seek(int offset, int seekMode);
+	public abstract ValueTask SeekAsync(int offset, int seekMode, CancellationToken cancellationToken = default);
+
+	public abstract void Close();
+	public abstract ValueTask CloseAsync(CancellationToken cancellationToken = default);
+
+	public abstract void Cancel();
+	public abstract ValueTask CancelAsync(CancellationToken cancellationToken = default);
 
 	protected void RblAddValue(int rblValue)
 	{
@@ -233,4 +242,4 @@ protected void RblRemoveValue(int rblValue)
 	{
 		_rblFlags &= ~rblValue;
 	}
-}
+}
\ No newline at end of file
diff --git a/src/FirebirdSql.Data.FirebirdClient/Common/BlobStream.cs b/src/FirebirdSql.Data.FirebirdClient/Common/BlobStream.cs
new file mode 100644
index 00000000..050873a7
--- /dev/null
+++ b/src/FirebirdSql.Data.FirebirdClient/Common/BlobStream.cs
@@ -0,0 +1,230 @@
+﻿using System;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FirebirdSql.Data.Common;
+
+public sealed class BlobStream : Stream
+{
+	private readonly BlobBase _blobHandle;
+	private int _position;
+
+	private byte[] _currentSegment;
+	private int _segmentPosition;
+
+	private int Available => _currentSegment?.Length - _segmentPosition ?? 0;
+
+	internal BlobStream(BlobBase blob)
+	{
+		_blobHandle = blob;
+		_position = 0;
+	}
+
+	public override long Position
+	{
+		get => _position;
+		set => Seek(value, SeekOrigin.Begin);
+	}
+
+	public override long Length
+	{
+		get
+		{
+			if (!_blobHandle.IsOpen)
+				_blobHandle.Open();
+
+			return _blobHandle.GetLength();
+		}
+	}
+
+	public override void Flush()
+	{
+	}
+
+	public override int Read(byte[] buffer, int offset, int count)
+	{
+		ValidateBufferSize(buffer, offset, count);
+
+		if (!_blobHandle.IsOpen)
+			_blobHandle.Open();
+
+		var copied = 0;
+		var remainingBufferSize = buffer.Length - offset;
+		do
+		{
+			if (remainingBufferSize == 0)
+				break;
+
+			if (Available > 0)
+			{
+				var toCopy = Math.Min(Available, remainingBufferSize);
+				Array.Copy(_currentSegment, _segmentPosition, buffer, offset + copied, toCopy);
+				copied += toCopy;
+				_segmentPosition += toCopy;
+				remainingBufferSize -= toCopy;
+				_position += toCopy;
+			}
+
+			if (_blobHandle.EOF)
+				break;
+
+			if (Available == 0)
+			{
+				_currentSegment = _blobHandle.GetSegment();
+				_segmentPosition = 0;
+			}
+		} while (copied < count);
+
+		return copied;
+	}
+	public override async Task<int> ReadAsync(byte[] buffer, int offset, int count,
+		CancellationToken cancellationToken)
+	{
+		ValidateBufferSize(buffer, offset, count);
+
+		if (!_blobHandle.IsOpen)
+			await _blobHandle.OpenAsync(cancellationToken).ConfigureAwait(false);
+
+		var copied = 0;
+		var remainingBufferSize = buffer.Length - offset;
+		do
+		{
+			if (remainingBufferSize == 0)
+				break;
+
+			if (Available > 0)
+			{
+				var toCopy = Math.Min(Available, remainingBufferSize);
+				Array.Copy(_currentSegment, _segmentPosition, buffer, offset + copied, toCopy);
+				copied += toCopy;
+				_segmentPosition += toCopy;
+				remainingBufferSize -= toCopy;
+				_position += toCopy;
+			}
+
+			if (_blobHandle.EOF)
+				break;
+
+			if (Available == 0)
+			{
+				_currentSegment = await _blobHandle.GetSegmentAsync(cancellationToken).ConfigureAwait(false);
+				_segmentPosition = 0;
+			}
+		} while (copied < count);
+
+		return copied;
+	}
+
+	public override long Seek(long offset, SeekOrigin origin)
+	{
+		if (!_blobHandle.IsOpen)
+			_blobHandle.Open();
+
+		var seekMode = origin switch
+		{
+			SeekOrigin.Begin => IscCodes.isc_blb_seek_from_head,
+			SeekOrigin.Current => IscCodes.isc_blb_seek_relative,
+			SeekOrigin.End => IscCodes.isc_blb_seek_from_tail,
+			_ => throw new ArgumentOutOfRangeException(nameof(origin))
+		};
+
+		_blobHandle.Seek((int)offset, seekMode);
+		return _position = _blobHandle.Position;
+	}
+
+	public override void SetLength(long value)
+	{
+		throw new NotSupportedException();
+	}
+
+	public override void Write(byte[] buffer, int offset, int count)
+	{
+		try
+		{
+			if (!_blobHandle.IsOpen)
+				_blobHandle.Create();
+
+			var chunk = count >= _blobHandle.SegmentSize ? _blobHandle.SegmentSize : count;
+			var tmpBuffer = new byte[chunk];
+
+			while (count > 0)
+			{
+				if (chunk > count)
+				{
+					chunk = count;
+					tmpBuffer = new byte[chunk];
+				}
+
+				Array.Copy(buffer, offset, tmpBuffer, 0, chunk);
+				_blobHandle.PutSegment(tmpBuffer);
+
+				offset += chunk;
+				count -= chunk;
+				_position += chunk;
+			}
+		}
+		catch
+		{
+			_blobHandle.Cancel();
+			throw;
+		}
+	}
+	public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+	{
+		try
+		{
+			if (!_blobHandle.IsOpen)
+				await _blobHandle.CreateAsync(cancellationToken).ConfigureAwait(false);
+
+			var chunk = count >= _blobHandle.SegmentSize ? _blobHandle.SegmentSize : count;
+			var tmpBuffer = new byte[chunk];
+
+			while (count > 0)
+			{
+				if (chunk > count)
+				{
+					chunk = count;
+					tmpBuffer = new byte[chunk];
+				}
+
+				Array.Copy(buffer, offset, tmpBuffer, 0, chunk);
+				await _blobHandle.PutSegmentAsync(tmpBuffer, cancellationToken).ConfigureAwait(false);
+
+				offset += chunk;
+				count -= chunk;
+				_position += chunk;
+			}
+		}
+		catch
+		{
+			await _blobHandle.CancelAsync(cancellationToken).ConfigureAwait(false);
+			throw;
+		}
+	}
+
+	public override bool CanRead => true;
+	public override bool CanSeek => true;
+	public override bool CanWrite => true;
+
+	protected override void Dispose(bool disposing)
+	{
+		_blobHandle.Close();
+	}
+
+#if !(NET48 || NETSTANDARD2_0)
+	public override ValueTask DisposeAsync()
+	{
+		return _blobHandle.CloseAsync();
+	}
+#endif
+
+	private static void ValidateBufferSize(byte[] buffer, int offset, int count)
+	{
+		if (buffer is null)
+			throw new ArgumentNullException(nameof(buffer));
+
+		if (buffer.Length < offset + count)
+			throw new InvalidOperationException();
+	}
+}
\ No newline at end of file
diff --git a/src/FirebirdSql.Data.FirebirdClient/Common/DbField.cs b/src/FirebirdSql.Data.FirebirdClient/Common/DbField.cs
index 92499165..4e0a435a 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Common/DbField.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Common/DbField.cs
@@ -16,6 +16,7 @@
 //$Authors = Carlos Guzman Alvarez, Jiri Cincura (jiri@cincura.net)
 
 using System;
+using System.Linq;
 using System.Numerics;
 using FirebirdSql.Data.Types;
 
@@ -325,10 +326,11 @@ public void SetValue(byte[] buffer)
 						{
 							var s = Charset.GetString(buffer, 0, buffer.Length);
 
+							var runes = s.EnumerateRunesEx().ToList();
 							if ((Length % Charset.BytesPerCharacter) == 0 &&
-								s.Length > CharCount)
+								runes.Count > CharCount)
 							{
-								s = s.Substring(0, CharCount);
+								s = new string([.. runes.Take(CharCount).SelectMany(x => x)]);
 							}
 
 							DbValue.SetValue(s);
diff --git a/src/FirebirdSql.Data.FirebirdClient/Common/DbValue.cs b/src/FirebirdSql.Data.FirebirdClient/Common/DbValue.cs
index f799b5ac..4e2d2e7f 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Common/DbValue.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Common/DbValue.cs
@@ -17,9 +17,11 @@
 
 using System;
 using System.Globalization;
+using System.Linq;
 using System.Numerics;
 using System.Threading;
 using System.Threading.Tasks;
+using FirebirdSql.Data.FirebirdClient;
 using FirebirdSql.Data.Types;
 
 namespace FirebirdSql.Data.Common;
@@ -331,6 +333,21 @@ public async ValueTask<byte[]> GetBinaryAsync(CancellationToken cancellationToke
 		return (byte[])_value;
 	}
 
+	public BlobStream GetBinaryStream()
+	{
+		if (_value is not long l)
+			throw new NotSupportedException();
+
+		return GetBlobStream(l);
+	}
+	public ValueTask<BlobStream> GetBinaryStreamAsync(CancellationToken cancellationToken = default)
+	{
+		if (_value is not long l)
+			throw new NotSupportedException();
+
+		return GetBlobStreamAsync(l, cancellationToken);
+	}
+
 	public int GetDate()
 	{
 		return _value switch
@@ -411,7 +428,7 @@ public byte[] GetBytes()
 					else
 					{
 						var svalue = GetString();
-						if ((Field.Length % Field.Charset.BytesPerCharacter) == 0 && svalue.Length > Field.CharCount)
+						if ((Field.Length % Field.Charset.BytesPerCharacter) == 0 && svalue.EnumerateRunesEx().Count() > Field.CharCount)
 						{
 							throw IscException.ForErrorCodes(new[] { IscCodes.isc_arith_except, IscCodes.isc_string_truncation });
 						}
@@ -447,7 +464,7 @@ public byte[] GetBytes()
 					else
 					{
 						var svalue = GetString();
-						if ((Field.Length % Field.Charset.BytesPerCharacter) == 0 && svalue.Length > Field.CharCount)
+						if ((Field.Length % Field.Charset.BytesPerCharacter) == 0 && svalue.EnumerateRunesEx().Count() > Field.CharCount)
 						{
 							throw IscException.ForErrorCodes(new[] { IscCodes.isc_arith_except, IscCodes.isc_string_truncation });
 						}
@@ -626,7 +643,7 @@ public async ValueTask<byte[]> GetBytesAsync(CancellationToken cancellationToken
 					else
 					{
 						var svalue = await GetStringAsync(cancellationToken).ConfigureAwait(false);
-						if ((Field.Length % Field.Charset.BytesPerCharacter) == 0 && svalue.Length > Field.CharCount)
+						if ((Field.Length % Field.Charset.BytesPerCharacter) == 0 && svalue.EnumerateRunesEx().Count() > Field.CharCount)
 						{
 							throw IscException.ForErrorCodes(new[] { IscCodes.isc_arith_except, IscCodes.isc_string_truncation });
 						}
@@ -662,7 +679,7 @@ public async ValueTask<byte[]> GetBytesAsync(CancellationToken cancellationToken
 					else
 					{
 						var svalue = await GetStringAsync(cancellationToken).ConfigureAwait(false);
-						if ((Field.Length % Field.Charset.BytesPerCharacter) == 0 && svalue.Length > Field.CharCount)
+						if ((Field.Length % Field.Charset.BytesPerCharacter) == 0 && svalue.EnumerateRunesEx().Count() > Field.CharCount)
 						{
 							throw IscException.ForErrorCodes(new[] { IscCodes.isc_arith_except, IscCodes.isc_string_truncation });
 						}
@@ -854,6 +871,17 @@ private ValueTask<byte[]> GetBlobDataAsync(long blobId, CancellationToken cancel
 		return blob.ReadAsync(cancellationToken);
 	}
 
+	private BlobStream GetBlobStream(long blobId)
+	{
+		var blob = _statement.CreateBlob(blobId);
+		return new BlobStream(blob);
+	}
+	private ValueTask<BlobStream> GetBlobStreamAsync(long blobId, CancellationToken cancellationToken = default)
+	{
+		var blob = _statement.CreateBlob(blobId);
+		return ValueTask2.FromResult(new BlobStream(blob));
+	}
+
 	private Array GetArrayData(long handle)
 	{
 		if (_field.ArrayHandle == null)
diff --git a/src/FirebirdSql.Data.FirebirdClient/Common/Extensions.cs b/src/FirebirdSql.Data.FirebirdClient/Common/Extensions.cs
index b3d5d432..48e2c75f 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Common/Extensions.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Common/Extensions.cs
@@ -48,7 +48,11 @@ public static IntPtr ReadIntPtr(this BinaryReader self)
 
 	public static string ToHexString(this byte[] b)
 	{
+#if NET5_0_OR_GREATER
+		return Convert.ToHexString(b);
+#else
 		return BitConverter.ToString(b).Replace("-", string.Empty);
+#endif
 	}
 
 	public static IEnumerable<IEnumerable<T>> Split<T>(this T[] array, int size)
@@ -62,4 +66,33 @@ public static IEnumerable<IEnumerable<T>> Split<T>(this T[] array, int size)
 #if NETSTANDARD2_0
 	public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source) => new HashSet<T>(source);
 #endif
+
+	public static IEnumerable<char[]> EnumerateRunesEx(this string s)
+	{
+		if (s == null)
+			throw new ArgumentNullException(nameof(s));
+
+#if NETSTANDARD2_0 || NETSTANDARD2_1 || NET48
+		for (var i = 0; i < s.Length; i++)
+		{
+			if (char.IsHighSurrogate(s[i]) && i + 1 < s.Length && char.IsLowSurrogate(s[i + 1]))
+			{
+				yield return new[] { s[i], s[i + 1] };
+				i++;
+			}
+			else
+			{
+				yield return new[] { s[i] };
+			}
+		}
+
+#else
+		return s.EnumerateRunes().Select(r =>
+		{
+			var result = new char[r.Utf16SequenceLength];
+			r.EncodeToUtf16(result);
+			return result;
+		});
+#endif
+	}
 }
diff --git a/src/FirebirdSql.Data.FirebirdClient/Common/IscCodes.cs b/src/FirebirdSql.Data.FirebirdClient/Common/IscCodes.cs
index 40bb78da..25a9d29a 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Common/IscCodes.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Common/IscCodes.cs
@@ -941,6 +941,10 @@ internal static class IscCodes
 	public const int RBL_eof_pending = 4;
 	public const int RBL_create = 8;
 
+	public const int isc_blb_seek_from_head = 0;
+	public const int isc_blb_seek_relative =  1;
+	public const int isc_blb_seek_from_tail = 2;
+
 	#endregion
 
 	#region Blob Information
diff --git a/src/FirebirdSql.Data.FirebirdClient/Common/IscErrorMessages.cs b/src/FirebirdSql.Data.FirebirdClient/Common/IscErrorMessages.cs
index ad90db0c..a3ad97a9 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Common/IscErrorMessages.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Common/IscErrorMessages.cs
@@ -23,6 +23,7 @@ internal static class IscErrorMessages
 {
 	static Dictionary<int, string> _messages = new Dictionary<int, string>()
 		{
+	{335544320, ""},
 	{335544321, "arithmetic exception, numeric overflow, or string truncation"},		/* arith_except */
 	{335544322, "invalid database key"},		/* bad_dbkey */
 	{335544323, "file {0} is not a valid database"},		/* bad_db_format */
@@ -215,8 +216,7 @@ internal static class IscErrorMessages
 	{335544510, "lock time-out on wait transaction"},		/* lock_timeout */
 	{335544511, "procedure {0} is not defined"},		/* prcnotdef */
 	{335544512, "Input parameter mismatch for procedure {0}"},		/* prcmismat */
-	{335544513, @"Database {0}: WAL subsystem bug for pid {1}
-{2}"},		/* wal_bugcheck */
+	{335544513, "Database {0}: WAL subsystem bug for pid {1}\n{2}"},		/* wal_bugcheck */
 	{335544514, "Could not expand the WAL segment for database {0}"},		/* wal_cant_expand */
 	{335544515, "status code {0} unknown"},		/* codnotdef */
 	{335544516, "exception {0} not defined"},		/* xcpnotdef */
@@ -340,9 +340,9 @@ internal static class IscErrorMessages
 	{335544634, "Token unknown - line {0}, column {1}"},		/* dsql_token_unk_err */
 	{335544635, "there is no alias or table named {0} at this scope level"},		/* dsql_no_relation_alias */
 	{335544636, "there is no index {0} for table {1}"},		/* indexname */
-	{335544637, "table {0} is not referenced in plan"},		/* no_stream_plan */
-	{335544638, "table {0} is referenced more than once in plan; use aliases to distinguish"},		/* stream_twice */
-	{335544639, "table {0} is referenced in the plan but not the from list"},		/* stream_not_found */
+	{335544637, "table or procedure {0} is not referenced in plan"},		/* no_stream_plan */
+	{335544638, "table or procedure {0} is referenced more than once in plan; use aliases to distinguish"},		/* stream_twice */
+	{335544639, "table or procedure {0} is referenced in the plan but not the from list"},		/* stream_not_found */
 	{335544640, "Invalid use of CHARACTER SET or COLLATE"},		/* collation_requires_text */
 	{335544641, "Specified domain or source column {0} does not exist"},		/* dsql_domain_not_found */
 	{335544642, "index {0} cannot be used in the specified plan"},		/* index_unused */
@@ -362,7 +362,7 @@ internal static class IscErrorMessages
 	{335544656, "variable {0} conflicts with parameter in same procedure"},		/* dsql_var_conflict */
 	{335544657, "Array/BLOB/DATE data types not allowed in arithmetic"},		/* dsql_no_blob_array */
 	{335544658, "{0} is not a valid base table of the specified view"},		/* dsql_base_table */
-	{335544659, "table {0} is referenced twice in view; use an alias to distinguish"},		/* duplicate_base_table */
+	{335544659, "table or procedure {0} is referenced twice in view; use an alias to distinguish"},		/* duplicate_base_table */
 	{335544660, "view {0} has more than one base table; use aliases to distinguish"},		/* view_alias */
 	{335544661, "cannot add index, index root page is full."},		/* index_root_page_full */
 	{335544662, "BLOB SUB_TYPE {0} is not defined"},		/* dsql_blob_type_unknown */
@@ -546,8 +546,8 @@ internal static class IscErrorMessages
 	{335544840, "cannot update"},		/* no_update */
 	{335544841, "Cursor is already open"},		/* cursor_already_open */
 	{335544842, "{0}"},		/* stack_trace */
-	{335544843, "Context variable {0} is not found in namespace {1}"},		/* ctx_var_not_found */
-	{335544844, "Invalid namespace name {0} passed to {1}"},		/* ctx_namespace_invalid */
+	{335544843, "Context variable '{0}' is not found in namespace '{1}'"},		/* ctx_var_not_found */
+	{335544844, "Invalid namespace name '{0}' passed to {1}"},		/* ctx_namespace_invalid */
 	{335544845, "Too many context variables"},		/* ctx_too_big */
 	{335544846, "Invalid argument passed to {0}"},		/* ctx_bad_argument */
 	{335544847, "BLR syntax error. Identifier {0}... is too long"},		/* identifier_too_long */
@@ -624,15 +624,12 @@ internal static class IscErrorMessages
 	{335544918, "Attachment handle is busy"},		/* att_handle_busy */
 	{335544919, "Bad written UDF detected: pointer returned in FREE_IT function was not allocated by ib_util_malloc"},		/* bad_udf_freeit */
 	{335544920, "External Data Source provider '{0}' not found"},		/* eds_provider_not_found */
-	{335544921, @"Execute statement error at {0} :
-{1}Data source : {2}"},		/* eds_connection */
+	{335544921, "Execute statement error at {0} :\n{1}Data source : {2}"},		/* eds_connection */
 	{335544922, "Execute statement preprocess SQL error"},		/* eds_preprocess */
 	{335544923, "Statement expected"},		/* eds_stmt_expected */
 	{335544924, "Parameter name expected"},		/* eds_prm_name_expected */
 	{335544925, "Unclosed comment found near '{0}'"},		/* eds_unclosed_comment */
-	{335544926, @"Execute statement error at {0} :
-{1}Statement : {2}
-Data source : {3}"},		/* eds_statement */
+	{335544926, "Execute statement error at {0} :\n{1}Statement : {2}\nData source : {3}"},		/* eds_statement */
 	{335544927, "Input parameters mismatch"},		/* eds_input_prm_mismatch */
 	{335544928, "Output parameters mismatch"},		/* eds_output_prm_mismatch */
 	{335544929, "Input parameter '{0}' have no value set"},		/* eds_input_prm_not_set */
@@ -690,7 +687,7 @@ internal static class IscErrorMessages
 	{335544981, "Floating point overflow in built-in function {0}"},		/* sysf_fp_overflow */
 	{335544982, "Floating point overflow in result from UDF {0}"},		/* udf_fp_overflow */
 	{335544983, "Invalid floating point value returned by UDF {0}"},		/* udf_fp_nan */
-	{335544984, "Database is probably already opened by another engine instance in another Windows session"},		/* instance_conflict */
+	{335544984, "Shared memory area is probably already created by another engine instance in another Windows session"},		/* instance_conflict */
 	{335544985, "No free space found in temporary directories"},		/* out_of_temp_space */
 	{335544986, "Explicit transaction control is not allowed"},		/* eds_expl_tran_ctrl */
 	{335544987, "Use of TRUSTED switches in spb_command_line is prohibited"},		/* no_trusted_spb */
@@ -824,7 +821,7 @@ internal static class IscErrorMessages
 	{335545115, "Cannot open cursor for non-SELECT statement"},		/* no_cursor */
 	{335545116, "If <window frame bound 1> specifies {0}, then <window frame bound 2> shall not specify {1}"},		/* dsql_window_incompat_frames */
 	{335545117, "RANGE based window with <expr> {PRECEDING | FOLLOWING} cannot have ORDER BY with more than one value"},		/* dsql_window_range_multi_key */
-	{335545118, "RANGE based window must have an ORDER BY key of numerical, date, time or timestamp types"},		/* dsql_window_range_inv_key_type */
+	{335545118, "RANGE based window with <offset> PRECEDING/FOLLOWING must have a single ORDER BY key of numerical, date, time or timestamp types"},		/* dsql_window_range_inv_key_type */
 	{335545119, "Window RANGE/ROWS PRECEDING/FOLLOWING value must be of a numerical type"},		/* dsql_window_frame_value_inv_type */
 	{335545120, "Invalid PRECEDING or FOLLOWING offset in window function: cannot be negative"},		/* window_frame_value_invalid */
 	{335545121, "Window {0} not found"},		/* dsql_window_not_found */
@@ -843,7 +840,7 @@ internal static class IscErrorMessages
 	{335545134, "OVERRIDING clause can be used only when an identity column is present in the INSERT's field list for table/view {0}"},		/* overriding_without_identity */
 	{335545135, "OVERRIDING SYSTEM VALUE can be used only for identity column defined as 'GENERATED ALWAYS' in INSERT for table/view {0}"},		/* overriding_system_invalid */
 	{335545136, "OVERRIDING USER VALUE can be used only for identity column defined as 'GENERATED BY DEFAULT' in INSERT for table/view {0}"},		/* overriding_user_invalid */
-	{335545137, "OVERRIDING SYSTEM VALUE should be used to override the value of an identity column defined as 'GENERATED ALWAYS' in table/view {0}"},		/* overriding_system_missing */
+	{335545137, "OVERRIDING clause should be used when an identity column defined as 'GENERATED ALWAYS' is present in the INSERT's field list for table table/view {0}"},		/* overriding_missing */
 	{335545138, "DecFloat precision must be 16 or 34"},		/* decprecision_err */
 	{335545139, "Decimal float divide by zero.  The code attempted to divide a DECFLOAT value by zero."},		/* decfloat_divide_by_zero */
 	{335545140, "Decimal float inexact result.  The result of an operation cannot be represented as a decimal fraction."},		/* decfloat_inexact_result */
@@ -884,7 +881,7 @@ internal static class IscErrorMessages
 	{335545175, "Segment size ({0}) should not exceed 65535 (64K - 1) when using segmented blob"},		/* big_segment */
 	{335545176, "Invalid blob policy in the batch for {0}() call"},		/* batch_policy */
 	{335545177, "Can't change default BPB after adding any data to batch"},		/* batch_defbpb */
-	{335545178, "Unexpected info buffer structure querying for default blob alignment"},		/* batch_align */
+	{335545178, "Unexpected info buffer structure querying for server batch parameters"},		/* batch_align */
 	{335545179, "Duplicated segment {0} in multisegment connect block parameter"},		/* multi_segment_dup */
 	{335545180, "Plugin not supported by network protocol"},		/* non_plugin_protocol */
 	{335545181, "Error parsing message format"},		/* message_format */
@@ -981,14 +978,31 @@ internal static class IscErrorMessages
 	{335545272, "Reset of user session failed. Connection is shut down."},		/* ses_reset_failed */
 	{335545273, "File size is less than expected"},		/* block_size */
 	{335545274, "Invalid key length {0}, need >{1}"},		/* tom_key_length */
+	{335545275, "Invalid information arguments"},		/* inf_invalid_args */
+	{335545276, "Empty or NULL parameter {0} is not accepted"},		/* sysf_invalid_null_empty */
+	{335545277, "Undefined local table number {0}"},		/* bad_loctab_num */
+	{335545278, "Invalid text <{0}> after quoted string"},		/* quoted_str_bad */
+	{335545279, "Missing terminating quote <{0}> in the end of quoted string"},		/* quoted_str_miss */
+	{335545280, "{0}: inconsistent shared memory type/version; found {1}, expected {2}"},		/* wrong_shmem_ver */
+	{335545281, "{0}-bit engine can't open database already opened by {1}-bit engine"},		/* wrong_shmem_bitness */
+	{335545282, "Procedures cannot specify access type other than NATURAL in the plan"},		/* wrong_proc_plan */
+	{335545283, "Invalid RDB$BLOB_UTIL handle"},		/* invalid_blob_util_handle */
+	{335545284, "Invalid temporary BLOB ID"},		/* bad_temp_blob_id */
+	{335545285, "ODS upgrade failed while adding new system {0}"},		/* ods_upgrade_err */
+	{335545286, "Wrong parallel workers value {0}, valid range are from 1 to {1}"},		/* bad_par_workers */
+	{335545287, "Definition of index expression is not found for index {0}"},		/* idx_expr_not_found */
+	{335545288, "Definition of index condition is not found for index {0}"},		/* idx_cond_not_found */
 	{335740929, "data base file name ({0}) already given"},		/* gfix_db_name */
 	{335740930, "invalid switch {0}"},		/* gfix_invalid_sw */
+	{335740931, "gfix version {0}"},		/* gfix_version */
 	{335740932, "incompatible switch combination"},		/* gfix_incmp_sw */
 	{335740933, "replay log pathname required"},		/* gfix_replay_req */
 	{335740934, "number of page buffers for cache required"},		/* gfix_pgbuf_req */
 	{335740935, "numeric value required"},		/* gfix_val_req */
 	{335740936, "positive numeric value required"},		/* gfix_pval_req */
 	{335740937, "number of transactions per sweep required"},		/* gfix_trn_req */
+	{335740938, "transaction number or \"all\" required"},		/* gfix_trn_all_req */
+	{335740939, "\"sync\" or \"async\" required"},		/* gfix_sync_req */
 	{335740940, "\"full\" or \"reserve\" required"},		/* gfix_full_req */
 	{335740941, "user name required"},		/* gfix_usrname_req */
 	{335740942, "password required"},		/* gfix_pass_req */
@@ -998,21 +1012,128 @@ internal static class IscErrorMessages
 	{335740946, "numeric value between 0 and 32767 inclusive required"},		/* gfix_nval_req */
 	{335740947, "must specify type of shutdown"},		/* gfix_type_shut */
 	{335740948, "please retry, specifying an option"},		/* gfix_retry */
+	{335740949, "plausible options are:"},		/* gfix_opt */
+	{335740950, "\\n    Options can be abbreviated to the unparenthesized characters"},		/* gfix_qualifiers */
 	{335740951, "please retry, giving a database name"},		/* gfix_retry_db */
+	{335740952, "Summary of validation errors"},		/* gfix_summary */
+	{335740953, "   -ac(tivate_shadow)   activate shadow file for database usage"},		/* gfix_opt_active */
+	{335740954, "   -at(tach)            shutdown new database attachments"},		/* gfix_opt_attach */
+	{335740955, "\t-begin_log\tbegin logging for replay utility"},		/* gfix_opt_begin_log */
+	{335740956, "   -b(uffers)           set page buffers <n>"},		/* gfix_opt_buffers */
+	{335740957, "   -co(mmit)            commit transaction <tr / all>"},		/* gfix_opt_commit */
+	{335740958, "   -ca(che)             shutdown cache manager"},		/* gfix_opt_cache */
+	{335740959, "\t-disable\tdisable WAL"},		/* gfix_opt_disable */
+	{335740960, "   -fu(ll)              validate record fragments (-v)"},		/* gfix_opt_full */
+	{335740961, "   -fo(rce_shutdown)    force database shutdown"},		/* gfix_opt_force */
+	{335740962, "   -h(ousekeeping)      set sweep interval <n>"},		/* gfix_opt_housekeep */
+	{335740963, "   -i(gnore)            ignore checksum errors"},		/* gfix_opt_ignore */
+	{335740964, "   -k(ill_shadow)       kill all unavailable shadow files"},		/* gfix_opt_kill */
+	{335740965, "   -l(ist)              show limbo transactions"},		/* gfix_opt_list */
+	{335740966, "   -me(nd)              prepare corrupt database for backup"},		/* gfix_opt_mend */
+	{335740967, "   -n(o_update)         read-only validation (-v)"},		/* gfix_opt_no_update */
+	{335740968, "   -o(nline)            database online <single / multi / normal>"},		/* gfix_opt_online */
+	{335740969, "   -pr(ompt)            prompt for commit/rollback (-l)"},		/* gfix_opt_prompt */
+	{335740970, "   -pa(ssword)          default password"},		/* gfix_opt_password */
+	{335740971, "\t-quit_log\tquit logging for replay utility"},		/* gfix_opt_quit_log */
+	{335740972, "   -r(ollback)          rollback transaction <tr / all>"},		/* gfix_opt_rollback */
+	{335740973, "   -sw(eep)             force garbage collection"},		/* gfix_opt_sweep */
+	{335740974, "   -sh(utdown)          shutdown <full / single / multi>"},		/* gfix_opt_shut */
+	{335740975, "   -tw(o_phase)         perform automated two-phase recovery"},		/* gfix_opt_two_phase */
+	{335740976, "   -tra(nsaction)       shutdown transaction startup"},		/* gfix_opt_tran */
+	{335740977, "   -u(se)               use full or reserve space for versions"},		/* gfix_opt_use */
+	{335740978, "   -user                default user name"},		/* gfix_opt_user */
+	{335740979, "   -v(alidate)          validate database structure"},		/* gfix_opt_validate */
+	{335740980, "   -w(rite)             write synchronously or asynchronously"},		/* gfix_opt_write */
+	{335740981, "   -x                   set debug on"},		/* gfix_opt_x */
+	{335740982, "   -z                   print software version number"},		/* gfix_opt_z */
+	{335740983, "\\n\tNumber of record level errors\t: {0}"},		/* gfix_rec_err */
+	{335740984, "\tNumber of Blob page errors\t: {0}"},		/* gfix_blob_err */
+	{335740985, "\tNumber of data page errors\t: {0}"},		/* gfix_data_err */
+	{335740986, "\tNumber of index page errors\t: {0}"},		/* gfix_index_err */
+	{335740987, "\tNumber of pointer page errors\t: {0}"},		/* gfix_pointer_err */
+	{335740988, "\tNumber of transaction page errors\t: {0}"},		/* gfix_trn_err */
+	{335740989, "\tNumber of database page errors\t: {0}"},		/* gfix_db_err */
+	{335740990, "bad block type"},		/* gfix_bad_block */
 	{335740991, "internal block exceeds maximum size"},		/* gfix_exceed_max */
 	{335740992, "corrupt pool"},		/* gfix_corrupt_pool */
 	{335740993, "virtual memory exhausted"},		/* gfix_mem_exhausted */
 	{335740994, "bad pool id"},		/* gfix_bad_pool */
 	{335740995, "Transaction state {0} not in valid range."},		/* gfix_trn_not_valid */
+	{335740996, "ATTACH_DATABASE: attempted attach of {0},"},		/* gfix_dbg_attach */
+	{335740997, " failed"},		/* gfix_dbg_failed */
+	{335740998, " succeeded"},		/* gfix_dbg_success */
+	{335740999, "Transaction {0} is in limbo."},		/* gfix_trn_limbo */
+	{335741000, "More limbo transactions than fit.  Try again"},		/* gfix_try_again */
+	{335741001, "Unrecognized info item {0}"},		/* gfix_unrec_item */
+	{335741002, "A commit of transaction {0} will violate two-phase commit."},		/* gfix_commit_violate */
+	{335741003, "A rollback of transaction {0} is needed to preserve two-phase commit."},		/* gfix_preserve */
+	{335741004, "Transaction {0} has already been partially committed."},		/* gfix_part_commit */
+	{335741005, "A rollback of this transaction will violate two-phase commit."},		/* gfix_rback_violate */
+	{335741006, "Transaction {0} has been partially committed."},		/* gfix_part_commit2 */
+	{335741007, "A commit is necessary to preserve the two-phase commit."},		/* gfix_commit_pres */
+	{335741008, "Insufficient information is available to determine"},		/* gfix_insuff_info */
+	{335741009, "a proper action for transaction {0}."},		/* gfix_action */
+	{335741010, "Transaction {0}: All subtransactions have been prepared."},		/* gfix_all_prep */
+	{335741011, "Either commit or rollback is possible."},		/* gfix_comm_rback */
 	{335741012, "unexpected end of input"},		/* gfix_unexp_eoi */
+	{335741013, "Commit, rollback, or neither (c, r, or n)?"},		/* gfix_ask */
+	{335741014, "Could not reattach to database for transaction {0}."},		/* gfix_reattach_failed */
+	{335741015, "Original path: {0}"},		/* gfix_org_path */
+	{335741016, "Enter a valid path:"},		/* gfix_enter_path */
+	{335741017, "Attach unsuccessful."},		/* gfix_att_unsucc */
 	{335741018, "failed to reconnect to a transaction in database {0}"},		/* gfix_recon_fail */
+	{335741019, "Transaction {0}:"},		/* gfix_trn2 */
+	{335741020, "  Multidatabase transaction:"},		/* gfix_mdb_trn */
+	{335741021, "    Host Site: {0}"},		/* gfix_host_site */
+	{335741022, "    Transaction {0}"},		/* gfix_trn */
+	{335741023, "has been prepared."},		/* gfix_prepared */
+	{335741024, "has been committed."},		/* gfix_committed */
+	{335741025, "has been rolled back."},		/* gfix_rolled_back */
+	{335741026, "is not available."},		/* gfix_not_available */
+	{335741027, "is not found, assumed not prepared."},		/* gfix_not_prepared */
+	{335741028, "is not found, assumed to be committed."},		/* gfix_be_committed */
+	{335741029, "        Remote Site: {0}"},		/* gfix_rmt_site */
+	{335741030, "        Database Path: {0}"},		/* gfix_db_path */
+	{335741031, "  Automated recovery would commit this transaction."},		/* gfix_auto_comm */
+	{335741032, "  Automated recovery would rollback this transaction."},		/* gfix_auto_rback */
+	{335741033, "Warning: Multidatabase transaction is in inconsistent state for recovery."},		/* gfix_warning */
+	{335741034, "Transaction {0} was committed, but prior ones were rolled back."},		/* gfix_trn_was_comm */
+	{335741035, "Transaction {0} was rolled back, but prior ones were committed."},		/* gfix_trn_was_rback */
 	{335741036, "Transaction description item unknown"},		/* gfix_trn_unknown */
+	{335741037, "   -mo(de)              read_only or read_write database"},		/* gfix_opt_mode */
 	{335741038, "\"read_only\" or \"read_write\" required"},		/* gfix_mode_req */
+	{335741039, "   -sq(l_dialect)       set database dialect n"},		/* gfix_opt_SQL_dialect */
+	{335741040, "database SQL dialect must be one of '{0}'"},		/* gfix_SQL_dialect */
+	{335741041, "dialect number required"},		/* gfix_dialect_req */
 	{335741042, "positive or zero numeric value required"},		/* gfix_pzval_req */
+	{335741043, "   -tru(sted)           use trusted authentication"},		/* gfix_opt_trusted */
+	{335741044, "could not open password file {0}, errno {1}"},
+	{335741045, "could not read password file {0}, errno {1}"},
+	{335741046, "empty password file {0}"},
+	{335741047, "   -fe(tch_password)    fetch password from file"},
+	{335741048, "usage: gfix [options] <database>"},
+	{335741049, "   -nol(inger)          close database ignoring linger setting for it"},		/* gfix_opt_nolinger */
+	{335741050, "\tNumber of inventory page errors\t: {0}"},		/* gfix_pip_err */
+	{335741051, "\tNumber of record level warnings\t: {0}"},		/* gfix_rec_warn */
+	{335741052, "\tNumber of blob page warnings\t: {0}"},		/* gfix_blob_warn */
+	{335741053, "\tNumber of data page warnings\t: {0}"},		/* gfix_data_warn */
+	{335741054, "\tNumber of index page warnings\t: {0}"},		/* gfix_index_warn */
+	{335741055, "\tNumber of pointer page warnings\t: {0}"},		/* gfix_pointer_warn */
+	{335741056, "\tNumber of transaction page warnings\t: {0}"},		/* gfix_trn_warn */
+	{335741057, "\tNumber of database page warnings\t: {0}"},		/* gfix_db_warn */
+	{335741058, "\tNumber of inventory page warnings\t: {0}"},		/* gfix_pip_warn */
+	{335741059, "   -icu                 fix database to be usable with present ICU version"},		/* gfix_opt_icu */
+	{335741060, "   -role                set SQL role name"},		/* gfix_opt_role */
+	{335741061, "SQL role name required"},		/* gfix_role_req */
+	{335741062, "   -repl(ica)           replica mode <none / read_only / read_write>"},		/* gfix_opt_repl */
+	{335741063, "replica mode (none / read_only / read_write) required"},		/* gfix_repl_mode_req */
+	{335741064, "   -par(allel)          parallel workers <n> (-sweep, -icu)"},		/* gfix_opt_parallel */
+	{335741065, "   -up(grade)           upgrade database ODS"},		/* gfix_opt_upgrade */
 	{336003074, "Cannot SELECT RDB$DB_KEY from a stored procedure."},		/* dsql_dbkey_from_non_table */
 	{336003075, "Precision 10 to 18 changed from DOUBLE PRECISION in SQL dialect 1 to 64-bit scaled integer in SQL dialect 3"},		/* dsql_transitional_numeric */
 	{336003076, "Use of {0} expression that returns different results in dialect 1 and dialect 3"},		/* dsql_dialect_warning_expr */
 	{336003077, "Database SQL dialect {0} does not support reference to {1} datatype"},		/* sql_db_dialect_dtype_unsupport */
+	{336003078, ""},
 	{336003079, "DB dialect {0} and client dialect {1} conflict with respect to numeric precision {2}."},		/* sql_dialect_conflict_num */
 	{336003080, "WARNING: Numeric literal {0} is interpreted as a floating-point"},		/* dsql_warning_number_ambiguous */
 	{336003081, "value in SQL dialect 1, but as an exact numeric value in SQL dialect 3."},		/* dsql_warning_number_ambiguous1 */
@@ -1048,22 +1169,192 @@ internal static class IscErrorMessages
 	{336003111, "Wrong number of parameters (expected {0}, got {1})"},		/* dsql_wrong_param_num */
 	{336003112, "Invalid DROP SQL SECURITY clause"},		/* dsql_invalid_drop_ss_clause */
 	{336003113, "UPDATE OR INSERT value for field {0}, part of the implicit or explicit MATCHING clause, cannot be DEFAULT"},		/* upd_ins_cannot_default */
+	{336068609, "ODS version not supported by DYN"},
+	{336068610, "unsupported DYN verb"},
+	{336068611, "STORE RDB$FIELD_DIMENSIONS failed"},
+	{336068612, "unsupported DYN verb"},
+	{336068613, "{0}"},
+	{336068614, "unsupported DYN verb"},
+	{336068615, "DEFINE BLOB FILTER failed"},
+	{336068616, "DEFINE GENERATOR failed"},
+	{336068617, "DEFINE GENERATOR unexpected DYN verb"},
+	{336068618, "DEFINE FUNCTION failed"},
+	{336068619, "unsupported DYN verb"},
+	{336068620, "DEFINE FUNCTION ARGUMENT failed"},
+	{336068621, "STORE RDB$FIELDS failed"},
+	{336068622, "No table specified for index"},
+	{336068623, "STORE RDB$INDEX_SEGMENTS failed"},
+	{336068624, "unsupported DYN verb"},
+	{336068625, "PRIMARY KEY column lookup failed"},
+	{336068626, "could not find UNIQUE or PRIMARY KEY constraint in table {0} with specified columns"},
+	{336068627, "PRIMARY KEY lookup failed"},
+	{336068628, "could not find PRIMARY KEY index in specified table {0}"},
+	{336068629, "STORE RDB$INDICES failed"},
+	{336068630, "STORE RDB$FIELDS failed"},
+	{336068631, "STORE RDB$RELATION_FIELDS failed"},
+	{336068632, "STORE RDB$RELATIONS failed"},
+	{336068633, "STORE RDB$USER_PRIVILEGES failed defining a table"},
+	{336068634, "unsupported DYN verb"},
+	{336068635, "STORE RDB$RELATIONS failed"},
+	{336068636, "STORE RDB$FIELDS failed"},
+	{336068637, "STORE RDB$RELATION_FIELDS failed"},
+	{336068638, "unsupported DYN verb"},
+	{336068639, "DEFINE TRIGGER failed"},
+	{336068640, "unsupported DYN verb"},
+	{336068641, "DEFINE TRIGGER MESSAGE failed"},
+	{336068642, "STORE RDB$VIEW_RELATIONS failed"},
+	{336068643, "ERASE RDB$FIELDS failed"},
+	{336068644, "ERASE BLOB FILTER failed"},
 	{336068645, "BLOB Filter {0} not found"},		/* dyn_filter_not_found */
+	{336068646, "unsupported DYN verb"},
+	{336068647, "ERASE RDB$FUNCTION_ARGUMENTS failed"},
+	{336068648, "ERASE RDB$FUNCTIONS failed"},
 	{336068649, "Function {0} not found"},		/* dyn_func_not_found */
+	{336068650, "unsupported DYN verb"},
+	{336068651, "Domain {0} is used in table {1} (local name {2}) and cannot be dropped"},
+	{336068652, "ERASE RDB$FIELDS failed"},
+	{336068653, "ERASE RDB$FIELDS failed"},
+	{336068654, "Column not found"},
+	{336068655, "ERASE RDB$INDICES failed"},
 	{336068656, "Index not found"},		/* dyn_index_not_found */
+	{336068657, "ERASE RDB$INDEX_SEGMENTS failed"},
+	{336068658, "No segments found for index"},
+	{336068659, "No table specified in ERASE RFR"},
+	{336068660, "Column {0} from table {1} is referenced in view {2}"},
+	{336068661, "ERASE RDB$RELATION_FIELDS failed"},
 	{336068662, "View {0} not found"},		/* dyn_view_not_found */
+	{336068663, "Column not found for table"},
+	{336068664, "ERASE RDB$INDEX_SEGMENTS failed"},
+	{336068665, "ERASE RDB$INDICES failed"},
+	{336068666, "ERASE RDB$RELATION_FIELDS failed"},
+	{336068667, "ERASE RDB$VIEW_RELATIONS failed"},
+	{336068668, "ERASE RDB$RELATIONS failed"},
+	{336068669, "Table not found"},
+	{336068670, "ERASE RDB$USER_PRIVILEGES failed"},
+	{336068671, "ERASE RDB$FILES failed"},
+	{336068672, "unsupported DYN verb"},
+	{336068673, "ERASE RDB$TRIGGER_MESSAGES failed"},
+	{336068674, "ERASE RDB$TRIGGERS failed"},
+	{336068675, "Trigger not found"},
+	{336068676, "MODIFY RDB$VIEW_RELATIONS failed"},
+	{336068677, "unsupported DYN verb"},
+	{336068678, "TRIGGER NAME expected"},
+	{336068679, "ERASE TRIGGER MESSAGE failed"},
+	{336068680, "Trigger Message not found"},
+	{336068681, "unsupported DYN verb"},
+	{336068682, "ERASE RDB$SECURITY_CLASSES failed"},
+	{336068683, "Security class not found"},
+	{336068684, "unsupported DYN verb"},
+	{336068685, "SELECT RDB$USER_PRIVILEGES failed in grant"},
+	{336068686, "SELECT RDB$USER_PRIVILEGES failed in grant"},
+	{336068687, "STORE RDB$USER_PRIVILEGES failed in grant"},
+	{336068688, "Specified domain or source column does not exist"},
+	{336068689, "Generation of column name failed"},
+	{336068690, "Generation of index name failed"},
+	{336068691, "Generation of trigger name failed"},
+	{336068692, "MODIFY DATABASE failed"},
+	{336068693, "MODIFY RDB$CHARACTER_SETS failed"},
+	{336068694, "MODIFY RDB$COLLATIONS failed"},
+	{336068695, "MODIFY RDB$FIELDS failed"},
+	{336068696, "MODIFY RDB$BLOB_FILTERS failed"},
 	{336068697, "Domain not found"},		/* dyn_domain_not_found */
+	{336068698, "unsupported DYN verb"},
+	{336068699, "MODIFY RDB$INDICES failed"},
+	{336068700, "MODIFY RDB$FUNCTIONS failed"},
+	{336068701, "Index column not found"},
+	{336068702, "MODIFY RDB$GENERATORS failed"},
+	{336068703, "MODIFY RDB$RELATION_FIELDS failed"},
+	{336068704, "Local column {0} not found"},
+	{336068705, "add EXTERNAL FILE not allowed"},
+	{336068706, "drop EXTERNAL FILE not allowed"},
+	{336068707, "MODIFY RDB$RELATIONS failed"},
+	{336068708, "MODIFY RDB$PROCEDURE_PARAMETERS failed"},
+	{336068709, "Table column not found"},
+	{336068710, "MODIFY TRIGGER failed"},
+	{336068711, "TRIGGER NAME expected"},
+	{336068712, "unsupported DYN verb"},
+	{336068713, "MODIFY TRIGGER MESSAGE failed"},
+	{336068714, "Create metadata BLOB failed"},
+	{336068715, "Write metadata BLOB failed"},
+	{336068716, "Close metadata BLOB failed"},
 	{336068717, "Triggers created automatically cannot be modified"},		/* dyn_cant_modify_auto_trig */
+	{336068718, "unsupported DYN verb"},
+	{336068719, "ERASE RDB$USER_PRIVILEGES failed in revoke(1)"},
+	{336068720, "Access to RDB$USER_PRIVILEGES failed in revoke(2)"},
+	{336068721, "ERASE RDB$USER_PRIVILEGES failed in revoke (3)"},
+	{336068722, "Access to RDB$USER_PRIVILEGES failed in revoke (4)"},
+	{336068723, "CREATE VIEW failed"},
+	{336068724, " attempt to index BLOB column in INDEX {0}"},
+	{336068725, " attempt to index array column in index {0}"},
+	{336068726, "key size too big for index {0}"},
+	{336068727, "no keys for index {0}"},
+	{336068728, "Unknown columns in index {0}"},
+	{336068729, "STORE RDB$RELATION_CONSTRAINTS failed"},
+	{336068730, "STORE RDB$CHECK_CONSTRAINTS failed"},
+	{336068731, "Column: {0} not defined as NOT NULL - cannot be used in PRIMARY KEY constraint definition"},
+	{336068732, "A column name is repeated in the definition of constraint: {0}"},
+	{336068733, "Integrity Constraint lookup failed"},
+	{336068734, "Same set of columns cannot be used in more than one PRIMARY KEY and/or UNIQUE constraint definition"},
+	{336068735, "STORE RDB$REF_CONSTRAINTS failed"},
+	{336068736, "No table specified in delete_constraint"},
+	{336068737, "ERASE RDB$RELATION_CONSTRAINTS failed"},
+	{336068738, "CONSTRAINT {0} does not exist."},
+	{336068739, "Generation of constraint name failed"},
 	{336068740, "Table {0} already exists"},		/* dyn_dup_table */
+	{336068741, "Number of referencing columns do not equal number of referenced columns"},
+	{336068742, "STORE RDB$PROCEDURES failed"},
+	{336068743, "Procedure {0} already exists"},		/* dyn_dup_procedure */
+	{336068744, "STORE RDB$PROCEDURE_PARAMETERS failed"},
+	{336068745, "Store into system table {0} failed"},
+	{336068746, "ERASE RDB$PROCEDURE_PARAMETERS failed"},
+	{336068747, "ERASE RDB$PROCEDURES failed"},
 	{336068748, "Procedure {0} not found"},		/* dyn_proc_not_found */
+	{336068749, "MODIFY RDB$PROCEDURES failed"},
+	{336068750, "DEFINE EXCEPTION failed"},
+	{336068751, "ERASE EXCEPTION failed"},
 	{336068752, "Exception not found"},		/* dyn_exception_not_found */
+	{336068753, "MODIFY EXCEPTION failed"},
 	{336068754, "Parameter {0} in procedure {1} not found"},		/* dyn_proc_param_not_found */
 	{336068755, "Trigger {0} not found"},		/* dyn_trig_not_found */
+	{336068756, "Only one data type change to the domain {0} allowed at a time"},
+	{336068757, "Only one data type change to the field {0} allowed at a time"},
+	{336068758, "STORE RDB$FILES failed"},
 	{336068759, "Character set {0} not found"},		/* dyn_charset_not_found */
 	{336068760, "Collation {0} not found"},		/* dyn_collation_not_found */
+	{336068761, "ERASE RDB$LOG_FILES failed"},
+	{336068762, "STORE RDB$LOG_FILES failed"},
 	{336068763, "Role {0} not found"},		/* dyn_role_not_found */
+	{336068764, "Difference file lookup failed"},
+	{336068765, "DEFINE SHADOW failed"},
+	{336068766, "MODIFY RDB$ROLES failed"},
 	{336068767, "Name longer than database column size"},		/* dyn_name_longer */
+	{336068768, "\"Only one constraint allowed for a domain\""},
+	{336068770, "Looking up column position failed"},
+	{336068771, "A node name is not permitted in a table with external file definition"},
+	{336068772, "Shadow lookup failed"},
+	{336068773, "Shadow {0} already exists"},
+	{336068774, "Cannot add file with the same name as the database or added files"},
+	{336068775, "no grant option for privilege {0} on column {1} of table/view {2}"},
+	{336068776, "no grant option for privilege {0} on column {1} of base table/view {2}"},
+	{336068777, "no grant option for privilege {0} on table/view {1} (for column {2})"},
+	{336068778, "no grant option for privilege {0} on base table/view {1} (for column {2})"},
+	{336068779, "no {0} privilege with grant option on table/view {1} (for column {2})"},
+	{336068780, "no {0} privilege with grant option on base table/view {1} (for column {2})"},
+	{336068781, "no grant option for privilege {0} on table/view {1}"},
+	{336068782, "no {0} privilege with grant option on table/view {1}"},
+	{336068783, "table/view {0} does not exist"},
 	{336068784, "column {0} does not exist in table/view {1}"},		/* dyn_column_does_not_exist */
+	{336068785, "Can not alter a view"},
+	{336068786, "EXTERNAL FILE table not supported in this context"},
+	{336068787, "attempt to index COMPUTED BY column in INDEX {0}"},
+	{336068788, "Table Name lookup failed"},
+	{336068789, "attempt to index a view"},
+	{336068790, "SELECT RDB$RELATIONS failed in grant"},
+	{336068791, "SELECT RDB$RELATION_FIELDS failed in grant"},
+	{336068792, "SELECT RDB$RELATIONS/RDB$OWNER_NAME failed in grant"},
+	{336068793, "SELECT RDB$USER_PRIVILEGES failed in grant"},
+	{336068794, "SELECT RDB$VIEW_RELATIONS/RDB$RELATION_FIELDS/... failed in grant"},
+	{336068795, "column {0} from table {1} is referenced in index {2}"},
 	{336068796, "SQL role {0} does not exist"},		/* dyn_role_does_not_exist */
 	{336068797, "user {0} has no grant admin option on SQL role {1}"},		/* dyn_no_grant_admin_opt */
 	{336068798, "user {0} is not a member of SQL role {1}"},		/* dyn_user_not_role_member */
@@ -1080,24 +1371,51 @@ internal static class IscErrorMessages
 	{336068816, "New size specified for column {0} must be at least {1} characters."},		/* dyn_char_fld_too_small */
 	{336068817, "Cannot change datatype for {0}.  Conversion from base type {1} to {2} is not supported."},		/* dyn_invalid_dtype_conversion */
 	{336068818, "Cannot change datatype for column {0} from a character type to a non-character type."},		/* dyn_dtype_conv_invalid */
+	{336068819, "unable to allocate memory from the operating system"},		/* dyn_virmemexh */
 	{336068820, "Zero length identifiers are not allowed"},		/* dyn_zero_len_id */
+	{336068821, "ERASE RDB$GENERATORS failed"},		/* del_gen_fail */
 	{336068822, "Sequence {0} not found"},		/* dyn_gen_not_found */
+	{336068823, "Difference file is not defined"},
+	{336068824, "Difference file is already defined"},
+	{336068825, "Database is already in the physical backup mode"},
+	{336068826, "Database is not in the physical backup mode"},
+	{336068827, "DEFINE COLLATION failed"},
+	{336068828, "CREATE COLLATION statement is not supported in older versions of the database.  A backup and restore is required."},
 	{336068829, "Maximum number of collations per character set exceeded"},		/* max_coll_per_charset */
 	{336068830, "Invalid collation attributes"},		/* invalid_coll_attr */
+	{336068831, "Collation {0} not installed for character set {1}"},
+	{336068832, "Cannot use the internal domain {0} as new type for field {1}"},
+	{336068833, "Default value is not allowed for array type in field {0}"},
+	{336068834, "Default value is not allowed for array type in domain {0}"},
+	{336068835, "DYN_UTIL_is_array failed for domain {0}"},
+	{336068836, "DYN_UTIL_copy_domain failed for domain {0}"},
+	{336068837, "Local column {0} doesn't have a default"},
+	{336068838, "Local column {0} default belongs to domain {1}"},
+	{336068839, "File name is invalid"},
 	{336068840, "{0} cannot reference {1}"},		/* dyn_wrong_gtt_scope */
+	{336068841, "Local column {0} is computed, cannot set a default value"},
+	{336068842, "ERASE RDB$COLLATIONS failed"},		/* del_coll_fail */
 	{336068843, "Collation {0} is used in table {1} (field name {2}) and cannot be dropped"},		/* dyn_coll_used_table */
 	{336068844, "Collation {0} is used in domain {1} and cannot be dropped"},		/* dyn_coll_used_domain */
 	{336068845, "Cannot delete system collation"},		/* dyn_cannot_del_syscoll */
 	{336068846, "Cannot delete default collation of CHARACTER SET {0}"},		/* dyn_cannot_del_def_coll */
+	{336068847, "Domain {0} is used in procedure {1} (parameter name {2}) and cannot be dropped"},
+	{336068848, "Field {0} cannot be used twice in index {1}"},
 	{336068849, "Table {0} not found"},		/* dyn_table_not_found */
+	{336068850, "attempt to reference a view ({0}) in a foreign key"},
 	{336068851, "Collation {0} is used in procedure {1} (parameter name {2}) and cannot be dropped"},		/* dyn_coll_used_procedure */
 	{336068852, "New scale specified for column {0} must be at most {1}."},		/* dyn_scale_too_big */
 	{336068853, "New precision specified for column {0} must be at least {1}."},		/* dyn_precision_too_small */
+	{336068854, "{0} is not grantor of {1} on {2} to {3}."},
 	{336068855, "Warning: {0} on {1} is not granted to {2}."},		/* dyn_miss_priv_warning */
 	{336068856, "Feature '{0}' is not supported in ODS {1}.{2}"},		/* dyn_ods_not_supp_feature */
 	{336068857, "Cannot add or remove COMPUTED from column {0}"},		/* dyn_cannot_addrem_computed */
 	{336068858, "Password should not be empty string"},		/* dyn_no_empty_pw */
 	{336068859, "Index {0} already exists"},		/* dyn_dup_index */
+	{336068860, "Only {0} or user with privilege USE_GRANTED_BY_CLAUSE can use GRANTED BY clause"},		/* dyn_locksmith_use_granted */
+	{336068861, "Exception {0} already exists"},		/* dyn_dup_exception */
+	{336068862, "Sequence {0} already exists"},		/* dyn_dup_generator */
+	{336068863, "ERASE RDB$USER_PRIVILEGES failed in REVOKE ALL ON ALL"},
 	{336068864, "Package {0} not found"},		/* dyn_package_not_found */
 	{336068865, "Schema {0} not found"},		/* dyn_schema_not_found */
 	{336068866, "Cannot ALTER or DROP system procedure {0}"},		/* dyn_cannot_mod_sysproc */
@@ -1110,22 +1428,37 @@ internal static class IscErrorMessages
 	{336068873, "Function {0} has a signature mismatch on package body {1}"},		/* dyn_funcsignat_package */
 	{336068874, "Procedure {0} has a signature mismatch on package body {1}"},		/* dyn_procsignat_package */
 	{336068875, "Default values for parameters are not allowed in the definition of a previously declared packaged procedure {0}.{1}"},		/* dyn_defvaldecl_package_proc */
+	{336068876, "Function {0} already exists"},		/* dyn_dup_function */
 	{336068877, "Package body {0} already exists"},		/* dyn_package_body_exists */
 	{336068878, "Invalid DDL statement for function {0}"},		/* dyn_invalid_ddl_func */
 	{336068879, "Cannot alter new style function {0} with ALTER EXTERNAL FUNCTION. Use ALTER FUNCTION instead."},		/* dyn_newfc_oldsyntax */
+	{336068880, "Cannot delete system generator {0}"},
+	{336068881, "Identity column {0} of table {1} must be of exact number type with zero scale"},
+	{336068882, "Identity column {0} of table {1} cannot be changed to NULLable"},
+	{336068883, "Identity column {0} of table {1} cannot have default value"},
+	{336068884, "Domain {0} must be of exact number type with zero scale because it's used in an identity column"},
+	{336068885, "Generation of generator name failed"},
 	{336068886, "Parameter {0} in function {1} not found"},		/* dyn_func_param_not_found */
 	{336068887, "Parameter {0} of routine {1} not found"},		/* dyn_routine_param_not_found */
 	{336068888, "Parameter {0} of routine {1} is ambiguous (found in both procedures and functions). Use a specifier keyword."},		/* dyn_routine_param_ambiguous */
 	{336068889, "Collation {0} is used in function {1} (parameter name {2}) and cannot be dropped"},		/* dyn_coll_used_function */
 	{336068890, "Domain {0} is used in function {1} (parameter name {2}) and cannot be dropped"},		/* dyn_domain_used_function */
 	{336068891, "ALTER USER requires at least one clause to be specified"},		/* dyn_alter_user_no_clause */
+	{336068892, "Cannot delete system SQL role {0}"},
+	{336068893, "Column {0} is not an identity column"},
 	{336068894, "Duplicate {0} {1}"},		/* dyn_duplicate_package_item */
 	{336068895, "System {0} {1} cannot be modified"},		/* dyn_cant_modify_sysobj */
 	{336068896, "INCREMENT BY 0 is an illegal option for sequence {0}"},		/* dyn_cant_use_zero_increment */
 	{336068897, "Can't use {0} in FOREIGN KEY constraint"},		/* dyn_cant_use_in_foreignkey */
 	{336068898, "Default values for parameters are not allowed in the definition of a previously declared packaged function {0}.{1}"},		/* dyn_defvaldecl_package_func */
+	{336068899, "Password must be specified when creating user"},		/* dyn_create_user_no_password */
 	{336068900, "role {0} can not be granted to role {1}"},		/* dyn_cyclic_role */
+	{336068901, "DROP SYSTEM PRIVILEGES should not be used in CREATE ROLE operator"},
+	{336068902, "Access to SYSTEM PRIVILEGES in ROLES denied to {0}"},
+	{336068903, "Only {0}, DB owner {1} or user with privilege USE_GRANTED_BY_CLAUSE can use GRANTED BY clause"},
 	{336068904, "INCREMENT BY 0 is an illegal option for identity column {0} of table {1}"},		/* dyn_cant_use_zero_inc_ident */
+	{336068905, "Concurrent ALTER DATABASE is not supported"},		/* dyn_concur_alter_database */
+	{336068906, "Incompatible ALTER DATABASE clauses: '{0}' and '{1}'"},		/* dyn_incompat_alter_database */
 	{336068907, "no {0} privilege with grant option on DDL {1}"},		/* dyn_no_ddl_grant_opt_priv */
 	{336068908, "no {0} privilege with grant option on object {1}"},		/* dyn_no_grant_opt_priv */
 	{336068909, "Function {0} does not exist"},		/* dyn_func_not_exist */
@@ -1137,6 +1470,7 @@ internal static class IscErrorMessages
 	{336068915, "Exception {0} does not exist"},		/* dyn_exc_not_exist */
 	{336068916, "Generator/Sequence {0} does not exist"},		/* dyn_gen_not_exist */
 	{336068917, "Field {0} of table {1} does not exist"},		/* dyn_fld_not_exist */
+	{336330752, "could not locate appropriate error message"},
 	{336330753, "found unknown switch"},		/* gbak_unknown_switch */
 	{336330754, "page size parameter missing"},		/* gbak_page_size_missing */
 	{336330755, "Page size specified ({0}) greater than limit (32768 bytes)"},		/* gbak_page_size_toobig */
@@ -1152,6 +1486,10 @@ internal static class IscErrorMessages
 	{336330765, "REPLACE specified, but the first file {0} is a database"},		/* gbak_db_specified */
 	{336330766, "database {0} already exists.  To replace it, use the -REP switch"},		/* gbak_db_exists */
 	{336330767, "device type not specified"},		/* gbak_unk_device */
+	{336330768, "cannot create APOLLO tape descriptor file {0}"},
+	{336330769, "cannot set APOLLO tape descriptor attribute for {0}"},
+	{336330770, "cannot create APOLLO cartridge descriptor file {0}"},
+	{336330771, "cannot close APOLLO tape descriptor file {0}"},
 	{336330772, "gds_$blob_info failed"},		/* gbak_blob_info_failed */
 	{336330773, "do not understand BLOB INFO item {0}"},		/* gbak_unk_blob_item */
 	{336330774, "gds_$get_segment failed"},		/* gbak_get_seg_failed */
@@ -1185,27 +1523,212 @@ internal static class IscErrorMessages
 	{336330802, "unexpected end of file on backup file"},		/* gbak_unexp_eof */
 	{336330803, "database format {0} is too old to restore to"},		/* gbak_db_format_too_old */
 	{336330804, "array dimension for column {0} is invalid"},		/* gbak_inv_array_dim */
+	{336330805, "expected array version number {0} but instead found {1}"},
+	{336330806, "expected array dimension {0} but instead found {1}"},
 	{336330807, "Expected XDR record length"},		/* gbak_xdr_len_expected */
+	{336330808, "Unexpected I/O error while {0} backup file"},
+	{336330809, "adding file {0}, starting at page {1}"},
+	{336330810, "array"},
+	{336330811, "backup"},
+	{336330812, "    {0}B(ACKUP_DATABASE)    backup database to file"},
+	{336330813, "\t\tbackup file is compressed"},
+	{336330814, "    {0}D(EVICE)             backup file device type on APOLLO (CT or MT)"},
+	{336330815, "    {0}M(ETA_DATA)          backup or restore metadata only"},
+	{336330816, "blob"},
 	{336330817, "cannot open backup file {0}"},		/* gbak_open_bkup_error */
 	{336330818, "cannot open status and error output file {0}"},		/* gbak_open_error */
+	{336330819, "closing file, committing, and finishing"},
+	{336330820, "committing metadata"},
+	{336330821, "commit failed on table {0}"},
+	{336330822, "committing secondary files"},
+	{336330823, "creating index {0}"},
+	{336330824, "committing data for table {0}"},
+	{336330825, "    {0}C(REATE_DATABASE)    create database from backup file (restore)"},
+	{336330826, "created database {0}, page_size {1} bytes"},
+	{336330827, "creating file {0}"},
+	{336330828, "creating indexes"},
+	{336330829, "database {0} has a page size of {1} bytes."},
+	{336330830, "    {0}I(NACTIVE)           deactivate indexes during restore"},
+	{336330831, "do not understand BLOB INFO item {0}"},
+	{336330832, "do not recognize {0} attribute {1} -- continuing"},
+	{336330833, "error accessing BLOB column {0} -- continuing"},
+	{336330834, "Exiting before completion due to errors"},
+	{336330835, "Exiting before completion due to errors"},
+	{336330836, "column"},
+	{336330837, "file"},
+	{336330838, "file length"},
+	{336330839, "filter"},
+	{336330840, "finishing, closing, and going home"},
+	{336330841, "function"},
+	{336330842, "function argument"},
+	{336330843, "gbak version {0}"},
+	{336330844, "domain"},
+	{336330845, "index"},
+	{336330846, "trigger {0} is invalid"},
+	{336330847, "legal switches are:"},
+	{336330848, "length given for initial file ({0}) is less than minimum ({1})"},
+	{336330849, "    {0}E(XPAND)             no data compression"},
+	{336330850, "    {0}L(IMBO)              ignore transactions in limbo"},
+	{336330851, "    {0}O(NE_AT_A_TIME)      restore one table at a time"},
+	{336330852, "opened file {0}"},
+	{336330853, "    {0}P(AGE_SIZE)          override default page size"},
+	{336330854, "page size"},
+	{336330855, "page size specified ({0} bytes) rounded up to {1} bytes"},
+	{336330856, "    {0}Z                    print version number"},
+	{336330857, "privilege"},
+	{336330858, "     {0} records ignored"},
+	{336330859, "   {0} records restored"},
+	{336330860, "{0} records written"},
+	{336330861, "    {0}Y  <path>            redirect/suppress status message output"},
+	{336330862, "Reducing the database page size from {0} bytes to {1} bytes"},
+	{336330863, "table"},
+	{336330864, "    {0}REP(LACE_DATABASE)   replace database from backup file (restore)"},
+	{336330865, "    {0}V(ERIFY)             report each action taken"},
+	{336330866, "restore failed for record in table {0}"},
+	{336330867, "    restoring column {0}"},
+	{336330868, "    restoring file {0}"},
+	{336330869, "    restoring filter {0}"},
+	{336330870, "restoring function {0}"},
+	{336330871, "    restoring argument for function {0}"},
+	{336330872, "     restoring gen id value of: {0}"},
+	{336330873, "restoring domain {0}"},
+	{336330874, "    restoring index {0}"},
+	{336330875, "    restoring privilege for user {0}"},
+	{336330876, "restoring data for table {0}"},
+	{336330877, "restoring security class {0}"},
+	{336330878, "    restoring trigger {0}"},
+	{336330879, "    restoring trigger message for {0}"},
+	{336330880, "    restoring type {0} for column {1}"},
+	{336330881, "started transaction"},
+	{336330882, "starting transaction"},
+	{336330883, "security class"},
+	{336330884, "switches can be abbreviated to the unparenthesized characters"},
+	{336330885, "transportable backup -- data in XDR format"},
+	{336330886, "trigger"},
+	{336330887, "trigger message"},
+	{336330888, "trigger type"},
+	{336330889, "unknown switch \"{0}\""},
+	{336330890, "validation error on column in table {0}"},
+	{336330891, "    Version(s) for database \"{0}\""},
+	{336330892, "view"},
+	{336330893, "    writing argument for function {0}"},
+	{336330894, "    writing data for table {0}"},
+	{336330895, "     writing gen id of: {0}"},
+	{336330896, "         writing column {0}"},
+	{336330897, "    writing filter {0}"},
+	{336330898, "writing filters"},
+	{336330899, "    writing function {0}"},
+	{336330900, "writing functions"},
+	{336330901, "    writing domain {0}"},
+	{336330902, "writing domains"},
+	{336330903, "    writing index {0}"},
+	{336330904, "    writing privilege for user {0}"},
+	{336330905, "    writing table {0}"},
+	{336330906, "writing tables"},
+	{336330907, "    writing security class {0}"},
+	{336330908, "    writing trigger {0}"},
+	{336330909, "    writing trigger message for {0}"},
+	{336330910, "writing trigger messages"},
+	{336330911, "writing triggers"},
+	{336330912, "    writing type {0} for column {1}"},
+	{336330913, "writing types"},
+	{336330914, "writing shadow files"},
+	{336330915, "    writing shadow file {0}"},
+	{336330916, "writing id generators"},
+	{336330917, "    writing generator {0} value {1}"},
+	{336330918, "readied database {0} for backup"},
+	{336330919, "restoring table {0}"},
+	{336330920, "type"},
+	{336330921, "gbak:"},
+	{336330922, "committing metadata for table {0}"},
+	{336330923, "error committing metadata for table {0}"},
+	{336330924, "    {0}K(ILL)               restore without creating shadows"},
+	{336330925, "cannot commit index {0}"},
+	{336330926, "cannot commit files"},
+	{336330927, "    {0}T(RANSPORTABLE)      transportable backup -- data in XDR format"},
+	{336330928, "closing file, committing, and finishing. {0} bytes written"},
+	{336330929, "    {0}G(ARBAGE_COLLECT)    inhibit garbage collection"},
+	{336330930, "    {0}IG(NORE)             ignore bad checksums"},
+	{336330931, "\tcolumn {0} used in index {1} seems to have vanished"},
+	{336330932, "index {0} omitted because {1} of the expected {2} keys were found"},
+	{336330933, "    {0}FA(CTOR)             blocking factor"},
 	{336330934, "blocking factor parameter missing"},		/* gbak_missing_block_fac */
 	{336330935, "expected blocking factor, encountered \"{0}\""},		/* gbak_inv_block_fac */
 	{336330936, "a blocking factor may not be used in conjunction with device CT"},		/* gbak_block_fac_specified */
+	{336330937, "restoring generator {0} value: {1}"},
+	{336330938, "    {0}OL(D_DESCRIPTIONS)   save old style metadata descriptions"},
+	{336330939, "    {0}N(O_VALIDITY)        do not restore database validity conditions"},
 	{336330940, "user name parameter missing"},		/* gbak_missing_username */
 	{336330941, "password parameter missing"},		/* gbak_missing_password */
+	{336330942, "    {0}PAS(SWORD)           Firebird password"},
+	{336330943, "    {0}USER                 Firebird user name"},
+	{336330944, "writing stored procedures"},
+	{336330945, "writing stored procedure {0}"},
+	{336330946, "writing parameter {0} for stored procedure"},
+	{336330947, "restoring stored procedure {0}"},
+	{336330948, "    restoring parameter {0} for stored procedure"},
+	{336330949, "writing exceptions"},
+	{336330950, "writing exception {0}"},
+	{336330951, "restoring exception {0}"},
 	{336330952, " missing parameter for the number of bytes to be skipped"},		/* gbak_missing_skipped_bytes */
 	{336330953, "expected number of bytes to be skipped, encountered \"{0}\""},		/* gbak_inv_skipped_bytes */
+	{336330954, "adjusting an invalid decompression length from {0} to {1}"},
+	{336330955, "skipped {0} bytes after reading a bad attribute {1}"},
+	{336330956, "    {0}S(KIP_BAD_DATA)      skip number of bytes after reading bad data"},
+	{336330957, "skipped {0} bytes looking for next valid attribute, encountered attribute {1}"},
+	{336330958, "writing table constraints"},
+	{336330959, "writing constraint {0}"},
+	{336330960, "table constraint"},
+	{336330961, "writing referential constraints"},
+	{336330962, "writing check constraints"},
+	{336330963, "writing character sets"},		/* msgVerbose_write_charsets */
+	{336330964, "writing collations"},		/* msgVerbose_write_collations */
 	{336330965, "character set"},		/* gbak_err_restore_charset */
+	{336330966, "writing character set {0}"},		/* msgVerbose_restore_charset */
 	{336330967, "collation"},		/* gbak_err_restore_collation */
+	{336330968, "writing collation {0}"},		/* msgVerbose_restore_collation */
 	{336330972, "Unexpected I/O error while reading from backup file"},		/* gbak_read_error */
 	{336330973, "Unexpected I/O error while writing to backup file"},		/* gbak_write_error */
+	{336330974, "\n\nCould not open file name \"{0}\""},
+	{336330975, "\n\nCould not write to file \"{0}\""},
+	{336330976, "\n\nCould not read from file \"{0}\""},
+	{336330977, "Done with volume #{0}, \"{1}\""},
+	{336330978, "\tPress return to reopen that file, or type a new\n\tname followed by return to open a different file."},
+	{336330979, "Type a file name to open and hit return"},
+	{336330980, "  Name: "},
+	{336330981, "\n\nERROR: Backup incomplete"},
+	{336330982, "Expected backup start time {0}, found {1}"},
+	{336330983, "Expected backup database {0}, found {1}"},
+	{336330984, "Expected volume number {0}, found volume {1}"},
 	{336330985, "could not drop database {0} (no privilege or database might be in use)"},		/* gbak_db_in_use */
+	{336330986, "Skipped bad security class entry: {0}"},
+	{336330987, "Unknown V3 SUB_TYPE: {0} in FIELD: {1}."},
+	{336330988, "Converted V3 sub_type: {0} to character_set_id: {1} and collate_id: {2}."},
+	{336330989, "Converted V3 scale: {0} to character_set_id: {1} and callate_id: {2}."},
 	{336330990, "System memory exhausted"},		/* gbak_sysmemex */
+	{336330991, "    {0}NT                   Non-Transportable backup file format"},
+	{336330992, "Index \"{0}\" failed to activate because:"},
+	{336330993, "  The unique index has duplicate values or NULLs."},
+	{336330994, "  Delete or Update duplicate values or NULLs, and activate index with"},
+	{336330995, "  ALTER INDEX \"{0}\" ACTIVE;"},
+	{336330996, "  Not enough disk space to create the sort file for an index."},
+	{336330997, "  Set the TMP environment variable to a directory on a filesystem that does have enough space, and activate index with"},
+	{336330998, "Database is not online due to failure to activate one or more indices."},
+	{336330999, "Run gfix -online to bring database online without active indices."},
+	{336331000, "writing SQL roles"},		/* write_role_1 */
+	{336331001, "    writing SQL role: {0}"},		/* write_role_2 */
 	{336331002, "SQL role"},		/* gbak_restore_role_failed */
+	{336331003, "    restoring SQL role: {0}"},		/* restore_role */
+	{336331004, "    {0}RO(LE)               Firebird SQL role"},		/* gbak_role_op */
 	{336331005, "SQL role parameter missing"},		/* gbak_role_op_missing */
+	{336331006, "    {0}CO(NVERT)            backup external files as tables"},		/* gbak_convert_ext_tables */
+	{336331007, "gbak: WARNING:"},		/* gbak_warning */
+	{336331008, "gbak: ERROR:"},		/* gbak_error */
+	{336331009, "    {0}BU(FFERS)            override page buffers default"},		/* gbak_page_buffers */
 	{336331010, "page buffers parameter missing"},		/* gbak_page_buffers_missing */
 	{336331011, "expected page buffers, encountered \"{0}\""},		/* gbak_page_buffers_wrong_param */
 	{336331012, "page buffers is allowed only on restore or create"},		/* gbak_page_buffers_restore */
+	{336331013, "Starting with volume #{0}, \"{1}\""},
 	{336331014, "size specification either missing or incorrect for file {0}"},		/* gbak_inv_size */
 	{336331015, "file {0} out of sequence"},		/* gbak_file_outof_sequence */
 	{336331016, "can't join -- one of the files missing"},		/* gbak_join_file_missing */
@@ -1216,25 +1739,300 @@ internal static class IscErrorMessages
 	{336331021, "can't write a header record to file {0}"},		/* gbak_hdr_write_failed */
 	{336331022, "free disk space exhausted"},		/* gbak_disk_space_ex */
 	{336331023, "file size given ({0}) is less than minimum allowed ({1})"},		/* gbak_size_lt_min */
+	{336331024, "Warning -- free disk space exhausted for file {0}, the rest of the bytes ({1}) will be written to file {2}"},
 	{336331025, "service name parameter missing"},		/* gbak_svc_name_missing */
 	{336331026, "Cannot restore over current database, must be SYSDBA or owner of the existing database."},		/* gbak_not_ownr */
+	{336331027, ""},
+	{336331028, "    {0}USE_(ALL_SPACE)      do not reserve space for record versions"},
+	{336331029, "    {0}SE(RVICE)            use services manager"},
+	{336331030, "    {0}MO(DE) <access>      \"read_only\" or \"read_write\" access"},		/* gbak_opt_mode */
 	{336331031, "\"read_only\" or \"read_write\" required"},		/* gbak_mode_req */
+	{336331032, "setting database to read-only access"},
 	{336331033, "just data ignore all constraints etc."},		/* gbak_just_data */
 	{336331034, "restoring data only ignoring foreign key, unique, not null & other constraints"},		/* gbak_data_only */
+	{336331035, "closing file, committing, and finishing. {0} bytes written"},
+	{336331036, "    {0}R(ECREATE_DATABASE) [O(VERWRITE)] create (or replace if OVERWRITE used)\\n\t\t\t\tdatabase from backup file (restore)"},
+	{336331037, "    activating and creating deferred index {0}"},		/* gbak_activating_idx */
+	{336331038, "check constraint"},
+	{336331039, "exception"},
+	{336331040, "array dimensions"},
+	{336331041, "generator"},
+	{336331042, "procedure"},
+	{336331043, "procedure parameter"},
+	{336331044, "referential constraint"},
+	{336331045, "type (in RDB$TYPES)"},
+	{336331046, "    {0}NOD(BTRIGGERS)       do not run database triggers"},
+	{336331047, "    {0}TRU(STED)            use trusted authentication"},
+	{336331048, "writing names mapping"},		/* write_map_1 */
+	{336331049, "    writing map for {0}"},		/* write_map_2 */
+	{336331050, "    restoring map for {0}"},		/* get_map_1 */
+	{336331051, "name mapping"},		/* get_map_2 */
+	{336331052, "cannot restore arbitrary mapping"},		/* get_map_3 */
+	{336331053, "restoring names mapping"},		/* get_map_4 */
+	{336331054, "    {0}FIX_FSS_D(ATA)       fix malformed UNICODE_FSS data"},
+	{336331055, "    {0}FIX_FSS_M(ETADATA)   fix malformed UNICODE_FSS metadata"},
+	{336331056, "Character set parameter missing"},
+	{336331057, "Character set {0} not found"},
+	{336331058, "    {0}FE(TCH_PASSWORD)     fetch password from file"},
+	{336331059, "too many passwords provided"},
+	{336331060, "could not open password file {0}, errno {1}"},
+	{336331061, "could not read password file {0}, errno {1}"},
+	{336331062, "empty password file {0}"},
+	{336331063, "Attribute {0} was already processed for exception {1}"},
+	{336331064, "Skipping attribute {0} because the message already exists for exception {1}"},
+	{336331065, "Trying to recover from unexpected attribute {0} due to wrong message length for exception {1}"},
+	{336331066, "Attribute not specified for storing text bigger than 255 bytes"},
+	{336331067, "Unable to store text bigger than 65536 bytes"},
+	{336331068, "Failed while adjusting the security class name"},
+	{336331069, "Usage:"},
+	{336331070, "     gbak -b <db set> <backup set> [backup options] [general options]"},
+	{336331071, "     gbak -c <backup set> <db set> [restore options] [general options]"},
+	{336331072, "     <db set> = <database> | <db1 size1>...<dbN> (size in db pages)"},
+	{336331073, "     <backup set> = <backup> | <bk1 size1>...<bkN> (size in bytes = n[K|M|G])"},
+	{336331074, "     -recreate overwrite and -replace can be used instead of -c"},
+	{336331075, "backup options are:"},
+	{336331076, "restore options are:"},
+	{336331077, "general options are:"},
 	{336331078, "verbose interval value parameter missing"},		/* gbak_missing_interval */
 	{336331079, "verbose interval value cannot be smaller than {0}"},		/* gbak_wrong_interval */
+	{336331080, "    {0}VERBI(NT) <n>        verbose information with explicit interval"},
 	{336331081, "verify (verbose) and verbint options are mutually exclusive"},		/* gbak_verify_verbint */
 	{336331082, "option -{0} is allowed only on restore or create"},		/* gbak_option_only_restore */
 	{336331083, "option -{0} is allowed only on backup"},		/* gbak_option_only_backup */
 	{336331084, "options -{0} and -{1} are mutually exclusive"},		/* gbak_option_conflict */
 	{336331085, "parameter for option -{0} was already specified with value \"{1}\""},		/* gbak_param_conflict */
 	{336331086, "option -{0} was already specified"},		/* gbak_option_repeated */
+	{336331087, "writing package {0}"},
+	{336331088, "writing packages"},
+	{336331089, "restoring package {0}"},
+	{336331090, "package"},
 	{336331091, "dependency depth greater than {0} for view {1}"},		/* gbak_max_dbkey_recursion */
 	{336331092, "value greater than {0} when calculating length of rdb$db_key for view {1}"},		/* gbak_max_dbkey_length */
 	{336331093, "Invalid metadata detected. Use -FIX_FSS_METADATA option."},		/* gbak_invalid_metadata */
 	{336331094, "Invalid data detected. Use -FIX_FSS_DATA option."},		/* gbak_invalid_data */
+	{336331095, "text for attribute {0} is too large in {1}, truncating to {2} bytes"},
 	{336331096, "Expected backup version {1}..{2}.  Found {0}"},		/* gbak_inv_bkup_ver2 */
+	{336331097, "    writing view {0}"},
+	{336331098, "    table {0} is a view"},
+	{336331099, "writing security classes"},
 	{336331100, "database format {0} is too old to backup"},		/* gbak_db_format_too_old2 */
+	{336331101, "backup version is {0}"},
+	{336331102, "adjusting system generators"},
+	{336331103, "Error closing database, but backup file is OK"},
+	{336331104, "database"},
+	{336331105, "required mapping attributes are missing in backup file"},
+	{336331106, "missing regular expression to skip tables"},
+	{336331107, "    {0}SKIP_D(ATA)          skip data for table"},
+	{336331108, "regular expression to skip tables was already set"},
+	{336331109, "adjusting views dbkey length"},
+	{336331110, "updating ownership of packages, procedures and tables"},
+	{336331111, "adding missing privileges"},
+	{336331112, "adjusting the ONLINE and FORCED WRITES flags"},
+	{336331113, "    {0}ST(ATISTICS) TDRW    show statistics:"},
+	{336331114, "        T                 time from start"},
+	{336331115, "        D                 delta time"},
+	{336331116, "        R                 page reads"},
+	{336331117, "        W                 page writes"},
+	{336331118, "statistics parameter missing"},		/* gbak_missing_perf */
+	{336331119, "wrong char \"{0}\" at statistics parameter"},		/* gbak_wrong_perf */
+	{336331120, "too many chars at statistics parameter"},		/* gbak_too_long_perf */
+	{336331121, "total statistics"},
+	{336331122, "could not append BLOB data to batch"},
+	{336331123, "could not start batch when restoring table {0}, trying old way"},
+	{336331124, "    {0}KEYNAME              name of a key to be used for encryption"},
+	{336331125, "    {0}CRYPT                crypt plugin name"},
+	{336331126, "    {0}ZIP                  backup file is in zip compressed format"},
+	{336331127, "Keyname parameter missing"},
+	{336331128, "Key holder parameter missing but backup file is encrypted"},
+	{336331129, "CryptPlugin parameter missing"},
+	{336331130, "Unknown crypt plugin name - use -CRYPT switch"},
+	{336331131, "Inflate error {0}"},
+	{336331132, "Deflate error {0}"},
+	{336331133, "Key holder parameter missing"},
+	{336331134, "    {0}KEYHOLDER            name of a key holder plugin"},
+	{336331135, "Decompression stream init error {0}"},
+	{336331136, "Compression stream init error {0}"},
+	{336331137, "Invalid reply from getInfo() when waiting for DB encryption"},
+	{336331138, "Problems with just created database encryption"},
+	{336331139, "Skipped trigger {0} on system table {1}"},
+	{336331140, "    {0}INCLUDE(_DATA)       backup data of table(s)"},
+	{336331141, "missing regular expression to include tables"},
+	{336331142, "regular expression to include tables was already set"},
+	{336331143, "writing database create grants"},
+	{336331144, "    database create grant for {0}"},
+	{336331145, "    restoring database create grant for {0}"},
+	{336331146, "restoring database create grants"},
+	{336331147, "database create grant"},
+	{336331148, "writing publications"},
+	{336331149, "    writing publication {0}"},
+	{336331150, "    writing publication for table {0}"},
+	{336331151, "restoring publication {0}"},
+	{336331152, "publication"},
+	{336331153, "restoring publication for table {0}"},
+	{336331154, "publication for table"},
+	{336331155, "    {0}REPLICA <mode>      \"none\", \"read_only\" or \"read_write\" replica mode"},		/* gbak_opt_replica */
+	{336331156, "\"none\", \"read_only\" or \"read_write\" required"},		/* gbak_replica_req */
+	{336331157, "could not access batch parameters"},
+	{336331158, "    {0}PAR(ALLEL)           parallel workers"},
+	{336331159, "parallel workers parameter missing"},		/* gbak_missing_prl_wrks */
+	{336331160, "expected parallel workers, encountered \"{0}\""},		/* gbak_inv_prl_wrks */
+	{336331161, "    {0}D(IRECT_IO)          direct IO for backup file(s)"},
+	{336331162, "use up to {0} parallel workers"},
+	{336396289, "Firebird error"},
+	{336396362, "Rollback not performed"},
+	{336396364, "Connection error"},
+	{336396365, "Connection not established"},
+	{336396366, "Connection authorization failure."},
+	{336396375, "deadlock"},
+	{336396376, "Unsuccessful execution caused by deadlock."},
+	{336396377, "record from transaction {0} is stuck in limbo"},
+	{336396379, "operation completed with errors"},
+	{336396382, "the SQL statement cannot be executed"},
+	{336396384, "Unsuccessful execution caused by an unavailable resource."},
+	{336396386, "Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements"},
+	{336396387, "Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements"},
+	{336396446, "Wrong numeric type"},
+	{336396447, "too many versions"},
+	{336396448, "intermediate journal file full"},
+	{336396449, "journal file wrong format"},
+	{336396450, "database {0} shutdown in {1} seconds"},
+	{336396451, "restart shared cache manager"},
+	{336396452, "exception {0}"},
+	{336396453, "bad checksum"},
+	{336396454, "refresh range number {0} not found"},
+	{336396455, "expression evaluation not supported"},
+	{336396456, "FOREIGN KEY column count does not match PRIMARY KEY"},
+	{336396457, "Attempt to define a second PRIMARY KEY for the same table"},
+	{336396458, "column used with aggregate"},
+	{336396459, "invalid column reference"},
+	{336396460, "invalid key position"},
+	{336396461, "invalid direction for find operation"},
+	{336396462, "Invalid statement handle"},
+	{336396463, "invalid lock handle"},
+	{336396464, "invalid lock level {0}"},
+	{336396465, "invalid bookmark handle"},
+	{336396468, "wrong or obsolete version"},
+	{336396471, "The INSERT, UPDATE, DELETE, DDL or authorization statement cannot be executed because the transaction is inquiry only"},
+	{336396472, "external file could not be opened for output"},
+	{336396477, "multiple rows in singleton select"},
+	{336396478, "No subqueries permitted for VIEW WITH CHECK OPTION"},
+	{336396479, "DISTINCT, GROUP or HAVING not permitted for VIEW WITH CHECK OPTION"},
+	{336396480, "Only one table allowed for VIEW WITH CHECK OPTION"},
+	{336396481, "No WHERE clause for VIEW WITH CHECK OPTION"},
+	{336396482, "Only simple column names permitted for VIEW WITH CHECK OPTION"},
+	{336396484, "An error was found in the application program input parameters for the SQL statement."},
+	{336396485, "Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values"},
+	{336396486, "Arithmetic overflow or division by zero has occurred."},
+	{336396594, "cannot access column {0} in view {1}"},
+	{336396595, "Too many concurrent executions of the same request"},
+	{336396596, "maximum indexes per table ({0}) exceeded"},
+	{336396597, "new record size of {0} bytes is too big"},
+	{336396598, "segments not allowed in expression index {0}"},
+	{336396599, "wrong page type"},
+	{336396603, "invalid ARRAY or BLOB operation"},
+	{336396611, "{0} extension error"},
+	{336396624, "key size exceeds implementation restriction for index \"{0}\""},
+	{336396625, "definition error for index {0}"},
+	{336396628, "cannot create index"},
+	{336396651, "duplicate specification of {0} - not supported"},
+	{336396663, "The insert failed because a column definition includes validation constraints."},
+	{336396670, "Cannot delete object referenced by another object"},
+	{336396671, "Cannot modify object referenced by another object"},
+	{336396672, "Object is referenced by another object"},
+	{336396673, "lock on conflicts with existing lock"},
+	{336396681, "This operation is not defined for system tables."},
+	{336396683, "Inappropriate self-reference of column"},
+	{336396684, "Illegal array dimension range"},
+	{336396687, "database or file exists"},
+	{336396688, "sort error: corruption in data structure"},
+	{336396689, "node not supported"},
+	{336396690, "Shadow number must be a positive integer"},
+	{336396691, "Preceding file did not specify length, so {0} must include starting page number"},
+	{336396692, "illegal operation when at beginning of stream"},
+	{336396693, "the current position is on a crack"},
+	{336396735, "cannot modify an existing user privilege"},
+	{336396736, "user does not have the privilege to perform operation"},
+	{336396737, "This user does not have privilege to perform this operation on this object."},
+	{336396756, "transaction marked invalid by I/O error"},
+	{336396757, "Cannot prepare a CREATE DATABASE/SCHEMA statement"},
+	{336396758, "violation of FOREIGN KEY constraint \"{0}\""},
+	{336396769, "The prepare statement identifies a prepare statement with an open cursor"},
+	{336396770, "Unknown statement or request"},
+	{336396778, "Attempt to update non-updatable cursor"},
+	{336396780, "The cursor identified in the UPDATE or DELETE statement is not positioned on a row."},
+	{336396784, "Unknown cursor"},
+	{336396786, "The cursor identified in an OPEN statement is already open."},
+	{336396787, "The cursor identified in a FETCH or CLOSE statement is not open."},
+	{336396875, "Overflow occurred during data type conversion."},
+	{336396881, "null segment of UNIQUE KEY"},
+	{336396882, "subscript out of bounds"},
+	{336396886, "data operation not supported"},
+	{336396887, "invalid comparison operator for find operation"},
+	{336396974, "Cannot transliterate character between character sets"},
+	{336396975, "count of column list and variable list do not match"},
+	{336396985, "Incompatible column/host variable data type"},
+	{336396991, "Operation violates CHECK constraint {0} on view or table"},
+	{336396992, "internal Firebird consistency check (invalid RDB$CONSTRAINT_TYPE)"},
+	{336396993, "Cannot update constraints (RDB$RELATION_CONSTRAINTS)."},
+	{336396994, "Cannot delete CHECK constraint entry (RDB$CHECK_CONSTRAINTS)"},
+	{336396995, "Cannot update constraints (RDB$CHECK_CONSTRAINTS)."},
+	{336396996, "Cannot update constraints (RDB$REF_CONSTRAINTS)."},
+	{336396997, "Column used in a PRIMARY constraint must be NOT NULL."},
+	{336397004, "index {0} cannot be used in the specified plan"},
+	{336397005, "table {0} is referenced in the plan but not the from list"},
+	{336397006, "the table {0} is referenced twice; use aliases to differentiate"},
+	{336397007, "table {0} is not referenced in plan"},
+	{336397027, "Log file specification partition error"},
+	{336397028, "Cache or Log redefined"},
+	{336397029, "Write-ahead Log with shadowing configuration not allowed"},
+	{336397030, "Overflow log specification required for round-robin log"},
+	{336397031, "WAL defined; Cache Manager must be started first"},
+	{336397033, "Write-ahead Log without shared cache configuration not allowed"},
+	{336397034, "Cannot start WAL writer for the database {0}"},
+	{336397035, "WAL writer synchronization error for the database {0}"},
+	{336397036, "WAL setup error.  Please see Firebird log."},
+	{336397037, "WAL buffers cannot be increased.  Please see Firebird log."},
+	{336397038, "WAL writer - Journal server communication error.  Please see Firebird log."},
+	{336397039, "WAL I/O error.  Please see Firebird log."},
+	{336397040, "Unable to roll over; please see Firebird log."},
+	{336397041, "obsolete"},
+	{336397042, "obsolete"},
+	{336397043, "obsolete"},
+	{336397044, "obsolete"},
+	{336397045, "database does not use Write-ahead Log"},
+	{336397046, "Cannot roll over to the next log file {0}"},
+	{336397047, "obsolete"},
+	{336397048, "obsolete"},
+	{336397049, "Cache or Log size too small"},
+	{336397050, "Log record header too small at offset {0} in log file {1}"},
+	{336397051, "Incomplete log record at offset {0} in log file {1}"},
+	{336397052, "Unexpected end of log file {0} at offset {1}"},
+	{336397053, "Database name in the log file {0} is different"},
+	{336397054, "Log file {0} not closed properly; database recovery may be required"},
+	{336397055, "Log file {0} not latest in the chain but open flag still set"},
+	{336397056, "Invalid version of log file {0}"},
+	{336397057, "Log file header of {0} too small"},
+	{336397058, "obsolete"},
+	{336397069, "table {0} is not defined"},
+	{336397080, "invalid ORDER BY clause"},
+	{336397082, "Column does not belong to referenced table"},
+	{336397083, "column {0} is not defined in table {1}"},
+	{336397084, "Undefined name"},
+	{336397085, "Ambiguous column reference."},
+	{336397116, "function {0} is not defined"},
+	{336397117, "Invalid data type, length, or value"},
+	{336397118, "Invalid number of arguments"},
+	{336397126, "dbkey not available for multi-table views"},
+	{336397130, "number of columns does not match select list"},
+	{336397131, "must specify column name for view select expression"},
+	{336397133, "{0} is not a valid base table of the specified view"},
+	{336397137, "This column cannot be updated because it is derived from an SQL function or expression."},
+	{336397138, "The object of the INSERT, DELETE or UPDATE statement is a view for which the requested operation is not permitted."},
+	{336397183, "Invalid String"},
+	{336397184, "Invalid token"},
+	{336397185, "Invalid numeric literal"},
+	{336397203, "An error occurred while trying to update the security database"},
+	{336397204, "non-SQL security class defined"},
 	{336397205, "ODS versions before ODS{0} are not supported"},		/* dsql_too_old_ods */
 	{336397206, "Table {0} does not exist"},		/* dsql_table_not_found */
 	{336397207, "View {0} does not exist"},		/* dsql_view_not_found */
@@ -1365,6 +2163,388 @@ internal static class IscErrorMessages
 	{336397332, "String literal with {0} characters exceeds the maximum length of {1} characters for the {2} character set"},		/* dsql_string_char_length */
 	{336397333, "Too many BEGIN...END nesting. Maximum level is {0}"},		/* dsql_max_nesting */
 	{336397334, "RECREATE USER {0} failed"},		/* dsql_recreate_user_failed */
+	{336461924, "Row not found for fetch, update or delete, or the result of a query is an empty table."},
+	{336461925, "segment buffer length shorter than expected"},
+	{336462125, "Datatype needs modification"},
+	{336462436, "Duplicate column or domain name found."},
+	{336527507, "invalid block type encountered"},
+	{336527508, "wrong packet type"},
+	{336527509, "cannot map page"},
+	{336527510, "request to allocate invalid block type"},
+	{336527511, "request to allocate block type larger than maximum size"},
+	{336527512, "memory pool free list is invalid"},
+	{336527513, "invalid pool id encountered"},
+	{336527514, "attempt to release free block"},
+	{336527515, "attempt to release block overlapping following free block"},
+	{336527516, "attempt to release block overlapping prior free block"},
+	{336527517, "cannot sort on a field that does not exist"},
+	{336527518, "database file not available"},
+	{336527519, "cannot assert logical lock"},
+	{336527520, "wrong ACL version"},
+	{336527521, "shadow block not found"},
+	{336527522, "shadow lock not synchronized properly"},
+	{336527523, "root file name not listed for shadow"},
+	{336527524, "failed to remove symbol from hash table"},
+	{336527525, "cannot find tip page"},
+	{336527526, "invalid rsb type"},
+	{336527527, "invalid SEND request"},
+	{336527528, "looper: action not yet implemented"},
+	{336527529, "return data type not supported"},
+	{336527530, "unexpected reply from journal server"},
+	{336527531, "journal server is incompatible version"},
+	{336527532, "journal server refused connection"},
+	{336527533, "referenced index description not found"},
+	{336527534, "index key too big"},
+	{336527535, "partner index description not found"},
+	{336527536, "bad difference record"},
+	{336527537, "applied differences will not fit in record"},
+	{336527538, "record length inconsistent"},
+	{336527539, "decompression overran buffer"},
+	{336527540, "cannot reposition for update after sort for RMS"},
+	{336527541, "external access type not implemented"},
+	{336527542, "differences record too long"},
+	{336527543, "wrong record length"},
+	{336527544, "limbo impossible"},
+	{336527545, "wrong record version"},
+	{336527546, "record disappeared"},
+	{336527547, "cannot delete system tables"},
+	{336527548, "cannot update erased record"},
+	{336527549, "comparison not supported for specified data types"},
+	{336527550, "conversion not supported for specified data types"},
+	{336527551, "conversion error"},
+	{336527552, "overflow during conversion"},
+	{336527553, "null or invalid array"},
+	{336527554, "BLOB not found"},
+	{336527555, "cannot update old BLOB"},
+	{336527556, "relation for array not known"},
+	{336527557, "field for array not known"},
+	{336527558, "array subscript computation error"},
+	{336527559, "expected field node"},
+	{336527560, "invalid BLOB ID"},
+	{336527561, "cannot find BLOB page"},
+	{336527562, "unknown data type"},
+	{336527563, "shadow block not found for extend file"},
+	{336527564, "index inconsistent"},
+	{336527565, "index bucket overfilled"},
+	{336527566, "exceeded index level"},
+	{336527567, "page already in use"},
+	{336527568, "page not accessed for write"},
+	{336527569, "attempt to release page not acquired"},
+	{336527570, "page in use during flush"},
+	{336527571, "attempt to remove page from dirty page list when not there"},
+	{336527572, "CCH_precedence: block marked"},
+	{336527573, "insufficient cache size"},
+	{336527574, "no cache buffers available for reuse"},
+	{336527575, "page {0}, page type {1} lock conversion denied"},
+	{336527576, "page {0}, page type {1} lock denied"},
+	{336527577, "buffer marked for update"},
+	{336527578, "CCH: {0}, status = {1} (218)"},
+	{336527579, "request of unknown resource"},
+	{336527580, "release of unknown resource"},
+	{336527581, "(CMP) copy: cannot remap"},
+	{336527582, "bad BLR -- invalid stream"},
+	{336527583, "argument of scalar operation must be an array"},
+	{336527584, "quad word arithmetic not supported"},
+	{336527585, "data type not supported for arithmetic"},
+	{336527586, "request size limit exceeded"},
+	{336527587, "cannot access field {0} in view {1}"},
+	{336527588, "cannot access field in view {0}"},
+	{336527589, "EVL_assign_to: invalid operation"},
+	{336527590, "EVL_bitmap: invalid operation"},
+	{336527591, "EVL_boolean: invalid operation"},
+	{336527592, "EVL_expr: invalid operation"},
+	{336527593, "eval_statistical: invalid operation"},
+	{336527594, "Unimplemented conversion, FAO directive O,Z,S"},
+	{336527595, "Unimplemented conversion, FAO directive X,U"},
+	{336527596, "Error parsing RDB FAO msg string"},
+	{336527597, "Error parsing RDB FAO msg str"},
+	{336527598, "unknown parameter in RdB status vector"},
+	{336527599, "Firebird status vector inconsistent"},
+	{336527600, "Firebird/RdB message parameter inconsistency"},
+	{336527601, "error parsing RDB FAO message string"},
+	{336527602, "unimplemented FAO directive"},
+	{336527603, "missing pointer page in DPM_data_pages"},
+	{336527604, "Fragment does not exist"},
+	{336527605, "pointer page disappeared in DPM_delete"},
+	{336527606, "pointer page lost from DPM_delete_relation"},
+	{336527607, "missing pointer page in DPM_dump"},
+	{336527608, "cannot find record fragment"},
+	{336527609, "pointer page vanished from DPM_next"},
+	{336527610, "temporary page buffer too small"},
+	{336527611, "damaged data page"},
+	{336527612, "header fragment length changed"},
+	{336527613, "pointer page vanished from extend_relation"},
+	{336527614, "pointer page vanished from relation list in locate_space"},
+	{336527615, "cannot find free space"},
+	{336527616, "pointer page vanished from mark_full"},
+	{336527617, "bad record in RDB$PAGES"},
+	{336527618, "page slot not empty"},
+	{336527619, "bad pointer page"},
+	{336527620, "index unexpectedly deleted"},
+	{336527621, "scalar operator used on field which is not an array"},
+	{336527622, "active"},
+	{336527623, "committed"},
+	{336527624, "rolled back"},
+	{336527625, "in an ill-defined state"},
+	{336527626, "next transaction older than oldest active transaction"},
+	{336527627, "next transaction older than oldest transaction"},
+	{336527628, "buffer marked during cache unwind"},
+	{336527629, "error in recovery! database corrupted"},
+	{336527630, "error in recovery! wrong data page record"},
+	{336527631, "error in recovery! no space on data page"},
+	{336527632, "error in recovery! wrong header page record"},
+	{336527633, "error in recovery! wrong generator page record"},
+	{336527634, "error in recovery! wrong b-tree page record"},
+	{336527635, "error in recovery! wrong page inventory page record"},
+	{336527636, "error in recovery! wrong pointer page record"},
+	{336527637, "error in recovery! wrong index root page record"},
+	{336527638, "error in recovery! wrong transaction page record"},
+	{336527639, "error in recovery! out of sequence log record encountered"},
+	{336527640, "error in recovery! unknown page type"},
+	{336527641, "error in recovery! unknown record type"},
+	{336527642, "journal server cannot archive to specified archive directory"},
+	{336527643, "checksum error in log record when reading from log file"},
+	{336527644, "cannot restore singleton select data"},
+	{336527645, "lock not found in internal lock manager"},
+	{336527646, "size of opt block exceeded"},
+	{336527647, "Too many savepoints"},
+	{336527648, "garbage collect record disappeared"},
+	{336527649, "Unknown BLOB FILTER ACTION_"},
+	{336527650, "error during savepoint backout"},		/* savepoint_error */
+	{336527651, "cannot find record back version"},
+	{336527652, "Illegal user_type."},
+	{336527653, "bad ACL"},
+	{336527654, "inconsistent LATCH_mark release"},
+	{336527655, "inconsistent LATCH_mark call"},
+	{336527656, "inconsistent latch downgrade call"},
+	{336527657, "bdb is unexpectedly marked"},
+	{336527658, "missing exclusive latch"},
+	{336527659, "exceeded maximum number of shared latches on a bdb"},
+	{336527660, "can't find shared latch"},
+	{336527661, "Non-zero use_count of a buffer in the empty que"},		/* cache_non_zero_use_count */
+	{336527662, "Unexpected page change from latching"},		/* unexpected_page_change */
+	{336527663, "Invalid expression for evaluation"},
+	{336527664, "RDB$FLAGS for trigger {0} in RDB$TRIGGERS is corrupted"},		/* rdb$triggers_rdb$flags_corrupt */
+	{336527665, "Blobs accounting is inconsistent"},
+	{336527666, "Found array data type with more than 16 dimensions"},
+	{336658432, "Statement failed, SQLSTATE = {0}"},		/* GEN_ERR */
+	{336658433, "usage:    isql [options] [<database>]"},		/* USAGE */
+	{336658434, "Unknown switch: {0}"},		/* SWITCH */
+	{336658435, "Use CONNECT or CREATE DATABASE to specify a database"},		/* NO_DB */
+	{336658436, "Unable to open {0}"},		/* FILE_OPEN_ERR */
+	{336658437, "Commit current transaction (y/n)?"},		/* COMMIT_PROMPT */
+	{336658438, "Committing."},		/* COMMIT_MSG */
+	{336658439, "Rolling back work."},		/* ROLLBACK_MSG */
+	{336658440, "Command error: {0}"},		/* CMD_ERR */
+	{336658441, "Enter data or NULL for each column.  RETURN to end."},		/* ADD_PROMPT */
+	{336658442, "ISQL Version: {0}"},		/* VERSION */
+	{336658443, "\t-a(ll)                  extract metadata incl. legacy non-SQL tables"},		/* USAGE_ALL */
+	{336658444, "Number of DB pages allocated = {0}"},		/* NUMBER_PAGES */
+	{336658445, "Sweep interval = {0}"},		/* SWEEP_INTERV */
+	{336658446, "Number of wal buffers = {0}"},		/* NUM_WAL_BUFF */
+	{336658447, "Wal buffer size = {0}"},		/* WAL_BUFF_SIZE */
+	{336658448, "Check point length = {0}"},		/* CKPT_LENGTH */
+	{336658449, "Check point interval = {0}"},		/* CKPT_INTERV */
+	{336658450, "Wal group commit wait = {0}"},		/* WAL_GRPC_WAIT */
+	{336658451, "Base level = {0}"},		/* BASE_LEVEL */
+	{336658452, "Transaction in limbo = {0}"},		/* LIMBO */
+	{336658453, "Frontend commands:"},		/* HLP_FRONTEND */
+	{336658454, "BLOBVIEW <blobid>          -- view BLOB in text editor"},		/* HLP_BLOBED */
+	{336658455, "BLOBDUMP <blobid> <file>   -- dump BLOB to a file"},		/* HLP_BLOBDMP */
+	{336658456, "EDIT     [<filename>]      -- edit SQL script file and execute"},		/* HLP_EDIT */
+	{336658457, "INput    <filename>        -- take input from the named SQL file"},		/* HLP_INPUT */
+	{336658458, "OUTput   [<filename>]      -- write output to named file"},		/* HLP_OUTPUT */
+	{336658459, "SHELL    <command>         -- execute Operating System command in sub-shell"},		/* HLP_SHELL */
+	{336658460, "HELP                       -- display this menu"},		/* HLP_HELP */
+	{336658461, "Set commands:"},		/* HLP_SETCOM */
+	{336658462, "    SET                    -- display current SET options"},		/* HLP_SET */
+	{336658463, "    SET AUTOddl            -- toggle autocommit of DDL statements"},		/* HLP_SETAUTO */
+	{336658464, "    SET BLOB [ALL|<n>]     -- display BLOBS of subtype <n> or ALL"},		/* HLP_SETBLOB */
+	{336658465, "    SET COUNT              -- toggle count of selected rows on/off"},		/* HLP_SETCOUNT */
+	{336658466, "    SET ECHO               -- toggle command echo on/off"},		/* HLP_SETECHO */
+	{336658467, "    SET STATs              -- toggle display of performance statistics"},		/* HLP_SETSTAT */
+	{336658468, "    SET TERM <string>      -- change statement terminator string"},		/* HLP_SETTERM */
+	{336658469, "SHOW     <object> [<name>] -- display system information"},		/* HLP_SHOW */
+	{336658470, "    <object> = CHECK, COLLATION, DATABASE, DOMAIN, EXCEPTION, FILTER, FUNCTION,"},		/* HLP_OBJTYPE */
+	{336658471, "EXIT                       -- exit and commit changes"},		/* HLP_EXIT */
+	{336658472, "QUIT                       -- exit and roll back changes"},		/* HLP_QUIT */
+	{336658473, "All commands may be abbreviated to letters in CAPitals"},		/* HLP_ALL */
+	{336658474, "\tSET SCHema/DB <db name> -- changes current database"},		/* HLP_SETSCHEMA */
+	{336658475, "Yes"},		/* YES_ANS */
+	{336658476, "Current memory = !c\nDelta memory = !d\nMax memory = !x\nElapsed time = !e sec\n"},		/* REPORT1 */
+	{336658477, "Cpu = !u sec\nBuffers = !b\nReads = !r\nWrites = !w\nFetches = !f"},		/* REPORT2 */
+	{336658478, "BLOB display set to subtype {0}. This BLOB: subtype = {1}"},		/* BLOB_SUBTYPE */
+	{336658479, "BLOB: {0}, type 'edit' or filename to load>"},		/* BLOB_PROMPT */
+	{336658480, "Enter {0} as Y/M/D>"},		/* DATE_PROMPT */
+	{336658481, "Enter {0}>"},		/* NAME_PROMPT */
+	{336658482, "Bad date {0}"},		/* DATE_ERR */
+	{336658483, "CON> "},		/* CON_PROMPT */
+	{336658484, "    SET LIST               -- toggle column or table display format"},		/* HLP_SETLIST */
+	{336658485, "{0} not found"},		/* NOT_FOUND */
+	{336658486, "Errors occurred (possibly duplicate domains) in creating {0} in {1}"},		/* COPY_ERR */
+	{336658487, "Server version too old to support the isql command"},		/* SERVER_TOO_OLD */
+	{336658488, "Records affected: {0}"},		/* REC_COUNT */
+	{336658489, "Unlicensed for database \"{0}\""},		/* UNLICENSED */
+	{336658490, "    SET WIDTH <col> [<n>]  -- set/unset print width to <n> for column <col>"},		/* HLP_SETWIDTH */
+	{336658491, "    SET PLAN               -- toggle display of query access plan"},		/* HLP_SETPLAN */
+	{336658492, "    SET TIME               -- toggle display of timestamp with DATE values"},		/* HLP_SETTIME */
+	{336658493, "EDIT                       -- edit current command buffer and execute"},		/* HLP_EDIT2 */
+	{336658494, "OUTput                     -- return output to stdout"},		/* HLP_OUTPUT2 */
+	{336658495, "    SET NAMES <csname>     -- set name of runtime character set"},		/* HLP_SETNAMES */
+	{336658496, "               GENERATOR, GRANT, INDEX, PACKAGE, PROCEDURE, ROLE, SQL DIALECT,"},		/* HLP_OBJTYPE2 */
+	{336658497, "    SET BLOB               -- turn off BLOB display"},		/* HLP_SETBLOB2 */
+	{336658498, "SET      <option>          -- (Use HELP SET for complete list)"},		/* HLP_SET_ROOT */
+	{336658499, "There are no tables in this database"},		/* NO_TABLES */
+	{336658500, "There is no table {0} in this database"},		/* NO_TABLE */
+	{336658501, "There are no views in this database"},		/* NO_VIEWS */
+	{336658502, "There is no view {0} in this database"},		/* NO_VIEW */
+	{336658503, "There are no indices on table {0} in this database"},		/* NO_INDICES_ON_REL */
+	{336658504, "There is no table or index {0} in this database"},		/* NO_REL_OR_INDEX */
+	{336658505, "There are no indices in this database"},		/* NO_INDICES */
+	{336658506, "There is no domain {0} in this database"},		/* NO_DOMAIN */
+	{336658507, "There are no domains in this database"},		/* NO_DOMAINS */
+	{336658508, "There is no exception {0} in this database"},		/* NO_EXCEPTION */
+	{336658509, "There are no exceptions in this database"},		/* NO_EXCEPTIONS */
+	{336658510, "There is no filter {0} in this database"},		/* NO_FILTER */
+	{336658511, "There are no filters in this database"},		/* NO_FILTERS */
+	{336658512, "There is no user-defined function {0} in this database"},		/* NO_FUNCTION */
+	{336658513, "There are no user-defined functions in this database"},		/* NO_FUNCTIONS */
+	{336658514, "There is no generator {0} in this database"},		/* NO_GEN */
+	{336658515, "There are no generators in this database"},		/* NO_GENS */
+	{336658516, "There is no privilege granted on table {0} in this database"},		/* NO_GRANT_ON_REL */
+	{336658517, "There is no privilege granted on stored procedure {0} in this database"},		/* NO_GRANT_ON_PROC */
+	{336658518, "There is no table or stored procedure {0} in this database"},		/* NO_REL_OR_PROC */
+	{336658519, "There is no stored procedure {0} in this database"},		/* NO_PROC */
+	{336658520, "There are no stored procedures in this database"},		/* NO_PROCS */
+	{336658521, "There are no triggers on table {0} in this database"},		/* NO_TRIGGERS_ON_REL */
+	{336658522, "There is no table or trigger {0} in this database"},		/* NO_REL_OR_TRIGGER */
+	{336658523, "There are no triggers in this database"},		/* NO_TRIGGERS */
+	{336658524, "There are no check constraints on table {0} in this database"},		/* NO_CHECKS_ON_REL */
+	{336658525, "Buffers = !b\nReads = !r\nWrites !w\nFetches = !f"},		/* REPORT2_WINDOWS_ONLY */
+	{336658526, "Single isql command exceeded maximum buffer size"},		/* BUFFER_OVERFLOW */
+	{336658527, "There are no roles in this database"},		/* NO_ROLES */
+	{336658528, "There is no metadata object {0} in this database"},		/* NO_OBJECT */
+	{336658529, "There is no membership privilege granted on {0} in this database"},		/* NO_GRANT_ON_ROL */
+	{336658530, "Expected end of statement, encountered EOF"},		/* UNEXPECTED_EOF */
+	{336658533, "Bad TIME: {0}"},		/* TIME_ERR */
+	{336658534, "               SYSTEM, TABLE, TRIGGER, VERSION, USERS, VIEW, WIRE_STATISTICS"},		/* HLP_OBJTYPE3 */
+	{336658535, "There is no role {0} in this database"},		/* NO_ROLE */
+	{336658536, "\t-b(ail)                 bail on errors (set bail on)"},		/* USAGE_BAIL */
+	{336658537, "Incomplete string in {0}"},
+	{336658538, "    SET SQL DIALECT <n>    -- set sql dialect to <n>"},		/* HLP_SETSQLDIALECT */
+	{336658539, "There is no privilege granted in this database"},		/* NO_GRANT_ON_ANY */
+	{336658540, "    SET PLANONLY           -- toggle display of query plan without executing"},		/* HLP_SETPLANONLY */
+	{336658541, "    SET HEADING            -- toggle display of query column titles"},		/* HLP_SETHEADING */
+	{336658542, "    SET BAIL               -- toggle bailing out on errors in non-interactive mode"},		/* HLP_SETBAIL */
+	{336658543, "\t-c(ache) <num>          number of cache buffers"},		/* USAGE_CACHE */
+	{336658544, "Enter {0} as H:M:S>"},		/* TIME_PROMPT */
+	{336658545, "Enter {0} as Y/MON/D H:MIN:S[.MSEC]>"},		/* TIMESTAMP_PROMPT */
+	{336658546, "Bad TIMESTAMP: {0}"},		/* TIMESTAMP_ERR */
+	{336658547, "There are no comments for objects in this database"},		/* NO_COMMENTS */
+	{336658548, "Printing only the first {0} blobs."},		/* ONLY_FIRST_BLOBS */
+	{336658549, "Tables:"},		/* MSG_TABLES */
+	{336658550, "Functions:"},		/* MSG_FUNCTIONS */
+	{336658551, "At line {0} in file {1}"},		/* EXACTLINE */
+	{336658552, "After line {0} in file {1}"},		/* AFTERLINE */
+	{336658553, "There is no trigger {0} in this database"},		/* NO_TRIGGER */
+	{336658554, "\t-ch(arset) <charset>    connection charset (set names)"},		/* USAGE_CHARSET */
+	{336658555, "\t-d(atabase) <database>  database name to put in script creation"},		/* USAGE_DATABASE */
+	{336658556, "\t-e(cho)                 echo commands (set echo on)"},		/* USAGE_ECHO */
+	{336658557, "\t-ex(tract)              extract metadata"},		/* USAGE_EXTRACT */
+	{336658558, "\t-i(nput) <file>         input file (set input)"},		/* USAGE_INPUT */
+	{336658559, "\t-m(erge)                merge standard error"},		/* USAGE_MERGE */
+	{336658560, "\t-m2                     merge diagnostic"},		/* USAGE_MERGE2 */
+	{336658561, "\t-n(oautocommit)         no autocommit DDL (set autoddl off)"},		/* USAGE_NOAUTOCOMMIT */
+	{336658562, "\t-now(arnings)           do not show warnings"},		/* USAGE_NOWARN */
+	{336658563, "\t-o(utput) <file>        output file (set output)"},		/* USAGE_OUTPUT */
+	{336658564, "\t-pag(elength) <size>    page length"},		/* USAGE_PAGE */
+	{336658565, "\t-p(assword) <password>  connection password"},		/* USAGE_PASSWORD */
+	{336658566, "\t-q(uiet)                do not show the message \"Use CONNECT...\""},		/* USAGE_QUIET */
+	{336658567, "\t-r(ole) <role>          role name"},		/* USAGE_ROLE */
+	{336658568, "\t-r2 <role>              role (uses quoted identifier)"},		/* USAGE_ROLE2 */
+	{336658569, "\t-s(qldialect) <dialect> SQL dialect (set sql dialect)"},		/* USAGE_SQLDIALECT */
+	{336658570, "\t-t(erminator) <term>    command terminator (set term)"},		/* USAGE_TERM */
+	{336658571, "\t-u(ser) <user>          user name"},		/* USAGE_USER */
+	{336658572, "\t-x                      extract metadata"},		/* USAGE_XTRACT */
+	{336658573, "\t-z                      show program and server version"},		/* USAGE_VERSION */
+	{336658574, "missing argument for switch \"{0}\""},		/* USAGE_NOARG */
+	{336658575, "argument \"{0}\" for switch \"{1}\" is not an integer"},		/* USAGE_NOTINT */
+	{336658576, "value \"{0}\" for switch \"{1}\" is out of range"},		/* USAGE_RANGE */
+	{336658577, "switch \"{0}\" or its equivalent used more than once"},		/* USAGE_DUPSW */
+	{336658578, "more than one database name: \"{0}\", \"{1}\""},		/* USAGE_DUPDB */
+	{336658579, "No dependencies for {0} were found"},		/* NO_DEPENDENCIES */
+	{336658580, "There is no collation {0} in this database"},		/* NO_COLLATION */
+	{336658581, "There are no user-defined collations in this database"},		/* NO_COLLATIONS */
+	{336658582, "Collations:"},		/* MSG_COLLATIONS */
+	{336658583, "There are no security classes for {0}"},		/* NO_SECCLASS */
+	{336658584, "There is no database-wide security class"},		/* NO_DB_WIDE_SECCLASS */
+	{336658585, "Cannot get server version without database connection"},		/* CANNOT_GET_SRV_VER */
+	{336658586, "\t-nod(btriggers)         do not run database triggers"},		/* USAGE_NODBTRIGGERS */
+	{336658587, "\t-tr(usted)              use trusted authentication"},		/* USAGE_TRUSTED */
+	{336658588, "BULK> "},		/* BULK_PROMPT */
+	{336658589, "There are no connected users"},		/* NO_CONNECTED_USERS */
+	{336658590, "Users in the database"},		/* USERS_IN_DB */
+	{336658591, "Output was truncated"},		/* OUTPUT_TRUNCATED */
+	{336658592, "Valid options are:"},		/* VALID_OPTIONS */
+	{336658593, "\t-f(etch_password)       fetch password from file"},		/* USAGE_FETCH */
+	{336658594, "could not open password file {0}, errno {1}"},		/* PASS_FILE_OPEN */
+	{336658595, "could not read password file {0}, errno {1}"},		/* PASS_FILE_READ */
+	{336658596, "empty password file {0}"},		/* EMPTY_PASS */
+	{336658597, "    SET MAXROWS [<n>]      -- limit select stmt to <n> rows, zero is no limit"},		/* HLP_SETMAXROWS */
+	{336658598, "There is no package {0} in this database"},		/* NO_PACKAGE */
+	{336658599, "There are no packages in this database"},		/* NO_PACKAGES */
+	{336658600, "There is no schema {0} in this database"},		/* NO_SCHEMA */
+	{336658601, "There are no schemas in this database"},		/* NO_SCHEMAS */
+	{336658602, "Unable to convert {0} to a number for MAXROWS option"},		/* MAXROWS_INVALID */
+	{336658603, "Value {0} for MAXROWS is out of range. Max value is {1}"},		/* MAXROWS_OUTOF_RANGE */
+	{336658604, "The value ({0}) for MAXROWS must be zero or greater"},		/* MAXROWS_NEGATIVE */
+	{336658605, "    SET EXPLAIN            -- toggle display of query access plan in the explained form"},		/* HLP_SETEXPLAIN */
+	{336658606, "There is no privilege granted on generator {0} in this database"},		/* NO_GRANT_ON_GEN */
+	{336658607, "There is no privilege granted on exception {0} in this database"},		/* NO_GRANT_ON_XCP */
+	{336658608, "There is no privilege granted on domain {0} in this database"},		/* NO_GRANT_ON_FLD */
+	{336658609, "There is no privilege granted on character set {0} in this database"},		/* NO_GRANT_ON_CS */
+	{336658610, "There is no privilege granted on collation {0} in this database"},		/* NO_GRANT_ON_COLL */
+	{336658611, "There is no privilege granted on package {0} in this database"},		/* NO_GRANT_ON_PKG */
+	{336658612, "There is no privilege granted on function {0} in this database"},		/* NO_GRANT_ON_FUN */
+	{336658613, "Current memory = !\nDelta memory = !\nMax memory = !\nElapsed time = ~ sec\n"},		/* REPORT_NEW1 */
+	{336658614, "Cpu = ~ sec\n"},		/* REPORT_NEW2 */
+	{336658615, "Buffers = !\nReads = !\nWrites = !\nFetches = !"},		/* REPORT_NEW3 */
+	{336658616, "There is no mapping {0} in this database"},		/* NO_MAP */
+	{336658617, "There are no mappings in this database"},		/* NO_MAPS */
+	{336658618, "Invalid characters for SET TERMINATOR are {0}"},		/* INVALID_TERM_CHARS */
+	{336658619, "Records displayed: {0}"},		/* REC_DISPLAYCOUNT */
+	{336658620, "Full NULL columns hidden due to RecordBuff: {0}"},		/* COLUMNS_HIDDEN */
+	{336658621, "    SET RECORDBuf          -- toggle limited buffering and trimming of columns"},		/* HLP_SETRECORDBUF */
+	{336658622, "Number of DB pages used = {0}"},		/* NUMBER_USED_PAGES */
+	{336658623, "Number of DB pages free = {0}"},		/* NUMBER_FREE_PAGES */
+	{336658624, "Database encrypted"},		/* DATABASE_CRYPTED */
+	{336658625, "Database not encrypted"},		/* DATABASE_NOT_CRYPTED */
+	{336658626, "crypt thread not complete"},		/* DATABASE_CRYPT_PROCESS */
+	{336658627, "Roles:"},		/* MSG_ROLES */
+	{336658628, "Timeouts are not supported by server"},		/* NO_TIMEOUTS */
+	{336658629, "    SET KEEP_TRAN_params   -- toggle to keep or not to keep text of following successful SET TRANSACTION statement"},		/* HLP_SETKEEPTRAN */
+	{336658630, "    SET PER_TABle_stats    -- toggle display of detailed per-table statistics"},		/* HLP_SETPERTAB */
+	{336658631, "Statement type is not recognized"},		/* BAD_STMT_TYPE */
+	{336658632, "Packages:"},		/* MSG_PACKAGES */
+	{336658633, "There is no publication {0} in this database"},		/* NO_PUBLICATION */
+	{336658634, "There is no publications in this database"},		/* NO_PUBLICATIONS */
+	{336658635, "Publications:"},		/* MSG_PUBLICATIONS */
+	{336658636, "Procedures:"},		/* MSG_PROCEDURES */
+	{336658641, "    SET WIRE_stats         -- toggle display of wire (network) statistics"},		/* HLP_SETWIRESTATS */
+	{336723969, "GSEC>"},		/* GsecMsg1 */
+	{336723970, "gsec"},		/* GsecMsg2 */
+	{336723971, "ADD            add user"},		/* GsecMsg3 */
+	{336723972, "DELETE         delete user"},		/* GsecMsg4 */
+	{336723973, "DISPLAY        display user(s)"},		/* GsecMsg5 */
+	{336723974, "MODIFY         modify user"},		/* GsecMsg6 */
+	{336723975, "PW             user's password"},		/* GsecMsg7 */
+	{336723976, "UID            user's ID"},		/* GsecMsg8 */
+	{336723977, "GID            user's group ID"},		/* GsecMsg9 */
+	{336723978, "PROJ           user's project name"},		/* GsecMsg10 */
+	{336723979, "ORG            user's organization name"},		/* GsecMsg11 */
+	{336723980, "FNAME          user's first name"},		/* GsecMsg12 */
+	{336723981, "MNAME          user's middle name/initial"},		/* GsecMsg13 */
+	{336723982, "LNAME          user's last name"},		/* GsecMsg14 */
 	{336723983, "unable to open database"},		/* gsec_cant_open_db */
 	{336723984, "error in switch specifications"},		/* gsec_switches_error */
 	{336723985, "no operation specified"},		/* gsec_no_op_spec */
@@ -1375,6 +2555,9 @@ internal static class IscErrorMessages
 	{336723990, "record not found for user: {0}"},		/* gsec_err_rec_not_found */
 	{336723991, "delete record error"},		/* gsec_err_delete */
 	{336723992, "find/delete record error"},		/* gsec_err_find_del */
+	{336723993, "users defined for node"},		/* GsecMsg25 */
+	{336723994, "     user name                    uid   gid admin     full name"},		/* GsecMsg26 */
+	{336723995, "------------------------------------------------------------------------------------------------"},		/* GsecMsg27 */
 	{336723996, "find/display record error"},		/* gsec_err_find_disp */
 	{336723997, "invalid parameter, no switch defined"},		/* gsec_inv_param */
 	{336723998, "operation already specified"},		/* gsec_op_specified */
@@ -1386,40 +2569,226 @@ internal static class IscErrorMessages
 	{336724004, "first name already specified"},		/* gsec_fname_specified */
 	{336724005, "middle name already specified"},		/* gsec_mname_specified */
 	{336724006, "last name already specified"},		/* gsec_lname_specified */
+	{336724007, "gsec version"},		/* GsecMsg39 */
 	{336724008, "invalid switch specified"},		/* gsec_inv_switch */
 	{336724009, "ambiguous switch specified"},		/* gsec_amb_switch */
 	{336724010, "no operation specified for parameters"},		/* gsec_no_op_specified */
 	{336724011, "no parameters allowed for this operation"},		/* gsec_params_not_allowed */
 	{336724012, "incompatible switches specified"},		/* gsec_incompat_switch */
+	{336724013, "gsec utility - maintains user password database"},		/* GsecMsg45 */
+	{336724014, "command line usage:"},		/* GsecMsg46 */
+	{336724015, "<command> [ <parameter> ... ]"},		/* GsecMsg47 */
+	{336724016, "interactive usage:"},		/* GsecMsg48 */
+	{336724017, "available commands:"},		/* GsecMsg49 */
+	{336724018, "adding a new user:"},		/* GsecMsgs50 */
+	{336724019, "add <name> [ <parameter> ... ]"},		/* GsecMsg51 */
+	{336724020, "deleting a current user:"},		/* GsecMsg52 */
+	{336724021, "delete <name>"},		/* GsecMsg53 */
+	{336724022, "displaying all users:"},		/* GsecMsg54 */
+	{336724023, "display"},		/* GsecMsg55 */
+	{336724024, "displaying one user:"},		/* GsecMsg56 */
+	{336724025, "display <name>"},		/* GsecMsg57 */
+	{336724026, "modifying a user's parameters:"},		/* GsecMsg58 */
+	{336724027, "modify <name> <parameter> [ <parameter> ... ]"},		/* GsecMsg59 */
+	{336724028, "help:"},		/* GsecMsg60 */
+	{336724029, "? (interactive only)"},		/* GsecMsg61 */
+	{336724030, "help"},		/* GsecMsg62 */
+	{336724031, "quit interactive session:"},		/* GsecMsg63 */
+	{336724032, "quit (interactive only)"},		/* GsecMsg64 */
+	{336724033, "available parameters:"},		/* GsecMsg65 */
+	{336724034, "-pw <password>"},		/* GsecMsg66 */
+	{336724035, "-uid <uid>"},		/* GsecMsg67 */
+	{336724036, "-gid <uid>"},		/* GsecMsg68 */
+	{336724037, "-proj <projectname>"},		/* GsecMsg69 */
+	{336724038, "-org <organizationname>"},		/* GsecMsg70 */
+	{336724039, "-fname <firstname>"},		/* GsecMsg71 */
+	{336724040, "-mname <middlename>"},		/* GsecMsg72 */
+	{336724041, "-lname <lastname>"},		/* GsecMsg73 */
+	{336724042, "gsec - memory allocation error"},
+	{336724043, "gsec error"},
 	{336724044, "Invalid user name (maximum 31 bytes allowed)"},		/* gsec_inv_username */
 	{336724045, "Warning - maximum 8 significant bytes of password used"},		/* gsec_inv_pw_length */
 	{336724046, "database already specified"},		/* gsec_db_specified */
 	{336724047, "database administrator name already specified"},		/* gsec_db_admin_specified */
 	{336724048, "database administrator password already specified"},		/* gsec_db_admin_pw_specified */
 	{336724049, "SQL role name already specified"},		/* gsec_sql_role_specified */
+	{336724050, "[ <options> ... ]"},		/* GsecMsg82 */
+	{336724051, "available options:"},		/* GsecMsg83 */
+	{336724052, "-user <database administrator name>"},		/* GsecMsg84 */
+	{336724053, "-password <database administrator password>"},		/* GsecMsg85 */
+	{336724054, "-role <database administrator SQL role name>"},		/* GsecMsg86 */
+	{336724055, "-database <database to manage>"},		/* GsecMsg87 */
+	{336724056, "-z"},		/* GsecMsg88 */
+	{336724057, "displaying version number:"},		/* GsecMsg89 */
+	{336724058, "z (interactive only)"},		/* GsecMsg90 */
+	{336724059, "-trusted (use trusted authentication)"},		/* GsecMsg91 */
+	{336724060, "invalid switch specified in interactive mode"},		/* GsecMsg92 */
+	{336724061, "error closing security database"},		/* GsecMsg93 */
+	{336724062, "error releasing request in security database"},		/* GsecMsg94 */
+	{336724063, "-fetch_password <file to fetch password from>"},		/* GsecMsg95 */
+	{336724064, "error fetching password from file"},		/* GsecMsg96 */
+	{336724065, "error changing AUTO ADMINS MAPPING in security database"},		/* GsecMsg97 */
+	{336724066, "changing admins mapping to RDB$ADMIN role in security database:"},		/* GsecMsg98 */
+	{336724067, "invalid parameter for -MAPPING, only SET or DROP is accepted"},		/* GsecMsg99 */
+	{336724068, "mapping {set|drop}"},		/* GsecMsg100 */
+	{336724069, "use gsec -? to get help"},		/* GsecMsg101 */
+	{336724070, "-admin {yes|no}"},		/* GsecMsg102 */
+	{336724071, "invalid parameter for -ADMIN, only YES or NO is accepted"},		/* GsecMsg103 */
+	{336724072, "not enough privileges to complete operation"},		/* GsecMsg104 */
 	{336920577, "found unknown switch"},		/* gstat_unknown_switch */
 	{336920578, "please retry, giving a database name"},		/* gstat_retry */
 	{336920579, "Wrong ODS version, expected {0}, encountered {1}"},		/* gstat_wrong_ods */
 	{336920580, "Unexpected end of database file."},		/* gstat_unexpected_eof */
+	{336920581, "gstat version {0}"},
+	{336920582, "\nDatabase \"{0}\""},
+	{336920583, "\n\nDatabase file sequence:"},
+	{336920584, "File {0} continues as file {1}"},
+	{336920585, "File {0} is the {1} file"},
+	{336920586, "\nAnalyzing database pages ..."},
+	{336920587, "    Primary pointer page: {0}, Index root page: {1}"},
+	{336920588, "    Data pages: {0}, data page slots: {1}, average fill: {2}"},
+	{336920589, "    Fill distribution:"},
+	{336920590, "    Index {0} ({1})"},
+	{336920591, "\tDepth: {0}, leaf buckets: {1}, nodes: {2}"},
+	{336920592, "\tAverage data length: {0}, total dup: {1}, max dup: {2}"},
+	{336920593, "\tFill distribution:"},
+	{336920594, "    Expected data on page {0}"},
+	{336920595, "    Expected b-tree bucket on page {0} from {1}"},
+	{336920596, "unknown switch \"{0}\""},
+	{336920597, "Available switches:"},
+	{336920598, "    -a      analyze data and index pages"},
+	{336920599, "    -d      analyze data pages"},
+	{336920600, "    -h      analyze header page ONLY"},
+	{336920601, "    -i      analyze index leaf pages"},
+	{336920602, "    -l      analyze log page"},
+	{336920603, "    -s      analyze system relations in addition to user tables"},
+	{336920604, "    -z      display version number"},
 	{336920605, "Can't open database file {0}"},		/* gstat_open_err */
 	{336920606, "Can't read a database page"},		/* gstat_read_err */
 	{336920607, "System memory exhausted"},		/* gstat_sysmemex */
+	{336920608, "    -u      username"},		/* gstat_username */
+	{336920609, "    -p      password"},		/* gstat_password */
+	{336920610, "    -r      analyze average record and version length"},
+	{336920611, "    -t      tablename <tablename2...> (case sensitive)"},
+	{336920612, "    -tr     use trusted authentication"},
+	{336920613, "    -fetch  fetch password from file"},
+	{336920614, "option -h is incompatible with options -a, -d, -i, -r, -s and -t"},
+	{336920615, "usage:   gstat [options] <database> or gstat <database> [options]"},
+	{336920616, "database name was already specified"},
+	{336920617, "option -t needs a table name"},
+	{336920618, "option -t got a too long table name {0}"},
+	{336920619, "option -t accepts several table names only if used after <database>"},
+	{336920620, "table \"{0}\" not found"},
+	{336920621, "use gstat -? to get help"},
+	{336920622, "    Primary pages: {0}, secondary pages: {1}, swept pages: {2}"},
+	{336920623, "    Big record pages: {0}"},
+	{336920624, "    Blobs: {0}, total length: {1}, blob pages: {2}"},
+	{336920625, "        Level 0: {0}, Level 1: {1}, Level 2: {2}"},
+	{336920626, "option -e is incompatible with options -a, -d, -h, -i, -r, -s and -t"},
+	{336920627, "    -e      analyze database encryption"},
+	{336920628, "Data pages: total {0}, encrypted {1}, non-crypted {2}"},
+	{336920629, "Index pages: total {0}, encrypted {1}, non-crypted {2}"},
+	{336920630, "Blob pages: total {0}, encrypted {1}, non-crypted {2}"},
+	{336920631, "no encrypted database support, only -e and -h can be used"},
+	{336920632, "    Empty pages: {0}, full pages: {1}"},
+	{336920633, "    -role   SQL role name"},
+	{336920634, "Other pages: total {0}, ENCRYPTED {1} (DB problem!), non-crypted {2}"},
+	{336920635, "Gstat execution time {0}"},
+	{336920636, "Gstat completion time {0}"},
+	{336920637, "    Expected page inventory page {0}"},
+	{336920638, "Generator pages: total {0}, encrypted {1}, non-crypted {2}"},
+	{336920639, "    Table size: {0} bytes"},
+	{336920640, "        Level {0}: {1}, total length: {2}, blob pages: {3}"},
 	{336986113, "Wrong value for access mode"},		/* fbsvcmgr_bad_am */
 	{336986114, "Wrong value for write mode"},		/* fbsvcmgr_bad_wm */
 	{336986115, "Wrong value for reserve space"},		/* fbsvcmgr_bad_rs */
 	{336986116, "Unknown tag ({0}) in info_svr_db_info block after isc_svc_query()"},		/* fbsvcmgr_info_err */
 	{336986117, "Unknown tag ({0}) in isc_svc_query() results"},		/* fbsvcmgr_query_err */
 	{336986118, "Unknown switch \"{0}\""},		/* fbsvcmgr_switch_unknown */
+	{336986119, "Service Manager Version"},
+	{336986120, "Server version"},
+	{336986121, "Server implementation"},
+	{336986122, "Path to firebird.msg"},
+	{336986123, "Server root"},
+	{336986124, "Path to lock files"},
+	{336986125, "Security database"},
+	{336986126, "Databases"},
+	{336986127, "   Database in use"},
+	{336986128, "   Number of attachments"},
+	{336986129, "   Number of databases"},
+	{336986130, "Information truncated"},
+	{336986131, "Usage: fbsvcmgr manager-name switches..."},
+	{336986132, "Manager-name should be service_mgr, may be prefixed with host name"},
+	{336986133, "according to common rules (host:service_mgr, \\\\host\\service_mgr)."},
+	{336986134, "Switches exactly match SPB tags, used in abbreviated form."},
+	{336986135, "Remove isc_, spb_ and svc_ parts of tag and you will get the switch."},
+	{336986136, "For example: isc_action_svc_backup is specified as action_backup,"},
+	{336986137, "             isc_spb_dbname => dbname,"},
+	{336986138, "             isc_info_svc_implementation => info_implementation,"},
+	{336986139, "             isc_spb_prp_db_online => prp_db_online and so on."},
+	{336986140, "You may specify single action or multiple info items when calling fbsvcmgr once."},
+	{336986141, "Full command line samples:"},
+	{336986142, "fbsvcmgr service_mgr user sysdba password masterkey action_db_stats dbname employee sts_hdr_pages"},
+	{336986143, "  (will list header info in database employee on local machine)"},
+	{336986144, "fbsvcmgr yourserver:service_mgr user sysdba password masterkey info_server_version info_svr_db_info"},
+	{336986145, "  (will show firebird version and databases usage on yourserver)"},
+	{336986146, "Transaction in limbo"},
+	{336986147, "Multidatabase transaction in limbo"},
+	{336986148, "Host Site"},
+	{336986149, "Transaction"},
+	{336986150, "has been prepared"},
+	{336986151, "has been committed"},
+	{336986152, "has been rolled back"},
+	{336986153, "is not available"},
+	{336986154, "Remote Site"},
+	{336986155, "Database Path"},
+	{336986156, "Automated recovery would commit this transaction"},
+	{336986157, "Automated recovery would rollback this transaction"},
+	{336986158, "No idea should it be commited or rolled back"},
 	{336986159, "Wrong value for shutdown mode"},		/* fbsvcmgr_bad_sm */
 	{336986160, "could not open file {0}"},		/* fbsvcmgr_fp_open */
 	{336986161, "could not read file {0}"},		/* fbsvcmgr_fp_read */
 	{336986162, "empty file {0}"},		/* fbsvcmgr_fp_empty */
+	{336986163, "Firebird Services Manager version {0}"},
 	{336986164, "Invalid or missing parameter for switch {0}"},		/* fbsvcmgr_bad_arg */
+	{336986165, "To get full list of known services run with -? switch"},
+	{336986166, "Attaching to services manager:"},
+	{336986167, "Information requests:"},
+	{336986168, "Actions:"},
+	{336986169, "Server capabilities:"},
 	{336986170, "Unknown tag ({0}) in isc_info_svc_limbo_trans block after isc_svc_query()"},		/* fbsvcmgr_info_limbo */
 	{336986171, "Unknown tag ({0}) in isc_spb_tra_state block after isc_svc_query()"},		/* fbsvcmgr_limbo_state */
 	{336986172, "Unknown tag ({0}) in isc_spb_tra_advise block after isc_svc_query()"},		/* fbsvcmgr_limbo_advise */
 	{336986173, "Wrong value for replica mode"},		/* fbsvcmgr_bad_rm */
 	{337051649, "Switches trusted_user and trusted_role are not supported from command line"},		/* utl_trusted_switch */
+	{337117185, "ERROR: "},
+	{337117186, "Physical Backup Manager    Copyright (C) 2004 Firebird development team"},
+	{337117187, "  Original idea is of Sean Leyne <sean@broadviewsoftware.com>"},
+	{337117188, "  Designed and implemented by Nickolay Samofatov <skidder@bssys.com>"},
+	{337117189, "  This work was funded through a grant from BroadView Software, Inc.\\n"},
+	{337117190, "Usage: nbackup <options>"},
+	{337117191, "exclusive options are:"},
+	{337117192, "  -L(OCK) <database>                     Lock database for filesystem copy"},
+	{337117193, "  -UN(LOCK) <database>                   Unlock previously locked database"},
+	{337117194, "  -F(IXUP) <database>                    Fixup database after filesystem copy"},
+	{337117195, "  -B(ACKUP) <level>|<GUID> <db> [<file>] Create incremental backup"},
+	{337117196, "  -R(ESTORE) <db> [<file0> [<file1>...]] Restore incremental backup"},
+	{337117197, "  -U(SER) <user>                         User name"},
+	{337117198, "  -P(ASSWORD) <password>                 Password"},
+	{337117199, "  -FETCH_PASSWORD <file>                 Fetch password from file"},
+	{337117200, "  -NOD(BTRIGGERS)                        Do not run database triggers"},
+	{337117201, "  -S(IZE)                                Print database size in pages after lock"},
+	{337117202, "  -Z                                     Print program version"},
+	{337117203, "Notes:"},
+	{337117204, "  <database> may specify database alias."},
+	{337117205, "  Incremental backups of multi-file databases are not supported yet."},
+	{337117206, "  \"stdout\" may be used as a value of <filename> for -B option."},
+	{337117207, "PROBLEM ON \"{0}\"."},
+	{337117208, "general options are:"},
+	{337117209, "switches can be abbreviated to the unparenthesized characters"},
+	{337117210, "  Option -S(IZE) only is valid together with -L(OCK)."},
+	{337117211, "  For historical reasons, -N is equivalent to -UN(LOCK)"},
+	{337117212, "  and -T is equivalent to -NOD(BTRIGGERS)."},
 	{337117213, "Missing parameter for switch {0}"},		/* nbackup_missing_param */
 	{337117214, "Only one of -LOCK, -UNLOCK, -FIXUP, -BACKUP or -RESTORE should be specified"},		/* nbackup_allowed_switches */
 	{337117215, "Unrecognized parameter {0}"},		/* nbackup_unknown_param */
@@ -1428,6 +2797,8 @@ internal static class IscErrorMessages
 	{337117218, "Error working with password file \"{0}\""},		/* nbackup_pwfile_error */
 	{337117219, "Switch -SIZE can be used only with -LOCK"},		/* nbackup_size_with_lock */
 	{337117220, "None of -LOCK, -UNLOCK, -FIXUP, -BACKUP or -RESTORE specified"},		/* nbackup_no_switch */
+	{337117221, "Failure: "},
+	{337117222, "Enter name of the backup file of level {0} (\".\" - do not restore further):"},
 	{337117223, "IO error reading file: {0}"},		/* nbackup_err_read */
 	{337117224, "IO error writing file: {0}"},		/* nbackup_err_write */
 	{337117225, "IO error seeking file: {0}"},		/* nbackup_err_seek */
@@ -1457,11 +2828,56 @@ internal static class IscErrorMessages
 	{337117249, "Error creating database file: {0} via copying from: {1}"},		/* nbackup_err_copy */
 	{337117250, "Unexpected end of file when reading header of restored database file (stage {0})"},		/* nbackup_err_eofhdr_restdb */
 	{337117251, "Cannot get backup guid clumplet from L0 backup"},		/* nbackup_lostguid_l0bk */
+	{337117252, "Physical Backup Manager version {0}"},
+	{337117253, "Enter name of the backup file of level {0} (\".\" - do not restore further):"},
+	{337117254, "  -D(IRECT) <ON | OFF>                   Use or not direct I/O when backing up database"},
 	{337117255, "Wrong parameter {0} for switch -D, need ON or OFF"},		/* nbackup_switchd_parameter */
+	{337117256, "special options are:"},
 	{337117257, "Terminated due to user request"},		/* nbackup_user_stop */
+	{337117258, "  -DE(COMPRESS) <command>                Command to extract archives during restore"},
 	{337117259, "Too complex decompress command (> {0} arguments)"},		/* nbackup_deco_parse */
+	{337117260, "  -RO(LE) <role>                         SQL role name"},
 	{337117261, "Cannot find record for database \"{0}\" backup GUID {1} in the backup history"},		/* nbackup_lostrec_guid_db */
+	{337117262, "  -I(NPLACE)                             Restore incremental backup(s) to existing database"},
+	{337117263, "  -INPLACE option could corrupt the database that has changed since previous restore."},
+	{337117264, "  -SEQ(UENCE)                            Preserve original replication sequence"},
 	{337117265, "Switch -SEQ(UENCE) can be used only with -FIXUP or -RESTORE"},		/* nbackup_seq_misuse */
+	{337117266, "  -CLEAN_HIST(ORY)                       Clean old records from backup history"},
+	{337117267, "  -K(EEP) <N> <(R)OWS | (D)AYS>          How many recent rows (or days back from today) should be kept in the history"},
+	{337117268, "Wrong parameter value for switch {0}"},		/* nbackup_wrong_param */
+	{337117269, "Switch -CLEAN_HISTORY can be used only with -BACKUP"},		/* nbackup_clean_hist_misuse */
+	{337117270, "-KEEP can be used only with -CLEAN_HISTORY"},		/* nbackup_clean_hist_missed */
+	{337117271, "-KEEP is required with -CLEAN_HISTORY"},		/* nbackup_keep_hist_missed */
+	{337117272, "-KEEP can be used one time only"},		/* nbackup_second_keep_switch */
+	{337182721, "Firebird Trace Manager version {0}"},
+	{337182722, "ERROR: "},
+	{337182723, "Firebird Trace Manager."},
+	{337182724, "Usage: fbtracemgr <action> [<parameters>]"},
+	{337182725, "Actions:"},
+	{337182726, "  -STA[RT]                              Start trace session"},
+	{337182727, "  -STO[P]                               Stop trace session"},
+	{337182728, "  -SU[SPEND]                            Suspend trace session"},
+	{337182729, "  -R[ESUME]                             Resume trace session"},
+	{337182730, "  -L[IST]                               List existing trace sessions"},
+	{337182731, "  -Z                                    Show program version"},
+	{337182732, "Action parameters:"},
+	{337182733, "  -N[AME]    <string>                   Session name"},
+	{337182734, "  -I[D]      <number>                   Session ID"},
+	{337182735, "  -C[ONFIG]  <string>                   Trace configuration file name"},
+	{337182736, "Connection parameters:"},
+	{337182737, "  -SE[RVICE]  <string>                  Service name"},
+	{337182738, "  -U[SER]     <string>                  User name"},
+	{337182739, "  -P[ASSWORD] <string>                  Password"},
+	{337182740, "  -FE[TCH]    <string>                  Fetch password from file"},
+	{337182741, "  -T[RUSTED]  <string>                  Force trusted authentication"},
+	{337182742, "Examples:"},
+	{337182743, "  fbtracemgr -SE remote_host:service_mgr -USER SYSDBA -PASS masterkey -LIST"},
+	{337182744, "  fbtracemgr -SE service_mgr -START -NAME my_trace -CONFIG my_cfg.txt"},
+	{337182745, "  fbtracemgr -SE service_mgr -SUSPEND -ID 2"},
+	{337182746, "  fbtracemgr -SE service_mgr -RESUME -ID 2"},
+	{337182747, "  fbtracemgr -SE service_mgr -STOP -ID 4"},
+	{337182748, "Notes:"},
+	{337182749, "  Press CTRL+C to stop interactive trace session"},
 	{337182750, "conflicting actions \"{0}\" and \"{1}\" found"},		/* trace_conflict_acts */
 	{337182751, "action switch not found"},		/* trace_act_notfound */
 	{337182752, "switch \"{0}\" must be set only once"},		/* trace_switch_once */
diff --git a/src/FirebirdSql.Data.FirebirdClient/Common/IscException.cs b/src/FirebirdSql.Data.FirebirdClient/Common/IscException.cs
index a015f055..e8fba86a 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Common/IscException.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Common/IscException.cs
@@ -27,7 +27,6 @@
 
 namespace FirebirdSql.Data.Common;
 
-[Serializable]
 internal sealed class IscException : Exception
 {
 	private string _message;
@@ -117,13 +116,6 @@ public static IscException ForIOException(IOException exception)
 		return ForErrorCodes(new[] { IscCodes.isc_net_write_err, IscCodes.isc_net_read_err }, exception);
 	}
 
-	private IscException(SerializationInfo info, StreamingContext context)
-			: base(info, context)
-	{
-		Errors = (List<IscError>)info.GetValue(nameof(Errors), typeof(List<IscError>));
-		ErrorCode = info.GetInt32(nameof(ErrorCode));
-	}
-
 	public void BuildExceptionData()
 	{
 		BuildErrorCode();
@@ -131,13 +123,6 @@ public void BuildExceptionData()
 		BuildExceptionMessage();
 	}
 
-	public override void GetObjectData(SerializationInfo info, StreamingContext context)
-	{
-		base.GetObjectData(info, context);
-		info.AddValue(nameof(Errors), Errors);
-		info.AddValue(nameof(ErrorCode), ErrorCode);
-	}
-
 	private void BuildErrorCode()
 	{
 		ErrorCode = Errors.Count != 0 ? Errors[0].ErrorCode : 0;
diff --git a/src/FirebirdSql.Data.FirebirdClient/Common/NativeHelpers.cs b/src/FirebirdSql.Data.FirebirdClient/Common/NativeHelpers.cs
index f3450e78..25d65ae9 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Common/NativeHelpers.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Common/NativeHelpers.cs
@@ -16,18 +16,31 @@
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
 using System;
+using System.Collections.Concurrent;
 
 namespace FirebirdSql.Data.Common;
 
 internal static class NativeHelpers
 {
-	public static void CallIfExists(Action action)
+	private static readonly ConcurrentDictionary<string, bool> _cache = new ConcurrentDictionary<string, bool>(StringComparer.Ordinal);
+
+	public static void CallIfExists(string actionId, Action action)
 	{
-		try
+		if (!_cache.TryGetValue(actionId, out var executionAllowed))
+		{
+			try
+			{
+				action();
+				_cache.TryAdd(actionId, true);
+			}
+			catch (EntryPointNotFoundException)
+			{
+				_cache.TryAdd(actionId, false);
+			}
+		}
+		else if (executionAllowed)
 		{
 			action();
 		}
-		catch (EntryPointNotFoundException)
-		{ }
 	}
 }
diff --git a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbBatchCommand.cs b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbBatchCommand.cs
index e0e88e6c..9e17669d 100644
--- a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbBatchCommand.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbBatchCommand.cs
@@ -27,6 +27,7 @@
 using FirebirdSql.Data.Logging;
 
 namespace FirebirdSql.Data.FirebirdClient;
+
 public sealed class FbBatchCommand : IFbPreparedCommand, IDescriptorFiller, IDisposable
 #if !(NET48 || NETSTANDARD2_0)
 		, IAsyncDisposable
@@ -191,6 +192,16 @@ public int BatchBufferSize
 		}
 	}
 
+	/// <summary>
+	/// Gets collection of parameters parsed from the query text during command prepare.
+	/// </summary>
+	[Browsable(false)]
+	[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+	public IReadOnlyList<string> NamedParameters
+	{
+		get { return _namedParameters; }
+	}
+
 	#endregion
 
 	#region Internal Properties
diff --git a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs
index 459cdf9e..c5a2cdea 100644
--- a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs
@@ -198,6 +198,16 @@ public int FetchSize
 		}
 	}
 
+	/// <summary>
+	/// Gets collection of parameters parsed from the query text during command prepare.
+	/// </summary>
+	[Browsable(false)]
+	[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+	public IReadOnlyList<string> NamedParameters
+	{
+		get { return _namedParameters; }
+	}
+
 	#endregion
 
 	#region Protected DbCommand Properties
diff --git a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbDataReader.cs b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbDataReader.cs
index 7972ee04..de8cebb2 100644
--- a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbDataReader.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbDataReader.cs
@@ -21,6 +21,7 @@
 using System.ComponentModel;
 using System.Data;
 using System.Data.Common;
+using System.IO;
 using System.Linq;
 using System.Numerics;
 using System.Runtime.CompilerServices;
@@ -978,6 +979,15 @@ public override DateTime GetDateTime(int i)
 		return GetFieldValue<DateTime>(i);
 	}
 
+	public override Stream GetStream(int i)
+	{
+		CheckState();
+		CheckPosition();
+		CheckIndex(i);
+
+		return _row[i].GetBinaryStream();
+	}
+
 	public override bool IsDBNull(int i)
 	{
 		CheckState();
diff --git a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbException.cs b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbException.cs
index bdf14b3c..c009f800 100644
--- a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbException.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbException.cs
@@ -24,7 +24,9 @@
 
 namespace FirebirdSql.Data.FirebirdClient;
 
+#if !NET8_0_OR_GREATER
 [Serializable]
+#endif
 public sealed class FbException : DbException
 {
 	#region Fields
@@ -50,22 +52,26 @@ private FbException(string message, Exception innerException)
 		: base(message, innerException)
 	{ }
 
+#if !NET8_0_OR_GREATER
 	private FbException(SerializationInfo info, StreamingContext context)
 		: base(info, context)
 	{
 		_errors = (FbErrorCollection)info.GetValue("errors", typeof(FbErrorCollection));
 	}
+#endif
 
 	#endregion
 
 	#region Methods
 
+#if !NET8_0_OR_GREATER
 	public override void GetObjectData(SerializationInfo info, StreamingContext context)
 	{
 		base.GetObjectData(info, context);
 
 		info.AddValue("errors", _errors);
 	}
+#endif
 
 	#endregion
 
diff --git a/src/FirebirdSql.Data.FirebirdClient/FirebirdSql.Data.FirebirdClient.csproj b/src/FirebirdSql.Data.FirebirdClient/FirebirdSql.Data.FirebirdClient.csproj
index 4aae158c..bd28a79c 100644
--- a/src/FirebirdSql.Data.FirebirdClient/FirebirdSql.Data.FirebirdClient.csproj
+++ b/src/FirebirdSql.Data.FirebirdClient/FirebirdSql.Data.FirebirdClient.csproj
@@ -1,6 +1,6 @@
 ﻿<Project Sdk="Microsoft.NET.Sdk">
 	<PropertyGroup>
-		<TargetFrameworks>net48;netstandard2.0;netstandard2.1;net5.0;net6.0;net7.0</TargetFrameworks>
+		<TargetFrameworks>net48;netstandard2.0;netstandard2.1;net5.0;net6.0;net7.0;net8.0</TargetFrameworks>
 		<AssemblyName>FirebirdSql.Data.FirebirdClient</AssemblyName>
 		<RootNamespace>FirebirdSql.Data</RootNamespace>
 		<SignAssembly>true</SignAssembly>
@@ -10,14 +10,15 @@
 		<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
 	</PropertyGroup>
 	<PropertyGroup>
+		<Version>$(ProviderVersion)</Version>
 		<AssemblyTitle>NETProvider - ADO.NET Data Provider</AssemblyTitle>
-		<Copyright>(c) 2002-2023</Copyright>
+		<Copyright>(c) 2002-$(CopyrightEndYear)</Copyright>
 	</PropertyGroup>
 	<PropertyGroup>
 		<PackageId>FirebirdSql.Data.FirebirdClient</PackageId>
 		<Title>Firebird ADO.NET Data provider</Title>
 		<PackageDescription>Firebird ADO.NET data provider</PackageDescription>
-		<PackageTags>firebird;firebirsql;firebirdclient;adonet;database</PackageTags>
+		<PackageTags>firebird firebirsql firebirdclient adonet database</PackageTags>
 		<PackageReadmeFile>README.md</PackageReadmeFile>
 	</PropertyGroup>
 	<PropertyGroup Condition="'$(Configuration)'=='Release'">
@@ -39,11 +40,11 @@
 	</ItemGroup>
 	<ItemGroup Condition="'$(TargetFramework)'=='net48'">
 		<Reference Include="System.Transactions" />
-		<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
+		<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.6.0" />
 	</ItemGroup>
 	<ItemGroup Condition="'$(TargetFramework)'=='netstandard2.0'">
 		<PackageReference Include="System.Reflection.Emit" Version="4.7.0" />
-		<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
+		<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.6.0" />
 	</ItemGroup>
 	<ItemGroup Condition="'$(TargetFramework)'=='netstandard2.1'">
 	</ItemGroup>
@@ -53,6 +54,8 @@
 	</ItemGroup>
 	<ItemGroup Condition="'$(TargetFramework)'=='net7.0'">
 	</ItemGroup>
+	<ItemGroup Condition="'$(TargetFramework)'=='net8.0'">
+	</ItemGroup>
 	<ItemGroup>
 	  <PackageReference Include="ConfigureAwaitChecker.Analyzer" Version="5.0.0.1">
 	    <PrivateAssets>all</PrivateAssets>
diff --git a/src/FirebirdSql.Data.FirebirdClient/Services/FbBackup.cs b/src/FirebirdSql.Data.FirebirdClient/Services/FbBackup.cs
index 9d1768aa..a7ea0e9d 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Services/FbBackup.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Services/FbBackup.cs
@@ -28,10 +28,11 @@ public sealed class FbBackup : FbService
 {
 	public FbBackupFileCollection BackupFiles { get; }
 	public bool Verbose { get; set; }
+	public int? VerboseInterval { get; set; }
 	public int Factor { get; set; }
 	public string SkipData { get; set; }
 	public FbBackupFlags Options { get; set; }
-	public FbBackupRestoreStatistics Statistics { get; set; }
+	public FbBackupRestoreStatistics? Statistics { get; set; }
 
 	public FbBackup(string connectionString = null)
 		: base(connectionString)
@@ -59,16 +60,19 @@ public void Execute()
 				}
 				if (Verbose)
 					startSpb.Append(IscCodes.isc_spb_verbose);
+				if (VerboseInterval.HasValue)
+					startSpb.Append(IscCodes.isc_spb_verbint, (int)VerboseInterval);
 				if (Factor > 0)
 					startSpb.Append(IscCodes.isc_spb_bkp_factor, Factor);
 				if (!string.IsNullOrEmpty(SkipData))
 					startSpb.Append2(IscCodes.isc_spb_bkp_skip_data, SkipData);
 				startSpb.Append(IscCodes.isc_spb_options, (int)Options);
-				startSpb.Append2(IscCodes.isc_spb_bkp_stat, Statistics.BuildConfiguration());
+				if (Statistics.HasValue)
+					startSpb.Append2(IscCodes.isc_spb_bkp_stat, Statistics.Value.BuildConfiguration());
 				if (ConnectionStringOptions.ParallelWorkers > 0)
 					startSpb.Append(IscCodes.isc_spb_bkp_parallel_workers, ConnectionStringOptions.ParallelWorkers);
 				StartTask(startSpb);
-				if (Verbose)
+				if (Verbose || VerboseInterval.HasValue)
 				{
 					ProcessServiceOutput(new ServiceParameterBuffer2(Service.ParameterBufferEncoding));
 				}
@@ -103,16 +107,19 @@ public async Task ExecuteAsync(CancellationToken cancellationToken = default)
 				}
 				if (Verbose)
 					startSpb.Append(IscCodes.isc_spb_verbose);
+				if (VerboseInterval.HasValue)
+					startSpb.Append(IscCodes.isc_spb_verbint, (int)VerboseInterval);
 				if (Factor > 0)
 					startSpb.Append(IscCodes.isc_spb_bkp_factor, Factor);
 				if (!string.IsNullOrEmpty(SkipData))
 					startSpb.Append2(IscCodes.isc_spb_bkp_skip_data, SkipData);
 				startSpb.Append(IscCodes.isc_spb_options, (int)Options);
-				startSpb.Append2(IscCodes.isc_spb_bkp_stat, Statistics.BuildConfiguration());
+				if (Statistics.HasValue)
+					startSpb.Append2(IscCodes.isc_spb_bkp_stat, Statistics.Value.BuildConfiguration());
 				if (ConnectionStringOptions.ParallelWorkers > 0)
 					startSpb.Append(IscCodes.isc_spb_bkp_parallel_workers, ConnectionStringOptions.ParallelWorkers);
 				await StartTaskAsync(startSpb, cancellationToken).ConfigureAwait(false);
-				if (Verbose)
+				if (Verbose || VerboseInterval.HasValue)
 				{
 					await ProcessServiceOutputAsync(new ServiceParameterBuffer2(Service.ParameterBufferEncoding), cancellationToken).ConfigureAwait(false);
 				}
diff --git a/src/FirebirdSql.Data.FirebirdClient/Services/FbBackupFlags.cs b/src/FirebirdSql.Data.FirebirdClient/Services/FbBackupFlags.cs
index 73bb8873..1c17c9f3 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Services/FbBackupFlags.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Services/FbBackupFlags.cs
@@ -33,4 +33,5 @@ public enum FbBackupFlags
 	Convert = IscCodes.isc_spb_bkp_convert,
 	Expand = IscCodes.isc_spb_bkp_expand,
 	NoDatabaseTriggers = IscCodes.isc_spb_bkp_no_triggers,
+	Zip = IscCodes.isc_spb_bkp_zip,
 }
diff --git a/src/FirebirdSql.Data.FirebirdClient/Services/FbRestore.cs b/src/FirebirdSql.Data.FirebirdClient/Services/FbRestore.cs
index ce06317b..86062c70 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Services/FbRestore.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Services/FbRestore.cs
@@ -41,11 +41,12 @@ public int? PageSize
 
 	public FbBackupFileCollection BackupFiles { get; }
 	public bool Verbose { get; set; }
+	public int? VerboseInterval { get; set; }
 	public int? PageBuffers { get; set; }
 	public bool ReadOnly { get; set; }
 	public string SkipData { get; set; }
 	public FbRestoreFlags Options { get; set; }
-	public FbBackupRestoreStatistics Statistics { get; set; }
+	public FbBackupRestoreStatistics? Statistics { get; set; }
 
 	public FbRestore(string connectionString = null)
 		: base(connectionString)
@@ -71,6 +72,8 @@ public void Execute()
 				startSpb.Append2(IscCodes.isc_spb_dbname, ConnectionStringOptions.Database);
 				if (Verbose)
 					startSpb.Append(IscCodes.isc_spb_verbose);
+				if (VerboseInterval.HasValue)
+					startSpb.Append(IscCodes.isc_spb_verbint, (int)VerboseInterval);
 				if (PageBuffers.HasValue)
 					startSpb.Append(IscCodes.isc_spb_res_buffers, (int)PageBuffers);
 				if (_pageSize.HasValue)
@@ -79,11 +82,12 @@ public void Execute()
 				if (!string.IsNullOrEmpty(SkipData))
 					startSpb.Append2(IscCodes.isc_spb_res_skip_data, SkipData);
 				startSpb.Append(IscCodes.isc_spb_options, (int)Options);
-				startSpb.Append2(IscCodes.isc_spb_res_stat, Statistics.BuildConfiguration());
+				if (Statistics.HasValue)
+					startSpb.Append2(IscCodes.isc_spb_res_stat, Statistics.Value.BuildConfiguration());
 				if (ConnectionStringOptions.ParallelWorkers > 0)
 					startSpb.Append(IscCodes.isc_spb_res_parallel_workers, ConnectionStringOptions.ParallelWorkers);
 				StartTask(startSpb);
-				if (Verbose)
+				if (Verbose || VerboseInterval.HasValue)
 				{
 					ProcessServiceOutput(new ServiceParameterBuffer2(Service.ParameterBufferEncoding));
 				}
@@ -116,6 +120,8 @@ public async Task ExecuteAsync(CancellationToken cancellationToken = default)
 				startSpb.Append2(IscCodes.isc_spb_dbname, ConnectionStringOptions.Database);
 				if (Verbose)
 					startSpb.Append(IscCodes.isc_spb_verbose);
+				if (VerboseInterval.HasValue)
+					startSpb.Append(IscCodes.isc_spb_verbint, (int)VerboseInterval);
 				if (PageBuffers.HasValue)
 					startSpb.Append(IscCodes.isc_spb_res_buffers, (int)PageBuffers);
 				if (_pageSize.HasValue)
@@ -124,11 +130,12 @@ public async Task ExecuteAsync(CancellationToken cancellationToken = default)
 				if (!string.IsNullOrEmpty(SkipData))
 					startSpb.Append2(IscCodes.isc_spb_res_skip_data, SkipData);
 				startSpb.Append(IscCodes.isc_spb_options, (int)Options);
-				startSpb.Append2(IscCodes.isc_spb_res_stat, Statistics.BuildConfiguration());
+				if (Statistics.HasValue)
+					startSpb.Append2(IscCodes.isc_spb_res_stat, Statistics.Value.BuildConfiguration());
 				if (ConnectionStringOptions.ParallelWorkers > 0)
 					startSpb.Append(IscCodes.isc_spb_res_parallel_workers, ConnectionStringOptions.ParallelWorkers);
 				await StartTaskAsync(startSpb, cancellationToken).ConfigureAwait(false);
-				if (Verbose)
+				if (Verbose || VerboseInterval.HasValue)
 				{
 					await ProcessServiceOutputAsync(new ServiceParameterBuffer2(Service.ParameterBufferEncoding), cancellationToken).ConfigureAwait(false);
 				}
diff --git a/src/FirebirdSql.Data.FirebirdClient/Services/FbStreamingRestore.cs b/src/FirebirdSql.Data.FirebirdClient/Services/FbStreamingRestore.cs
index a62a9a98..90f60389 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Services/FbStreamingRestore.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Services/FbStreamingRestore.cs
@@ -45,6 +45,7 @@ public int? PageSize
 
 	public Stream InputStream { get; set; }
 	public bool Verbose { get; set; }
+	public int? VerboseInterval { get; set; }
 	public int? PageBuffers { get; set; }
 	public bool ReadOnly { get; set; }
 	public string SkipData { get; set; }
@@ -68,9 +69,9 @@ public void Execute()
 				startSpb.Append2(IscCodes.isc_spb_bkp_file, "stdin");
 				startSpb.Append2(IscCodes.isc_spb_dbname, ConnectionStringOptions.Database);
 				if (Verbose)
-				{
 					startSpb.Append(IscCodes.isc_spb_verbose);
-				}
+				if (VerboseInterval.HasValue)
+					startSpb.Append(IscCodes.isc_spb_verbint, (int)VerboseInterval);
 				if (PageBuffers.HasValue)
 					startSpb.Append(IscCodes.isc_spb_res_buffers, (int)PageBuffers);
 				if (_pageSize.HasValue)
@@ -108,9 +109,9 @@ public async Task ExecuteAsync(CancellationToken cancellationToken = default)
 				startSpb.Append2(IscCodes.isc_spb_bkp_file, "stdin");
 				startSpb.Append2(IscCodes.isc_spb_dbname, ConnectionStringOptions.Database);
 				if (Verbose)
-				{
 					startSpb.Append(IscCodes.isc_spb_verbose);
-				}
+				if (VerboseInterval.HasValue)
+					startSpb.Append(IscCodes.isc_spb_verbint, (int)VerboseInterval);
 				if (PageBuffers.HasValue)
 					startSpb.Append(IscCodes.isc_spb_res_buffers, (int)PageBuffers);
 				if (_pageSize.HasValue)
@@ -178,7 +179,7 @@ async Task ReadInputAsync(CancellationToken cancellationToken = default)
 			if (requestedLength > 0)
 			{
 				var data = new byte[requestedLength];
-				var read = InputStream.Read(data, 0, requestedLength);
+				var read = await InputStream.ReadAsync(data, 0, requestedLength).ConfigureAwait(false);
 				if (read > 0)
 				{
 					Array.Resize(ref data, read);
diff --git a/src/FirebirdSql.Data.FirebirdClient/Services/FbTraceConfiguration.cs b/src/FirebirdSql.Data.FirebirdClient/Services/FbTraceConfiguration.cs
index fc8b4b5d..2b6f9ffc 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Services/FbTraceConfiguration.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Services/FbTraceConfiguration.cs
@@ -15,10 +15,7 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using System.Globalization;
 
 namespace FirebirdSql.Data.Services;
 
@@ -31,16 +28,21 @@ protected static string WriteBoolValue(bool b)
 
 	protected static string WriteString(string s)
 	{
-		return string.Format("'{0}'", s);
+		s = s
+			.Replace("{", "{{")
+			.Replace("}", "}}")
+			.Replace(@"\", @"\\")
+			.Replace("\"", "\\\"");
+		return string.Format("\"{0}\"", s);
 	}
 
 	protected static string WriteNumber(int i)
 	{
-		return i.ToString();
+		return i.ToString(CultureInfo.InvariantCulture);
 	}
 
 	protected static string WriteRegEx(string re)
 	{
-		return WriteString(re.Replace(@"\", @"\\").Replace("'", @"\'"));
+		return WriteString(re);
 	}
 }
diff --git a/src/FirebirdSql.Data.FirebirdClient/Types/FbZonedDateTime.cs b/src/FirebirdSql.Data.FirebirdClient/Types/FbZonedDateTime.cs
index b2eff99b..54e7e5c7 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Types/FbZonedDateTime.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Types/FbZonedDateTime.cs
@@ -1,80 +1,105 @@
-﻿/*
- *    The contents of this file are subject to the Initial
- *    Developer's Public License Version 1.0 (the "License");
- *    you may not use this file except in compliance with the
- *    License. You may obtain a copy of the License at
- *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
- *
- *    Software distributed under the License is distributed on
- *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
- *    express or implied. See the License for the specific
- *    language governing rights and limitations under the License.
- *
- *    All Rights Reserved.
- */
-
-//$Authors = Jiri Cincura (jiri@cincura.net)
-
-using System;
-using System.Runtime.InteropServices;
-
-namespace FirebirdSql.Data.Types;
-
-[StructLayout(LayoutKind.Auto)]
-public readonly struct FbZonedDateTime : IEquatable<FbZonedDateTime>
-{
-	public DateTime DateTime { get; }
-	public string TimeZone { get; }
-	public TimeSpan? Offset { get; }
-
-	internal FbZonedDateTime(DateTime dateTime, string timeZone, TimeSpan? offset)
-	{
-		if (dateTime.Kind != DateTimeKind.Utc)
-			throw new ArgumentException("Value must be in UTC.", nameof(dateTime));
-		if (timeZone == null)
-			throw new ArgumentNullException(nameof(timeZone));
-		if (string.IsNullOrWhiteSpace(timeZone))
-			throw new ArgumentException(nameof(timeZone));
-
-		DateTime = dateTime;
-		TimeZone = timeZone;
-		Offset = offset;
-	}
-
-	public FbZonedDateTime(DateTime dateTime, string timeZone)
-		: this(dateTime, timeZone, null)
-	{ }
-
-	public override string ToString()
-	{
-		if (Offset != null)
-		{
-			return $"{DateTime} {TimeZone} ({Offset})";
-		}
-		return $"{DateTime} {TimeZone}";
-	}
-
-	public override bool Equals(object obj)
-	{
-		return obj is FbZonedDateTime fbZonedDateTime && Equals(fbZonedDateTime);
-	}
-
-	public override int GetHashCode()
-	{
-		unchecked
-		{
-			var hash = (int)2166136261;
-			hash = (hash * 16777619) ^ DateTime.GetHashCode();
-			hash = (hash * 16777619) ^ TimeZone.GetHashCode();
-			if (Offset != null)
-				hash = (hash * 16777619) ^ Offset.GetHashCode();
-			return hash;
-		}
-	}
-
-	public bool Equals(FbZonedDateTime other) => DateTime.Equals(other.DateTime) && TimeZone.Equals(other.TimeZone, StringComparison.OrdinalIgnoreCase);
-
-	public static bool operator ==(FbZonedDateTime lhs, FbZonedDateTime rhs) => lhs.Equals(rhs);
-
-	public static bool operator !=(FbZonedDateTime lhs, FbZonedDateTime rhs) => lhs.Equals(rhs);
-}
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace FirebirdSql.Data.Types;
+
+[StructLayout(LayoutKind.Auto)]
+public readonly struct FbZonedDateTime : IEquatable<FbZonedDateTime>, IConvertible
+{
+	public DateTime DateTime { get; }
+	public string TimeZone { get; }
+	public TimeSpan? Offset { get; }
+
+	internal FbZonedDateTime(DateTime dateTime, string timeZone, TimeSpan? offset)
+	{
+		if (dateTime.Kind != DateTimeKind.Utc)
+			throw new ArgumentException("Value must be in UTC.", nameof(dateTime));
+		if (timeZone == null)
+			throw new ArgumentNullException(nameof(timeZone));
+		if (string.IsNullOrWhiteSpace(timeZone))
+			throw new ArgumentException(nameof(timeZone));
+
+		DateTime = dateTime;
+		TimeZone = timeZone;
+		Offset = offset;
+	}
+
+	public FbZonedDateTime(DateTime dateTime, string timeZone)
+		: this(dateTime, timeZone, null)
+	{ }
+
+	public override string ToString()
+	{
+		if (Offset != null)
+		{
+			return $"{DateTime} {TimeZone} ({Offset})";
+		}
+		return $"{DateTime} {TimeZone}";
+	}
+
+	public override bool Equals(object obj)
+	{
+		return obj is FbZonedDateTime fbZonedDateTime && Equals(fbZonedDateTime);
+	}
+
+	public override int GetHashCode()
+	{
+		unchecked
+		{
+			var hash = (int)2166136261;
+			hash = (hash * 16777619) ^ DateTime.GetHashCode();
+			hash = (hash * 16777619) ^ TimeZone.GetHashCode();
+			if (Offset != null)
+				hash = (hash * 16777619) ^ Offset.GetHashCode();
+			return hash;
+		}
+	}
+
+	public bool Equals(FbZonedDateTime other) => DateTime.Equals(other.DateTime) && TimeZone.Equals(other.TimeZone, StringComparison.OrdinalIgnoreCase);
+
+	TypeCode IConvertible.GetTypeCode() => TypeCode.Object;
+
+	DateTime IConvertible.ToDateTime(IFormatProvider provider) => DateTime;
+
+	string IConvertible.ToString(IFormatProvider provider) => ToString();
+
+	object IConvertible.ToType(Type conversionType, IFormatProvider provider)
+		=> ReferenceEquals(conversionType, typeof(FbZonedDateTime))
+			? this
+		: throw new InvalidCastException(conversionType?.FullName);
+
+	bool IConvertible.ToBoolean(IFormatProvider provider) => throw new InvalidCastException(nameof(Boolean));
+	byte IConvertible.ToByte(IFormatProvider provider) => throw new InvalidCastException(nameof(Byte));
+	char IConvertible.ToChar(IFormatProvider provider) => throw new InvalidCastException(nameof(Char));
+	decimal IConvertible.ToDecimal(IFormatProvider provider) => throw new InvalidCastException(nameof(Decimal));
+	double IConvertible.ToDouble(IFormatProvider provider) => throw new InvalidCastException(nameof(Double));
+	short IConvertible.ToInt16(IFormatProvider provider) => throw new InvalidCastException(nameof(Int16));
+	int IConvertible.ToInt32(IFormatProvider provider) => throw new InvalidCastException(nameof(Int32));
+	long IConvertible.ToInt64(IFormatProvider provider) => throw new InvalidCastException(nameof(Int64));
+	sbyte IConvertible.ToSByte(IFormatProvider provider) => throw new InvalidCastException(nameof(SByte));
+	float IConvertible.ToSingle(IFormatProvider provider) => throw new InvalidCastException(nameof(Single));
+	ushort IConvertible.ToUInt16(IFormatProvider provider) => throw new InvalidCastException(nameof(UInt16));
+	uint IConvertible.ToUInt32(IFormatProvider provider) => throw new InvalidCastException(nameof(UInt32));
+	ulong IConvertible.ToUInt64(IFormatProvider provider) => throw new InvalidCastException(nameof(UInt64));
+
+	public static bool operator ==(FbZonedDateTime lhs, FbZonedDateTime rhs) => lhs.Equals(rhs);
+
+	public static bool operator !=(FbZonedDateTime lhs, FbZonedDateTime rhs) => lhs.Equals(rhs);
+}
diff --git a/src/FirebirdSql.Data.FirebirdClient/Types/FbZonedTime.cs b/src/FirebirdSql.Data.FirebirdClient/Types/FbZonedTime.cs
index 56003854..f4f34506 100644
--- a/src/FirebirdSql.Data.FirebirdClient/Types/FbZonedTime.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/Types/FbZonedTime.cs
@@ -1,78 +1,104 @@
-﻿/*
- *    The contents of this file are subject to the Initial
- *    Developer's Public License Version 1.0 (the "License");
- *    you may not use this file except in compliance with the
- *    License. You may obtain a copy of the License at
- *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
- *
- *    Software distributed under the License is distributed on
- *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
- *    express or implied. See the License for the specific
- *    language governing rights and limitations under the License.
- *
- *    All Rights Reserved.
- */
-
-//$Authors = Jiri Cincura (jiri@cincura.net)
-
-using System;
-using System.Runtime.InteropServices;
-
-namespace FirebirdSql.Data.Types;
-
-[StructLayout(LayoutKind.Auto)]
-public readonly struct FbZonedTime : IEquatable<FbZonedTime>
-{
-	public TimeSpan Time { get; }
-	public string TimeZone { get; }
-	public TimeSpan? Offset { get; }
-
-	internal FbZonedTime(TimeSpan time, string timeZone, TimeSpan? offset)
-	{
-		if (timeZone == null)
-			throw new ArgumentNullException(nameof(timeZone));
-		if (string.IsNullOrWhiteSpace(timeZone))
-			throw new ArgumentException(nameof(timeZone));
-
-		Time = time;
-		TimeZone = timeZone;
-		Offset = offset;
-	}
-
-	public FbZonedTime(TimeSpan time, string timeZone)
-		: this(time, timeZone, null)
-	{ }
-
-	public override string ToString()
-	{
-		if (Offset != null)
-		{
-			return $"{Time} {TimeZone} ({Offset})";
-		}
-		return $"{Time} {TimeZone}";
-	}
-
-	public override bool Equals(object obj)
-	{
-		return obj is FbZonedTime fbZonedTime && Equals(fbZonedTime);
-	}
-
-	public override int GetHashCode()
-	{
-		unchecked
-		{
-			var hash = (int)2166136261;
-			hash = (hash * 16777619) ^ Time.GetHashCode();
-			hash = (hash * 16777619) ^ TimeZone.GetHashCode();
-			if (Offset != null)
-				hash = (hash * 16777619) ^ Offset.GetHashCode();
-			return hash;
-		}
-	}
-
-	public bool Equals(FbZonedTime other) => Time.Equals(other.Time) && TimeZone.Equals(other.TimeZone, StringComparison.OrdinalIgnoreCase);
-
-	public static bool operator ==(FbZonedTime lhs, FbZonedTime rhs) => lhs.Equals(rhs);
-
-	public static bool operator !=(FbZonedTime lhs, FbZonedTime rhs) => lhs.Equals(rhs);
-}
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace FirebirdSql.Data.Types;
+
+[StructLayout(LayoutKind.Auto)]
+public readonly struct FbZonedTime : IEquatable<FbZonedTime>, IConvertible
+{
+	public TimeSpan Time { get; }
+	public string TimeZone { get; }
+	public TimeSpan? Offset { get; }
+
+	internal FbZonedTime(TimeSpan time, string timeZone, TimeSpan? offset)
+	{
+		if (timeZone == null)
+			throw new ArgumentNullException(nameof(timeZone));
+		if (string.IsNullOrWhiteSpace(timeZone))
+			throw new ArgumentException(nameof(timeZone));
+
+		Time = time;
+		TimeZone = timeZone;
+		Offset = offset;
+	}
+
+	public FbZonedTime(TimeSpan time, string timeZone)
+		: this(time, timeZone, null)
+	{ }
+
+	public override string ToString()
+	{
+		if (Offset != null)
+		{
+			return $"{Time} {TimeZone} ({Offset})";
+		}
+		return $"{Time} {TimeZone}";
+	}
+
+	public override bool Equals(object obj)
+	{
+		return obj is FbZonedTime fbZonedTime && Equals(fbZonedTime);
+	}
+
+	public override int GetHashCode()
+	{
+		unchecked
+		{
+			var hash = (int)2166136261;
+			hash = (hash * 16777619) ^ Time.GetHashCode();
+			hash = (hash * 16777619) ^ TimeZone.GetHashCode();
+			if (Offset != null)
+				hash = (hash * 16777619) ^ Offset.GetHashCode();
+			return hash;
+		}
+	}
+
+	public bool Equals(FbZonedTime other) => Time.Equals(other.Time) && TimeZone.Equals(other.TimeZone, StringComparison.OrdinalIgnoreCase);
+
+	TypeCode IConvertible.GetTypeCode() => TypeCode.Object;
+
+	string IConvertible.ToString(IFormatProvider provider) => ToString();
+
+	object IConvertible.ToType(Type conversionType, IFormatProvider provider)
+		=> ReferenceEquals(conversionType, typeof(FbZonedTime))
+			? this
+			: ReferenceEquals(conversionType, typeof(TimeSpan))
+				? Time
+				: throw new InvalidCastException(conversionType?.FullName);
+
+	bool IConvertible.ToBoolean(IFormatProvider provider) => throw new InvalidCastException(nameof(Boolean));
+	byte IConvertible.ToByte(IFormatProvider provider) => throw new InvalidCastException(nameof(Byte));
+	char IConvertible.ToChar(IFormatProvider provider) => throw new InvalidCastException(nameof(Char));
+	DateTime IConvertible.ToDateTime(IFormatProvider provider) => throw new InvalidCastException(nameof(DateTime));
+	decimal IConvertible.ToDecimal(IFormatProvider provider) => throw new InvalidCastException(nameof(Decimal));
+	double IConvertible.ToDouble(IFormatProvider provider) => throw new InvalidCastException(nameof(Double));
+	short IConvertible.ToInt16(IFormatProvider provider) => throw new InvalidCastException(nameof(Int16));
+	int IConvertible.ToInt32(IFormatProvider provider) => throw new InvalidCastException(nameof(Int32));
+	long IConvertible.ToInt64(IFormatProvider provider) => throw new InvalidCastException(nameof(Int64));
+	sbyte IConvertible.ToSByte(IFormatProvider provider) => throw new InvalidCastException(nameof(SByte));
+	float IConvertible.ToSingle(IFormatProvider provider) => throw new InvalidCastException(nameof(Single));
+	ushort IConvertible.ToUInt16(IFormatProvider provider) => throw new InvalidCastException(nameof(UInt16));
+	uint IConvertible.ToUInt32(IFormatProvider provider) => throw new InvalidCastException(nameof(UInt32));
+	ulong IConvertible.ToUInt64(IFormatProvider provider) => throw new InvalidCastException(nameof(UInt64));
+
+	public static bool operator ==(FbZonedTime lhs, FbZonedTime rhs) => lhs.Equals(rhs);
+
+	public static bool operator !=(FbZonedTime lhs, FbZonedTime rhs) => lhs.Equals(rhs);
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/ComplianceFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/ComplianceFbTest.cs
new file mode 100644
index 00000000..1f2493f6
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/ComplianceFbTest.cs
@@ -0,0 +1,158 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests;
+
+public class ComplianceFbTest : Microsoft.EntityFrameworkCore.RelationalComplianceTestBase
+{
+	protected override ICollection<Type> IgnoredTestBases { get; } =
+	[
+		typeof(Microsoft.EntityFrameworkCore.ApiConsistencyTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BadDataJsonDeserializationTestBase),
+		typeof(Microsoft.EntityFrameworkCore.BuiltInDataTypesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ComplexTypesTrackingTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.CompositeKeyEndToEndTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ConcurrencyDetectorDisabledTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ConcurrencyDetectorEnabledTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ConcurrencyDetectorTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ConferencePlannerTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ConvertToProviderTypesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.CustomConvertersTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.DataAnnotationTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.DataBindingTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.EntityFrameworkServiceCollectionExtensionsTestBase),
+		typeof(Microsoft.EntityFrameworkCore.FieldMappingTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.FieldsOnlyLoadTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.FindTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.GraphUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ProxyGraphUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.InterceptionTestBase),
+		typeof(Microsoft.EntityFrameworkCore.JsonTypesTestBase),
+		typeof(Microsoft.EntityFrameworkCore.KeysWithConvertersTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.LazyLoadProxyTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.LoadTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.LoggingTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ManyToManyFieldsLoadTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ManyToManyLoadTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ManyToManyTrackingTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.MaterializationInterceptionTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding101TestBase),
+		typeof(Microsoft.EntityFrameworkCore.MonsterFixupTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.MusicStoreTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.NotificationEntitiesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.OptimisticConcurrencyTestBase<,>),
+		typeof(Microsoft.EntityFrameworkCore.OverzealousInitializationTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.PropertyValuesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.QueryExpressionInterceptionTestBase),
+		typeof(Microsoft.EntityFrameworkCore.AdHocManyToManyQueryTestBase),
+		typeof(Microsoft.EntityFrameworkCore.SaveChangesInterceptionTestBase),
+		typeof(Microsoft.EntityFrameworkCore.SeedingTestBase),
+		typeof(Microsoft.EntityFrameworkCore.SerializationTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.SingletonInterceptorsTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.SpatialTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.StoreGeneratedFixupTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.StoreGeneratedTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ValueConvertersEndToEndTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.WithConstructorsTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.CommandInterceptionTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ConcurrencyDetectorDisabledRelationalTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ConcurrencyDetectorEnabledRelationalTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ConnectionInterceptionTestBase),
+		typeof(Microsoft.EntityFrameworkCore.DataAnnotationRelationalTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.DesignTimeTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.EntitySplittingTestBase),
+		typeof(Microsoft.EntityFrameworkCore.JsonTypesRelationalTestBase),
+		typeof(Microsoft.EntityFrameworkCore.LoggingRelationalTestBase<,>),
+		typeof(Microsoft.EntityFrameworkCore.ManyToManyTrackingRelationalTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding101RelationalTestBase),
+		typeof(Microsoft.EntityFrameworkCore.OptimisticConcurrencyRelationalTestBase<,>),
+		typeof(Microsoft.EntityFrameworkCore.RelationalServiceCollectionExtensionsTestBase),
+		typeof(Microsoft.EntityFrameworkCore.StoreGeneratedFixupRelationalTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.TableSplittingTestBase),
+		typeof(Microsoft.EntityFrameworkCore.TPTTableSplittingTestBase),
+		typeof(Microsoft.EntityFrameworkCore.TransactionInterceptionTestBase),
+		typeof(Microsoft.EntityFrameworkCore.TransactionTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.TwoDatabasesTestBase),
+
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.ModelBuilderTest.ComplexTypeTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.ModelBuilderTest.ModelBuilderTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.ModelBuilderTest.InheritanceTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.ModelBuilderTest.ManyToManyTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.ModelBuilderTest.ManyToOneTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.ModelBuilderTest.NonRelationshipTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.ModelBuilderTest.OneToManyTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.ModelBuilderTest.OneToOneTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.ModelBuilderTest.OwnedTypesTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.RelationalModelBuilderTest.RelationalNonRelationshipTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.RelationalModelBuilderTest.RelationalComplexTypeTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.RelationalModelBuilderTest.RelationalInheritanceTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.RelationalModelBuilderTest.RelationalOneToManyTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.RelationalModelBuilderTest.RelationalManyToOneTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.RelationalModelBuilderTest.RelationalOneToOneTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.RelationalModelBuilderTest.RelationalManyToManyTestBase),
+		typeof(Microsoft.EntityFrameworkCore.ModelBuilding.RelationalModelBuilderTest.RelationalOwnedTypesTestBase),
+
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.BulkUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.ComplexTypeBulkUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.FiltersInheritanceBulkUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.InheritanceBulkUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.NonSharedModelBulkUpdatesTestBase),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.NorthwindBulkUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.ComplexTypeBulkUpdatesRelationalTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.FiltersInheritanceBulkUpdatesRelationalTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.InheritanceBulkUpdatesRelationalTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.NonSharedModelBulkUpdatesRelationalTestBase),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.NorthwindBulkUpdatesRelationalTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.TPCFiltersInheritanceBulkUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.TPCInheritanceBulkUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.TPHInheritanceBulkUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.TPTFiltersInheritanceBulkUpdatesTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.BulkUpdates.TPTInheritanceBulkUpdatesTestBase<>),
+
+		typeof(Microsoft.EntityFrameworkCore.Update.JsonUpdateTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.Update.NonSharedModelUpdatesTestBase),
+		typeof(Microsoft.EntityFrameworkCore.Update.StoredProcedureUpdateTestBase),
+		typeof(Microsoft.EntityFrameworkCore.Update.StoreValueGenerationTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.Update.UpdateSqlGeneratorTestBase),
+
+		typeof(Microsoft.EntityFrameworkCore.Scaffolding.CompiledModelTestBase),
+		typeof(Microsoft.EntityFrameworkCore.Scaffolding.CompiledModelRelationalTestBase),
+
+		typeof(Microsoft.EntityFrameworkCore.Migrations.MigrationsInfrastructureTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGeneratorTestBase),
+
+		// JSON not supported on FB
+		typeof(Microsoft.EntityFrameworkCore.Query.JsonQueryTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.Query.JsonQueryRelationalTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.Query.AdHocJsonQueryTestBase),
+
+		// Spatial not supported on FB
+		typeof(Microsoft.EntityFrameworkCore.Query.SpatialQueryTestBase<>),
+		typeof(Microsoft.EntityFrameworkCore.Query.SpatialQueryRelationalTestBase<>),
+
+		// Uses some JSON
+		typeof(Microsoft.EntityFrameworkCore.Query.AdHocPrecompiledQueryRelationalTestBase),
+		typeof(Microsoft.EntityFrameworkCore.Query.PrecompiledQueryRelationalTestBase),
+		typeof(Microsoft.EntityFrameworkCore.Query.PrecompiledSqlPregenerationQueryRelationalTestBase),
+	];
+
+	protected override Assembly TargetAssembly { get; } = typeof(ComplianceFbTest).Assembly;
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.csproj b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.csproj
index 38b0392a..10f83084 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.csproj
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.csproj
@@ -1,6 +1,6 @@
 ﻿<Project Sdk="Microsoft.NET.Sdk">
 	<PropertyGroup>
-		<TargetFramework>net7.0</TargetFramework>
+		<TargetFramework>net9.0</TargetFramework>
 		<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
 		<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
 		<SkipSourceLink>true</SkipSourceLink>
@@ -11,16 +11,15 @@
 		<PreserveCompilationContext>true</PreserveCompilationContext>
 	</PropertyGroup>
 	<ItemGroup>
-		<PackageReference Include="Microsoft.EntityFrameworkCore.Relational.Specification.Tests" Version="7.0.10" />
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
-		<PackageReference Include="xunit" Version="2.4.2" />
-		<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
+		<PackageReference Include="Microsoft.EntityFrameworkCore.Relational.Specification.Tests" Version="$(EFCoreReferencePackageVersion)" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+		<PackageReference Include="xunit" Version="2.9.2" />
+		<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
 		  <PrivateAssets>all</PrivateAssets>
 		  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 		</PackageReference>
 	</ItemGroup>
 	<ItemGroup>
-		<ProjectReference Include="..\FirebirdSql.Data.FirebirdClient\FirebirdSql.Data.FirebirdClient.csproj" />
 		<ProjectReference Include="..\FirebirdSql.EntityFrameworkCore.Firebird\FirebirdSql.EntityFrameworkCore.Firebird.csproj" />
 	</ItemGroup>
 	<ItemGroup>
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Helpers/ModelHelpers.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Helpers/ModelHelpers.cs
index f2d9b237..96fc88b6 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Helpers/ModelHelpers.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Helpers/ModelHelpers.cs
@@ -30,12 +30,30 @@ public static void SetStringLengths(ModelBuilder modelBuilder)
 	{
 		foreach (var entityType in modelBuilder.Model.GetEntityTypes())
 		{
-			foreach (var property in entityType.GetProperties())
+			HandleProperties(entityType.GetProperties());
+			HandleComplexProperties(entityType.GetComplexProperties());
+		}
+
+		void HandleProperties(IEnumerable<IMutableProperty> properties)
+		{
+			foreach (var property in properties)
+			{
+				SetStringLength(property);
+			}
+		}
+		void HandleComplexProperties(IEnumerable<IMutableComplexProperty> complexProperties)
+		{
+			foreach (var cp in complexProperties)
+			{
+				HandleProperties(cp.ComplexType.GetProperties());
+				HandleComplexProperties(cp.ComplexType.GetComplexProperties());
+			}
+		}
+		void SetStringLength(IMutableProperty property)
+		{
+			if (property.ClrType == typeof(string) && property.GetMaxLength() == null)
 			{
-				if (property.ClrType == typeof(string) && property.GetMaxLength() == null)
-				{
-					property.SetMaxLength(500);
-				}
+				property.SetMaxLength(500);
 			}
 		}
 	}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/MigrationsFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/MigrationsFbTest.cs
index d2763182..0b2be24b 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/MigrationsFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/MigrationsFbTest.cs
@@ -129,8 +129,10 @@ public MigrationsFbTest(MigrationsFbFixture fixture)
 	[Fact(Skip = SkipReason)]
 	public override Task Add_column_with_collation() => base.Add_column_with_collation();
 
-	[Fact(Skip = SkipReason)]
-	public override Task Add_column_computed_with_collation() => base.Add_column_computed_with_collation();
+	[Theory(Skip = SkipReason)]
+	[InlineData(true)]
+	[InlineData(false)]
+	public override Task Add_column_computed_with_collation(bool stored) => base.Add_column_computed_with_collation(stored);
 
 	[Fact(Skip = SkipReason)]
 	public override Task Add_column_shared() => base.Add_column_shared();
@@ -324,6 +326,87 @@ public MigrationsFbTest(MigrationsFbFixture fixture)
 	[Fact(Skip = SkipReason)]
 	public override Task Drop_primary_key_string() => base.Drop_primary_key_string();
 
+	[Fact(Skip = SkipReason)]
+	public override Task Alter_sequence_restart_with() => base.Alter_sequence_restart_with();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_column_with_unbounded_max_length() => base.Add_column_with_unbounded_max_length();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_optional_primitive_collection_to_existing_table() => base.Add_optional_primitive_collection_to_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_required_primitve_collection_to_existing_table() => base.Add_required_primitve_collection_to_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_required_primitve_collection_with_custom_converter_and_custom_default_value_to_existing_table() => base.Add_required_primitve_collection_with_custom_converter_and_custom_default_value_to_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_required_primitve_collection_with_custom_default_value_to_existing_table() => base.Add_required_primitve_collection_with_custom_default_value_to_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Create_table_with_complex_type_with_required_properties_on_derived_entity_in_TPH() => base.Create_table_with_complex_type_with_required_properties_on_derived_entity_in_TPH();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Create_table_with_optional_primitive_collection() => base.Create_table_with_optional_primitive_collection();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Create_table_with_required_primitive_collection() => base.Create_table_with_required_primitive_collection();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_required_primitve_collection_with_custom_default_value_sql_to_existing_table() => Task.CompletedTask;
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_required_primitive_collection_with_custom_default_value_sql_to_existing_table() => Task.CompletedTask;
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_json_columns_to_existing_table() => base.Add_json_columns_to_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_required_primitive_collection_to_existing_table() => base.Add_required_primitive_collection_to_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_required_primitive_collection_with_custom_converter_and_custom_default_value_to_existing_table() => base.Add_required_primitive_collection_with_custom_converter_and_custom_default_value_to_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_required_primitive_collection_with_custom_converter_to_existing_table() => base.Add_required_primitive_collection_with_custom_converter_to_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_required_primitive_collection_with_custom_default_value_to_existing_table() => base.Add_required_primitive_collection_with_custom_default_value_to_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Add_required_primitve_collection_with_custom_converter_to_existing_table() => base.Add_required_primitve_collection_with_custom_converter_to_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Convert_json_entities_to_regular_owned() => base.Convert_json_entities_to_regular_owned();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Convert_regular_owned_entities_to_json() => base.Convert_regular_owned_entities_to_json();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Convert_string_column_to_a_json_column_containing_collection() => base.Convert_string_column_to_a_json_column_containing_collection();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Convert_string_column_to_a_json_column_containing_reference() => base.Convert_string_column_to_a_json_column_containing_reference();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Convert_string_column_to_a_json_column_containing_required_reference() => base.Convert_string_column_to_a_json_column_containing_required_reference();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Create_table_with_json_column() => base.Create_table_with_json_column();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Create_table_with_json_column_explicit_json_column_names() => base.Create_table_with_json_column_explicit_json_column_names();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Drop_json_columns_from_existing_table() => base.Drop_json_columns_from_existing_table();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Rename_json_column() => base.Rename_json_column();
+
+	[Fact(Skip = SkipReason)]
+	public override Task Rename_table_with_json_column() => base.Rename_table_with_json_column();
+
 	public class MigrationsFbFixture : MigrationsFixtureBase
 	{
 		protected override string StoreName => nameof(MigrationsFbTest);
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ManyToManyHeterogeneousQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocAdvancedMappingsQueryFbTest.cs
similarity index 91%
rename from src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ManyToManyHeterogeneousQueryFbTest.cs
rename to src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocAdvancedMappingsQueryFbTest.cs
index 910e239c..f18e24d8 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ManyToManyHeterogeneousQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocAdvancedMappingsQueryFbTest.cs
@@ -21,7 +21,7 @@
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class ManyToManyHeterogeneousQueryFbTest : ManyToManyHeterogeneousQueryRelationalTestBase
+public class AdHocAdvancedMappingsQueryFbTest : AdHocAdvancedMappingsQueryRelationalTestBase
 {
 	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocComplexTypeQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocComplexTypeQueryFbTest.cs
new file mode 100644
index 00000000..e8a58d4a
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocComplexTypeQueryFbTest.cs
@@ -0,0 +1,27 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class AdHocComplexTypeQueryFbTest : AdHocComplexTypeQueryTestBase
+{
+	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocManyToManyQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocManyToManyQueryFbTest.cs
new file mode 100644
index 00000000..d091978f
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocManyToManyQueryFbTest.cs
@@ -0,0 +1,27 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class AdHocManyToManyQueryFbTest : AdHocManyToManyQueryRelationalTestBase
+{
+	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/SimpleQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocMiscellaneousQueryFbTest.cs
similarity index 83%
rename from src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/SimpleQueryFbTest.cs
rename to src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocMiscellaneousQueryFbTest.cs
index 06c511f5..1acdeedb 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/SimpleQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocMiscellaneousQueryFbTest.cs
@@ -26,7 +26,7 @@
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class SimpleQueryFbTest : SimpleQueryRelationalTestBase
+public class AdHocMiscellaneousQueryFbTest : AdHocMiscellaneousQueryRelationalTestBase
 {
 	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
 
@@ -44,13 +44,6 @@ public override Task Multiple_different_entity_type_from_different_namespaces(bo
 		return base.Multiple_different_entity_type_from_different_namespaces(async);
 	}
 
-	[HasDataInTheSameTransactionAsDDLTheory]
-	[MemberData(nameof(IsAsyncData))]
-	public override Task Multiple_nested_reference_navigations(bool async)
-	{
-		return base.Multiple_nested_reference_navigations(async);
-	}
-
 	[HasDataInTheSameTransactionAsDDLTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Comparing_byte_column_to_enum_in_vb_creating_double_cast(bool async)
@@ -78,4 +71,16 @@ public override Task Null_check_removal_in_ternary_maintain_appropriate_cast(boo
 	{
 		return base.Null_check_removal_in_ternary_maintain_appropriate_cast(async);
 	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Operators_combine_nullability_of_entity_shapers()
+	{
+		return base.Operators_combine_nullability_of_entity_shapers();
+	}
+
+	protected override async Task Seed2951(Context2951 context)
+	{
+		await context.Database.ExecuteSqlRawAsync("""CREATE TABLE "ZeroKey" ("Id" INT)""");
+		await context.Database.ExecuteSqlRawAsync("""INSERT INTO "ZeroKey" VALUES (NULL)""");
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocNavigationsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocNavigationsQueryFbTest.cs
new file mode 100644
index 00000000..6ceedbf8
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocNavigationsQueryFbTest.cs
@@ -0,0 +1,56 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System.Linq;
+using System.Threading.Tasks;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+using Xunit;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class AdHocNavigationsQueryFbTest : AdHocNavigationsQueryRelationalTestBase
+{
+	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Let_multiple_references_with_reference_to_outer()
+	{
+		return base.Let_multiple_references_with_reference_to_outer();
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Projection_with_multiple_includes_and_subquery_with_set_operation()
+	{
+		return base.Projection_with_multiple_includes_and_subquery_with_set_operation();
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task SelectMany_and_collection_in_projection_in_FirstOrDefault()
+	{
+		return base.SelectMany_and_collection_in_projection_in_FirstOrDefault();
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Correlated_collection_correctly_associates_entities_with_byte_array_keys()
+	{
+		return base.Correlated_collection_correctly_associates_entities_with_byte_array_keys();
+	}
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceRelationshipsQueryFbFixture.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocQueryFiltersQueryFbTest.cs
similarity index 69%
rename from src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceRelationshipsQueryFbFixture.cs
rename to src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocQueryFiltersQueryFbTest.cs
index 81a30a96..24a64585 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceRelationshipsQueryFbFixture.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocQueryFiltersQueryFbTest.cs
@@ -15,22 +15,21 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
-using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
+using System.Threading.Tasks;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
-using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Query;
 using Microsoft.EntityFrameworkCore.TestUtilities;
+using Xunit;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class InheritanceRelationshipsQueryFbFixture : InheritanceRelationshipsQueryRelationalFixture
+public class AdHocQueryFiltersQueryFbTest : AdHocQueryFiltersQueryRelationalTestBase
 {
 	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
 
-	protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext context)
+	[Fact(Skip = "PK name collision and not easy way to override model.")]
+	public override Task Self_reference_in_query_filter_works()
 	{
-		base.OnModelCreating(modelBuilder, context);
-		ModelHelpers.SetPrimaryKeyGeneration(modelBuilder);
-		ModelHelpers.SimpleTableNames(modelBuilder);
+		return base.Self_reference_in_query_filter_works();
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocQuerySplittingQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocQuerySplittingQueryFbTest.cs
new file mode 100644
index 00000000..c08ae53a
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/AdHocQuerySplittingQueryFbTest.cs
@@ -0,0 +1,72 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System.Reflection;
+using System.Threading.Tasks;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using FirebirdSql.EntityFrameworkCore.Firebird.Infrastructure;
+using FirebirdSql.EntityFrameworkCore.Firebird.Infrastructure.Internal;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+using Xunit;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class AdHocQuerySplittingQueryFbTest : AdHocQuerySplittingQueryTestBase
+{
+	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+
+	static readonly FieldInfo _querySplittingBehaviorFieldInfo = typeof(RelationalOptionsExtension).GetField("_querySplittingBehavior", BindingFlags.NonPublic | BindingFlags.Instance);
+
+	protected override DbContextOptionsBuilder SetQuerySplittingBehavior(DbContextOptionsBuilder optionsBuilder, QuerySplittingBehavior splittingBehavior)
+	{
+		new FbDbContextOptionsBuilder(optionsBuilder).UseQuerySplittingBehavior(splittingBehavior);
+		return optionsBuilder;
+	}
+
+	protected override DbContextOptionsBuilder ClearQuerySplittingBehavior(DbContextOptionsBuilder optionsBuilder)
+	{
+#pragma warning disable EF1001
+		var extension = optionsBuilder.Options.FindExtension<FbOptionsExtension>();
+		if (extension == null)
+		{
+			extension = new FbOptionsExtension();
+		}
+		else
+		{
+			_querySplittingBehaviorFieldInfo.SetValue(extension, null);
+		}
+		((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(extension);
+		return optionsBuilder;
+#pragma warning restore EF1001
+	}
+
+	[Fact(Skip = "Not supported because of current test initialization setup.")]
+	public override Task Can_query_with_nav_collection_in_projection_with_split_query_in_parallel_async()
+	{
+		return base.Can_query_with_nav_collection_in_projection_with_split_query_in_parallel_async();
+	}
+
+	[Fact(Skip = "Not supported because of current test initialization setup.")]
+	public override Task Can_query_with_nav_collection_in_projection_with_split_query_in_parallel_sync()
+	{
+		return base.Can_query_with_nav_collection_in_projection_with_split_query_in_parallel_sync();
+	}
+}
+
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsCollectionsSplitSharedTypeQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsCollectionsSplitSharedTypeQueryFbTest.cs
index e5641d09..0f470b08 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsCollectionsSplitSharedTypeQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsCollectionsSplitSharedTypeQueryFbTest.cs
@@ -146,4 +146,11 @@ public override Task Take_Select_collection_Take(bool async)
 	{
 		return base.Take_Select_collection_Take(async);
 	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Filtered_include_Skip_Take_with_another_Skip_Take_on_top_level(bool async)
+	{
+		return base.Filtered_include_Skip_Take_with_another_Skip_Take_on_top_level(async);
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsQueryFbTest.cs
index 5b0edb49..8f4b3ed9 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsQueryFbTest.cs
@@ -18,13 +18,12 @@
 using System;
 using System.Threading.Tasks;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
-using Microsoft.EntityFrameworkCore.Diagnostics;
 using Microsoft.EntityFrameworkCore.Query;
 using Xunit;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class ComplexNavigationsQueryFbTest : ComplexNavigationsQueryTestBase<ComplexNavigationsQueryFbFixture>
+public class ComplexNavigationsQueryFbTest : ComplexNavigationsQueryRelationalTestBase<ComplexNavigationsQueryFbFixture>
 {
 	public ComplexNavigationsQueryFbTest(ComplexNavigationsQueryFbFixture fixture)
 		: base(fixture)
@@ -772,6 +771,27 @@ public override Task Nested_SelectMany_correlated_with_join_table_correctly_tran
 		return base.Nested_SelectMany_correlated_with_join_table_correctly_translated_to_apply(async);
 	}
 
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Correlated_projection_with_first(bool async)
+	{
+		return base.Correlated_projection_with_first(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Multiple_select_many_in_projection(bool async)
+	{
+		return base.Multiple_select_many_in_projection(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Single_select_many_in_projection_with_take(bool async)
+	{
+		return base.Single_select_many_in_projection_with_take(async);
+	}
+
 	[Theory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task GroupJoin_client_method_in_OrderBy(bool async)
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsSharedTypeQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsSharedTypeQueryFbTest.cs
index 2d69e963..d7dabbcc 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsSharedTypeQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexNavigationsSharedTypeQueryFbTest.cs
@@ -79,6 +79,27 @@ public override Task Prune_does_not_throw_null_ref(bool async)
 		return base.Prune_does_not_throw_null_ref(async);
 	}
 
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Correlated_projection_with_first(bool async)
+	{
+		return base.Correlated_projection_with_first(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Multiple_select_many_in_projection(bool async)
+	{
+		return base.Multiple_select_many_in_projection(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Single_select_many_in_projection_with_take(bool async)
+	{
+		return base.Single_select_many_in_projection_with_take(async);
+	}
+
 	[Theory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Project_shadow_properties10(bool async)
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexTypeQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexTypeQueryFbTest.cs
new file mode 100644
index 00000000..0e84b62a
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ComplexTypeQueryFbTest.cs
@@ -0,0 +1,198 @@
+/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestModels.ComplexTypeModel;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+using Xunit;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class ComplexTypeQueryFbTest : ComplexTypeQueryRelationalTestBase<ComplexTypeQueryFbTest.ComplexTypeQueryFbFixture>
+{
+	public ComplexTypeQueryFbTest(ComplexTypeQueryFbFixture fixture)
+		: base(fixture)
+	{ }
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_complex_type_via_optional_navigation(bool async)
+	{
+		return Assert.ThrowsAsync<InvalidOperationException>(() => base.Project_complex_type_via_optional_navigation(async));
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_struct_complex_type_via_optional_navigation(bool async)
+	{
+		return Assert.ThrowsAsync<InvalidOperationException>(() => base.Project_struct_complex_type_via_optional_navigation(async));
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Union_property_in_complex_type(bool async)
+	{
+		return AssertQuery(
+			async,
+			ss => ss.Set<Customer>().Select(c => c.ShippingAddress.AddressLine1)
+				.Union(ss.Set<Customer>().Select(c => c.BillingAddress.AddressLine1)));
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_same_entity_with_nested_complex_type_twice_with_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Project_same_entity_with_nested_complex_type_twice_with_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_same_entity_with_nested_complex_type_twice_with_double_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Project_same_entity_with_nested_complex_type_twice_with_double_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_same_entity_with_struct_nested_complex_type_twice_with_double_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Project_same_entity_with_struct_nested_complex_type_twice_with_double_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_same_entity_with_struct_nested_complex_type_twice_with_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Project_same_entity_with_struct_nested_complex_type_twice_with_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_same_nested_complex_type_twice_with_double_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Project_same_nested_complex_type_twice_with_double_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_same_nested_complex_type_twice_with_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Project_same_nested_complex_type_twice_with_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_same_struct_nested_complex_type_twice_with_double_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Project_same_struct_nested_complex_type_twice_with_double_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_same_struct_nested_complex_type_twice_with_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Project_same_struct_nested_complex_type_twice_with_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Union_of_same_entity_with_nested_complex_type_projected_twice_with_double_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Union_of_same_entity_with_nested_complex_type_projected_twice_with_double_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Union_of_same_entity_with_nested_complex_type_projected_twice_with_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Union_of_same_entity_with_nested_complex_type_projected_twice_with_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Union_of_same_nested_complex_type_projected_twice_with_double_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Union_of_same_nested_complex_type_projected_twice_with_double_pushdown(async);
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Union_of_same_nested_complex_type_projected_twice_with_pushdown(bool async)
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return Task.CompletedTask;
+		return base.Union_of_same_nested_complex_type_projected_twice_with_pushdown(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Same_entity_with_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(bool async)
+	{
+		return base.Same_entity_with_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(async);
+	}
+
+	public class ComplexTypeQueryFbFixture : ComplexTypeQueryRelationalFixtureBase
+	{
+		protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+
+		protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext context)
+		{
+			base.OnModelCreating(modelBuilder, context);
+			ModelHelpers.SetStringLengths(modelBuilder);
+		}
+	}
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/CompositeKeysQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/CompositeKeysQueryFbTest.cs
index c4b8eed6..1caa4123 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/CompositeKeysQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/CompositeKeysQueryFbTest.cs
@@ -24,7 +24,4 @@ public class CompositeKeysQueryFbTest : CompositeKeysQueryRelationalTestBase<Com
 	public CompositeKeysQueryFbTest(CompositeKeysQueryFbFixture fixture)
 		: base(fixture)
 	{ }
-
-	protected override bool CanExecuteQueryString => false;
-
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/CompositeKeysSplitQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/CompositeKeysSplitQueryFbTest.cs
index 82d9dfbd..725f0826 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/CompositeKeysSplitQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/CompositeKeysSplitQueryFbTest.cs
@@ -24,6 +24,4 @@ public class CompositeKeysSplitQueryFbTest : CompositeKeysSplitQueryRelationalTe
 	public CompositeKeysSplitQueryFbTest(CompositeKeysQueryFbFixture fixture)
 		: base(fixture)
 	{ }
-
-	protected override bool CanExecuteQueryString => false;
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/Ef6GroupByFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/Ef6GroupByFbTest.cs
index 8735d678..d0e8b5b9 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/Ef6GroupByFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/Ef6GroupByFbTest.cs
@@ -45,10 +45,12 @@ public override Task Average_Grouped_from_LINQ_101(bool async)
 		return base.Average_Grouped_from_LINQ_101(async);
 	}
 
-	public class Ef6GroupByFbFixture : Ef6GroupByFixtureBase
+	public class Ef6GroupByFbFixture : Ef6GroupByFixtureBase, ITestSqlLoggerFactory
 	{
 		protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
 
+		public TestSqlLoggerFactory TestSqlLoggerFactory => (TestSqlLoggerFactory)ListLoggerFactory;
+
 		protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext context)
 		{
 			base.OnModelCreating(modelBuilder, context);
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FromSqlQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FromSqlQueryFbTest.cs
index f306be02..0644961e 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FromSqlQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FromSqlQueryFbTest.cs
@@ -22,7 +22,6 @@
 using FirebirdSql.Data.FirebirdClient;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Diagnostics;
 using Microsoft.EntityFrameworkCore.Query;
 using Microsoft.EntityFrameworkCore.TestModels.Northwind;
 using Microsoft.EntityFrameworkCore.TestUtilities;
@@ -36,13 +35,6 @@ public FromSqlQueryFbTest(NorthwindQueryFbFixture<NoopModelCustomizer> fixture)
 		: base(fixture)
 	{ }
 
-	protected override DbParameter CreateDbParameter(string name, object value)
-		=> new FbParameter
-		{
-			ParameterName = name,
-			Value = value
-		};
-
 	[Theory]
 	[MemberData(nameof(IsAsyncData))]
 	public override async Task FromSql_Count_used_twice_without_parameters(bool async)
@@ -164,4 +156,14 @@ public override Task Multiple_occurrences_of_FromSql_with_db_parameter_adds_para
 	{
 		return base.Multiple_occurrences_of_FromSql_with_db_parameter_adds_parameter_only_once(async);
 	}
+
+	[Theory(Skip = "Firebird matches the casing exactly. Frankly the test is weird.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task FromSqlRaw_queryable_simple_different_cased_columns_and_not_enough_columns_throws(bool async)
+	{
+		return base.FromSqlRaw_queryable_simple_different_cased_columns_and_not_enough_columns_throws(async);
+	}
+
+	protected override DbParameter CreateDbParameter(string name, object value)
+		=> new FbParameter { ParameterName = name, Value = value };
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FunkyDataQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FunkyDataQueryFbTest.cs
index 8510b7af..1a778cf0 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FunkyDataQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FunkyDataQueryFbTest.cs
@@ -15,7 +15,7 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
-using System.Linq;
+using System.Threading.Tasks;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
 using Microsoft.EntityFrameworkCore;
@@ -31,10 +31,19 @@ public FunkyDataQueryFbTest(FunkyDataQueryFbFixture fixture)
 		: base(fixture)
 	{ }
 
-	public class FunkyDataQueryFbFixture : FunkyDataQueryFixtureBase
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task String_contains_on_argument_with_wildcard_column(bool async)
+	{
+		return base.String_contains_on_argument_with_wildcard_column(async);
+	}
+
+	public class FunkyDataQueryFbFixture : FunkyDataQueryFixtureBase, ITestSqlLoggerFactory
 	{
 		protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
 
+		public TestSqlLoggerFactory TestSqlLoggerFactory => (TestSqlLoggerFactory)ListLoggerFactory;
+
 		protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext context)
 		{
 			base.OnModelCreating(modelBuilder, context);
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/GearsOfWarQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/GearsOfWarQueryFbTest.cs
index 3d832cce..f6d64548 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/GearsOfWarQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/GearsOfWarQueryFbTest.cs
@@ -390,6 +390,34 @@ public override Task Correlated_collection_with_groupby_with_complex_grouping_ke
 		return base.Correlated_collection_with_groupby_with_complex_grouping_key_not_projecting_identifier_column_with_group_aggregate_in_final_projection(async);
 	}
 
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Subquery_inside_Take_argument(bool async)
+	{
+		return base.Subquery_inside_Take_argument(async);
+	}
+
+	[NotSupportedByProviderTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task DateTimeOffset_to_unix_time_milliseconds(bool async)
+	{
+		return base.DateTimeOffset_to_unix_time_milliseconds(async);
+	}
+
+	[NotSupportedByProviderTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task DateTimeOffset_to_unix_time_seconds(bool async)
+	{
+		return base.DateTimeOffset_to_unix_time_seconds(async);
+	}
+
+	[NotSupportedByProviderTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Non_string_concat_uses_appropriate_type_mapping(bool async)
+	{
+		return base.Non_string_concat_uses_appropriate_type_mapping(async);
+	}
+
 	[Theory(Skip = "NETProvider#1008")]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Where_TimeOnly_IsBetween(bool async)
@@ -403,4 +431,11 @@ public override Task Where_TimeOnly_Add_TimeSpan(bool async)
 	{
 		return base.Where_TimeOnly_Add_TimeSpan(async);
 	}
+
+	[Theory(Skip = "Different implicit ordering on Firebird.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task String_concat_with_null_conditional_argument(bool async)
+	{
+		return base.String_concat_with_null_conditional_argument(async);
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/IncompleteMappingInheritanceQueryFbFixture.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/IncompleteMappingInheritanceQueryFbFixture.cs
index ac1102d7..e7187d90 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/IncompleteMappingInheritanceQueryFbFixture.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/IncompleteMappingInheritanceQueryFbFixture.cs
@@ -21,7 +21,7 @@
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class IncompleteMappingInheritanceQueryFbFixture : InheritanceQueryFbFixture
+public class IncompleteMappingInheritanceQueryFbFixture : TPHInheritanceQueryFbFixture
 {
-	protected override bool IsDiscriminatorMappingComplete => false;
+	public override bool IsDiscriminatorMappingComplete => false;
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/IncompleteMappingInheritanceQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/IncompleteMappingInheritanceQueryFbTest.cs
index 7be95ad4..b3730b89 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/IncompleteMappingInheritanceQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/IncompleteMappingInheritanceQueryFbTest.cs
@@ -15,14 +15,14 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
-using System.Threading.Tasks;
 using Microsoft.EntityFrameworkCore.Query;
+using Xunit.Abstractions;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class IncompleteMappingInheritanceQueryFbTest : InheritanceRelationalQueryTestBase<IncompleteMappingInheritanceQueryFbFixture>
+public class IncompleteMappingInheritanceQueryFbTest : TPHInheritanceQueryTestBase<IncompleteMappingInheritanceQueryFbFixture>
 {
-	public IncompleteMappingInheritanceQueryFbTest(IncompleteMappingInheritanceQueryFbFixture fixture)
-		: base(fixture)
+	public IncompleteMappingInheritanceQueryFbTest(IncompleteMappingInheritanceQueryFbFixture fixture, ITestOutputHelper testOutputHelper)
+		: base(fixture, testOutputHelper)
 	{ }
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceRelationshipsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceRelationshipsQueryFbTest.cs
index 20854abe..e2fe8d34 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceRelationshipsQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceRelationshipsQueryFbTest.cs
@@ -17,12 +17,15 @@
 
 using System.Threading.Tasks;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
 using Xunit;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class InheritanceRelationshipsQueryFbTest : InheritanceRelationshipsQueryTestBase<InheritanceRelationshipsQueryFbFixture>
+public class InheritanceRelationshipsQueryFbTest : InheritanceRelationshipsQueryTestBase<InheritanceRelationshipsQueryFbTest.InheritanceRelationshipsQueryFbFixture>
 {
 	public InheritanceRelationshipsQueryFbTest(InheritanceRelationshipsQueryFbFixture fixture)
 		: base(fixture)
@@ -361,4 +364,16 @@ public override Task Include_on_derived_type_with_queryable_Cast(bool async)
 	{
 		return base.Include_on_derived_type_with_queryable_Cast(async);
 	}
+
+	public class InheritanceRelationshipsQueryFbFixture : InheritanceRelationshipsQueryRelationalFixture
+	{
+		protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+
+		protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext context)
+		{
+			base.OnModelCreating(modelBuilder, context);
+			ModelHelpers.SetPrimaryKeyGeneration(modelBuilder);
+			ModelHelpers.SimpleTableNames(modelBuilder);
+		}
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NonSharedPrimitiveCollectionsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NonSharedPrimitiveCollectionsQueryFbTest.cs
new file mode 100644
index 00000000..b197da91
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NonSharedPrimitiveCollectionsQueryFbTest.cs
@@ -0,0 +1,223 @@
+/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System.Threading.Tasks;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using FirebirdSql.EntityFrameworkCore.Firebird.Infrastructure;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class NonSharedPrimitiveCollectionsQueryFbTest : NonSharedPrimitiveCollectionsQueryRelationalTestBase
+{
+	protected override DbContextOptionsBuilder SetTranslateParameterizedCollectionsToConstants(DbContextOptionsBuilder optionsBuilder)
+	{
+		new FbDbContextOptionsBuilder(optionsBuilder).TranslateParameterizedCollectionsToConstants();
+		return optionsBuilder;
+	}
+
+	protected override DbContextOptionsBuilder SetTranslateParameterizedCollectionsToParameters(DbContextOptionsBuilder optionsBuilder)
+	{
+		new FbDbContextOptionsBuilder(optionsBuilder).TranslateParameterizedCollectionsToParameters();
+		return optionsBuilder;
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Array_of_string()
+	{
+		return base.Array_of_string();
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Array_of_int()
+	{
+		return base.Array_of_int();
+	}
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_long()
+    {
+        return base.Array_of_long();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_short()
+    {
+        return base.Array_of_short();
+    }
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Array_of_byte()
+	{
+		return base.Array_of_byte();
+	}
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_double()
+    {
+        return base.Array_of_double();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_float()
+    {
+        return base.Array_of_float();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_decimal()
+    {
+        return base.Array_of_decimal();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_DateTime()
+    {
+        return base.Array_of_DateTime();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_DateTime_with_milliseconds()
+    {
+        return base.Array_of_DateTime_with_milliseconds();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_DateTime_with_microseconds()
+    {
+        return base.Array_of_DateTime_with_microseconds();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_DateOnly()
+    {
+        return base.Array_of_DateOnly();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_TimeOnly()
+    {
+        return base.Array_of_TimeOnly();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_TimeOnly_with_milliseconds()
+    {
+        return base.Array_of_TimeOnly_with_milliseconds();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_TimeOnly_with_microseconds()
+    {
+        return base.Array_of_TimeOnly_with_microseconds();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_DateTimeOffset()
+    {
+        return base.Array_of_DateTimeOffset();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_bool()
+    {
+        return base.Array_of_bool();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_Guid()
+    {
+        return base.Array_of_Guid();
+    }
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Array_of_byte_array()
+    {
+        return base.Array_of_byte_array();
+    }
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Array_of_enum()
+	{
+		return base.Array_of_enum();
+	}
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Multidimensional_array_is_not_supported()
+    {
+        return base.Multidimensional_array_is_not_supported();
+    }
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Column_with_custom_converter()
+	{
+		return base.Column_with_custom_converter();
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Parameter_with_inferred_value_converter()
+	{
+		return base.Parameter_with_inferred_value_converter();
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Constant_with_inferred_value_converter()
+	{
+		return base.Constant_with_inferred_value_converter();
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Inline_collection_in_query_filter()
+	{
+		return base.Inline_collection_in_query_filter();
+	}
+
+	[NotSupportedOnFirebirdFact]
+    public override Task Column_collection_inside_json_owned_entity()
+    {
+        return base.Column_collection_inside_json_owned_entity();
+    }
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Parameter_collection_Count_with_column_predicate_with_default_constants()
+	{
+		return base.Parameter_collection_Count_with_column_predicate_with_default_constants();
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Parameter_collection_Count_with_column_predicate_with_default_constants_EF_Parameter()
+	{
+		return base.Parameter_collection_Count_with_column_predicate_with_default_constants_EF_Parameter();
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Parameter_collection_Count_with_column_predicate_with_default_parameters()
+	{
+		return base.Parameter_collection_Count_with_column_predicate_with_default_parameters();
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override Task Parameter_collection_Count_with_column_predicate_with_default_parameters_EF_Constant()
+	{
+		return base.Parameter_collection_Count_with_column_predicate_with_default_parameters_EF_Constant();
+	}
+
+	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindAggregateOperatorsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindAggregateOperatorsQueryFbTest.cs
index fe50eb71..8cd9f61a 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindAggregateOperatorsQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindAggregateOperatorsQueryFbTest.cs
@@ -15,6 +15,7 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
+using System;
 using System.Threading.Tasks;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using Microsoft.EntityFrameworkCore.Query;
@@ -29,8 +30,6 @@ public NorthwindAggregateOperatorsQueryFbTest(NorthwindQueryFbFixture<NoopModelC
 		: base(fixture)
 	{ }
 
-	protected override bool CanExecuteQueryString => false;
-
 	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Multiple_collection_navigation_with_FirstOrDefault_chained(bool async)
@@ -38,6 +37,24 @@ public override Task Multiple_collection_navigation_with_FirstOrDefault_chained(
 		return base.Multiple_collection_navigation_with_FirstOrDefault_chained(async);
 	}
 
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override async Task Contains_with_local_enumerable_inline(bool async)
+	{
+		await Assert.ThrowsAsync<InvalidOperationException>(
+			async () =>
+				await base.Contains_with_local_enumerable_inline(async));
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override async Task Contains_with_local_enumerable_inline_closure_mix(bool async)
+	{
+		await Assert.ThrowsAsync<InvalidOperationException>(
+			async () =>
+				await base.Contains_with_local_enumerable_inline_closure_mix(async));
+	}
+
 	[Theory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Contains_with_local_anonymous_type_array_closure(bool async)
@@ -54,22 +71,29 @@ public override Task Contains_with_local_tuple_array_closure(bool async)
 
 	[Theory(Skip = "Different math on Firebird.")]
 	[MemberData(nameof(IsAsyncData))]
-	public override Task Average_over_max_subquery_is_client_eval(bool async)
+	public override Task Sum_with_division_on_decimal(bool async)
 	{
-		return base.Average_over_max_subquery_is_client_eval(async);
+		return base.Sum_with_division_on_decimal(async);
 	}
 
 	[Theory(Skip = "Different math on Firebird.")]
 	[MemberData(nameof(IsAsyncData))]
-	public override Task Average_over_nested_subquery_is_client_eval(bool async)
+	public override Task Contains_inside_Average_without_GroupBy(bool async)
 	{
-		return base.Average_over_nested_subquery_is_client_eval(async);
+		return base.Contains_inside_Average_without_GroupBy(async);
 	}
 
 	[Theory(Skip = "Different math on Firebird.")]
 	[MemberData(nameof(IsAsyncData))]
-	public override Task Sum_with_division_on_decimal(bool async)
+	public override Task Average_over_max_subquery(bool async)
 	{
-		return base.Sum_with_division_on_decimal(async);
+		return base.Average_over_max_subquery(async);
+	}
+
+	[Theory(Skip = "Different math on Firebird.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Average_over_nested_subquery(bool async)
+	{
+		return base.Average_over_nested_subquery(async);
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindChangeTrackingQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindChangeTrackingQueryFbTest.cs
index b029cade..eace4c3b 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindChangeTrackingQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindChangeTrackingQueryFbTest.cs
@@ -15,6 +15,7 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestModels.Northwind;
 using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Query;
 using Microsoft.EntityFrameworkCore.TestModels.Northwind;
@@ -29,7 +30,7 @@ public NorthwindChangeTrackingQueryFbTest(NorthwindQueryFbFixture<NoopModelCusto
 	{ }
 
 	protected override NorthwindContext CreateNoTrackingContext()
-		=> new NorthwindRelationalContext(
+		=> new NorthwindFbContext(
 			new DbContextOptionsBuilder(Fixture.CreateOptions())
 				.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking).Options);
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindCompiledQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindCompiledQueryFbTest.cs
index d8b1e3e8..f8eaa9d2 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindCompiledQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindCompiledQueryFbTest.cs
@@ -15,15 +15,10 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
-using System;
-using System.Linq;
 using System.Threading.Tasks;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Diagnostics;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using Microsoft.EntityFrameworkCore.Query;
-using Microsoft.EntityFrameworkCore.TestModels.Northwind;
 using Microsoft.EntityFrameworkCore.TestUtilities;
-using Xunit;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
@@ -33,61 +28,15 @@ public NorthwindCompiledQueryFbTest(NorthwindQueryFbFixture<NoopModelCustomizer>
 		: base(fixture)
 	{ }
 
-	[Fact]
-	public override void MakeBinary_does_not_throw_for_unsupported_operator()
-	{
-		Assert.Equal(
-			   CoreStrings.TranslationFailed("DbSet<Customer>()    .Where(c => c.CustomerID == (string)(__parameters[0]))"),
-			   Assert.Throws<InvalidOperationException>(
-				   () => base.MakeBinary_does_not_throw_for_unsupported_operator()).Message.Replace("\r", "").Replace("\n", ""));
-	}
-
-	[Fact]
+	[NotSupportedOnFirebirdFact]
 	public override void Query_with_array_parameter()
 	{
-		var query = EF.CompileQuery(
-			(NorthwindContext context, string[] args)
-				=> context.Customers.Where(c => c.CustomerID == args[0]));
-
-		using (var context = CreateContext())
-		{
-			Assert.Equal(
-				CoreStrings.TranslationFailed("DbSet<Customer>()    .Where(c => c.CustomerID == __args[0])"),
-				Assert.Throws<InvalidOperationException>(
-					() => query(context, new[] { "ALFKI" }).First().CustomerID).Message.Replace("\r", "").Replace("\n", ""));
-		}
-
-		using (var context = CreateContext())
-		{
-			Assert.Equal(
-				CoreStrings.TranslationFailed("DbSet<Customer>()    .Where(c => c.CustomerID == __args[0])"),
-				Assert.Throws<InvalidOperationException>(
-					() => query(context, new[] { "ANATR" }).First().CustomerID).Message.Replace("\r", "").Replace("\n", ""));
-		}
+		base.Query_with_array_parameter();
 	}
 
-	[Fact]
-	public override async Task Query_with_array_parameter_async()
+	[NotSupportedOnFirebirdFact]
+	public override Task Query_with_array_parameter_async()
 	{
-		var query = EF.CompileAsyncQuery(
-						(NorthwindContext context, string[] args)
-							=> context.Customers.Where(c => c.CustomerID == args[0]));
-
-		using (var context = CreateContext())
-		{
-			Assert.Equal(
-				CoreStrings.TranslationFailed("DbSet<Customer>()    .Where(c => c.CustomerID == __args[0])"),
-				(await Assert.ThrowsAsync<InvalidOperationException>(
-					() => Enumerate(query(context, new[] { "ALFKI" })))).Message.Replace("\r", "").Replace("\n", ""));
-		}
-
-		using (var context = CreateContext())
-		{
-			Assert.Equal(
-				CoreStrings.TranslationFailed("DbSet<Customer>()    .Where(c => c.CustomerID == __args[0])"),
-				(await Assert.ThrowsAsync<InvalidOperationException>(
-					() => Enumerate(query(context, new[] { "ANATR" })))).Message.Replace("\r", "").Replace("\n", ""));
-		}
+		return base.Query_with_array_parameter_async();
 	}
-
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindDbFunctionsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindDbFunctionsQueryFbTest.cs
index 3ff08a17..edc655c3 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindDbFunctionsQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindDbFunctionsQueryFbTest.cs
@@ -22,12 +22,15 @@
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class NorthwindDbFunctionsQueryFbTest : NorthwindDbFunctionsQueryTestBase<NorthwindQueryFbFixture<NoopModelCustomizer>>
+public class NorthwindDbFunctionsQueryFbTest : NorthwindDbFunctionsQueryRelationalTestBase<NorthwindQueryFbFixture<NoopModelCustomizer>>
 {
 	public NorthwindDbFunctionsQueryFbTest(NorthwindQueryFbFixture<NoopModelCustomizer> fixture)
 		: base(fixture)
 	{ }
 
+	protected override string CaseInsensitiveCollation => "UNICODE_CI";
+	protected override string CaseSensitiveCollation => "UNICODE";
+
 	public override Task Like_literal(bool async)
 	{
 		// fix wrong assumptions on collate
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindFunctionsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindFunctionsQueryFbTest.cs
index d3ef9d56..eb9cdec0 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindFunctionsQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindFunctionsQueryFbTest.cs
@@ -15,9 +15,12 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
+using System;
+using System.Linq;
 using System.Threading.Tasks;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestModels.Northwind;
 using Microsoft.EntityFrameworkCore.TestUtilities;
 using Xunit;
 
@@ -29,8 +32,6 @@ public NorthwindFunctionsQueryFbTest(NorthwindQueryFbFixture<NoopModelCustomizer
 		: base(fixture)
 	{ }
 
-	protected override bool CanExecuteQueryString => false;
-
 	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Convert_ToBoolean(bool async)
@@ -108,6 +109,41 @@ public override Task TrimStart_with_char_array_argument_in_predicate(bool async)
 		return base.TrimStart_with_char_array_argument_in_predicate(async);
 	}
 
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Where_math_degrees(bool async)
+	{
+		return base.Where_math_degrees(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Where_math_radians(bool async)
+	{
+		return base.Where_mathf_radians(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Where_mathf_degrees(bool async)
+	{
+		return base.Where_math_degrees(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Where_mathf_radians(bool async)
+	{
+		return base.Where_mathf_radians(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task String_Join_non_aggregate(bool async)
+	{
+		return AssertTranslationFailed(() => base.String_Join_non_aggregate(async));
+	}
+
 	[NotSupportedByProviderTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Regex_IsMatch_MethodCall(bool async)
@@ -268,18 +304,4 @@ public override Task Datetime_subtraction_TotalDays(bool async)
 	{
 		return base.Datetime_subtraction_TotalDays(async);
 	}
-
-	[Theory]
-	[MemberData(nameof(IsAsyncData))]
-	public override Task String_FirstOrDefault_MethodCall(bool async)
-	{
-		return base.String_FirstOrDefault_MethodCall(async);
-	}
-
-	[Theory]
-	[MemberData(nameof(IsAsyncData))]
-	public override Task String_LastOrDefault_MethodCall(bool async)
-	{
-		return base.String_LastOrDefault_MethodCall(async);
-	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindGroupByQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindGroupByQueryFbTest.cs
index dbbdc0a7..9cbb7e6e 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindGroupByQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindGroupByQueryFbTest.cs
@@ -25,7 +25,7 @@
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class NorthwindGroupByQueryFbTest : NorthwindGroupByQueryTestBase<NorthwindQueryFbFixture<NoopModelCustomizer>>
+public class NorthwindGroupByQueryFbTest : NorthwindGroupByQueryRelationalTestBase<NorthwindQueryFbFixture<NoopModelCustomizer>>
 {
 	public NorthwindGroupByQueryFbTest(NorthwindQueryFbFixture<NoopModelCustomizer> fixture)
 		: base(fixture)
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindIncludeQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindIncludeQueryFbTest.cs
index 40c659ef..87c8b026 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindIncludeQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindIncludeQueryFbTest.cs
@@ -24,7 +24,7 @@
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class NorthwindIncludeQueryFbTest : NorthwindIncludeQueryTestBase<NorthwindQueryFbFixture<NoopModelCustomizer>>
+public class NorthwindIncludeQueryFbTest : NorthwindIncludeQueryRelationalTestBase<NorthwindQueryFbFixture<NoopModelCustomizer>>
 {
 	public NorthwindIncludeQueryFbTest(NorthwindQueryFbFixture<NoopModelCustomizer> fixture)
 		: base(fixture)
@@ -58,13 +58,6 @@ public override Task Include_collection_with_cross_apply_with_filter(bool async)
 		return base.Include_collection_with_cross_apply_with_filter(async);
 	}
 
-	[Theory]
-	[MemberData(nameof(IsAsyncData))]
-	public override Task Include_collection_with_last_no_orderby(bool async)
-	{
-		return Assert.ThrowsAsync<InvalidOperationException>(() => base.Include_collection_with_last_no_orderby(async));
-	}
-
 	[Theory(Skip = "Different ordering on Firebird.")]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Include_collection_OrderBy_list_contains(bool async)
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindJoinQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindJoinQueryFbTest.cs
index 49609b88..072b8cae 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindJoinQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindJoinQueryFbTest.cs
@@ -29,8 +29,6 @@ public NorthwindJoinQueryFbTest(NorthwindQueryFbFixture<NoopModelCustomizer> fix
 		: base(fixture)
 	{ }
 
-	protected override bool CanExecuteQueryString => false;
-
 	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task GroupJoin_as_final_operator(bool async)
@@ -114,4 +112,11 @@ public override Task Unflattened_GroupJoin_composed_2(bool async)
 	{
 		return base.Unflattened_GroupJoin_composed_2(async);
 	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Join_local_collection_int_closure_is_cached_correctly(bool async)
+	{
+		return base.Join_local_collection_int_closure_is_cached_correctly(async);
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindKeylessEntitiesQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindKeylessEntitiesQueryFbTest.cs
index cae3409d..cc5ce797 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindKeylessEntitiesQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindKeylessEntitiesQueryFbTest.cs
@@ -30,8 +30,6 @@ public NorthwindKeylessEntitiesQueryFbTest(NorthwindQueryFbFixture<NoopModelCust
 		: base(fixture)
 	{ }
 
-	protected override bool CanExecuteQueryString => false;
-
 	[DoesNotHaveTheDataTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task KeylessEntity_by_database_view(bool async)
@@ -50,10 +48,7 @@ public override Task Entity_mapped_to_view_on_right_side_of_join(bool async)
 	[MemberData(nameof(IsAsyncData))]
 	public override async Task KeylessEntity_with_nav_defining_query(bool async)
 	{
-		Assert.Equal(
-			"0",
-			(await Assert.ThrowsAsync<EqualException>(
-				() => base.KeylessEntity_with_nav_defining_query(async))).Actual);
+		await Assert.ThrowsAsync<EqualException>(() => base.KeylessEntity_with_nav_defining_query(async));
 	}
 
 	[Theory]
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindMiscellaneousQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindMiscellaneousQueryFbTest.cs
index b2fcee99..eae53874 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindMiscellaneousQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindMiscellaneousQueryFbTest.cs
@@ -31,8 +31,6 @@ public NorthwindMiscellaneousQueryFbTest(NorthwindQueryFbFixture<NoopModelCustom
 		: base(fixture)
 	{ }
 
-	protected override bool CanExecuteQueryString => false;
-
 	[Theory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Select_DTO_constructor_distinct_with_collection_projection_translated_to_server_with_binding_after_client_eval(bool async)
@@ -133,4 +131,18 @@ public override Task SelectMany_correlated_subquery_hard(bool async)
 	{
 		return base.SelectMany_correlated_subquery_hard(async);
 	}
+
+	[Theory(Skip = "Different implicit ordering on Firebird.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Entity_equality_orderby_subquery(bool async)
+	{
+		return base.Entity_equality_orderby_subquery(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Subquery_with_navigation_inside_inline_collection(bool async)
+	{
+		return base.Subquery_with_navigation_inside_inline_collection(async);
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindNavigationsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindNavigationsQueryFbTest.cs
index cda754b7..19dbf524 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindNavigationsQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindNavigationsQueryFbTest.cs
@@ -15,20 +15,14 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
-using System.Threading.Tasks;
 using Microsoft.EntityFrameworkCore.Query;
 using Microsoft.EntityFrameworkCore.TestUtilities;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class NorthwindNavigationsQueryFbTest : NorthwindNavigationsQueryTestBase<NorthwindQueryFbFixture<NoopModelCustomizer>>
+public class NorthwindNavigationsQueryFbTest : NorthwindNavigationsQueryRelationalTestBase<NorthwindQueryFbFixture<NoopModelCustomizer>>
 {
 	public NorthwindNavigationsQueryFbTest(NorthwindQueryFbFixture<NoopModelCustomizer> fixture)
 		: base(fixture)
 	{ }
-
-	public override Task Where_subquery_on_navigation_client_eval(bool async)
-	{
-		return AssertTranslationFailed(() => base.Where_subquery_on_navigation_client_eval(async));
-	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindQueryFbFixture.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindQueryFbFixture.cs
index 5219a5ca..2d241399 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindQueryFbFixture.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindQueryFbFixture.cs
@@ -16,10 +16,8 @@
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
 using System;
-using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestModels.Northwind;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
-using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Infrastructure;
 using Microsoft.EntityFrameworkCore.Query;
 using Microsoft.EntityFrameworkCore.TestUtilities;
@@ -27,7 +25,7 @@
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
 public class NorthwindQueryFbFixture<TModelCustomizer> : NorthwindQueryRelationalFixture<TModelCustomizer>
-	where TModelCustomizer : IModelCustomizer, new()
+	where TModelCustomizer : ITestModelCustomizer, new()
 {
 	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
 	protected override Type ContextType => typeof(NorthwindFbContext);
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindSelectQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindSelectQueryFbTest.cs
index ccfb89ed..a3dcdf99 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindSelectQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindSelectQueryFbTest.cs
@@ -206,6 +206,13 @@ public override Task Reverse_in_SelectMany_with_Take(bool async)
 		return base.Reverse_in_SelectMany_with_Take(async);
 	}
 
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Set_operation_in_pending_collection(bool async)
+	{
+		return base.Set_operation_in_pending_collection(async);
+	}
+
 	[Theory]
 	[MemberData(nameof(IsAsyncData))]
 	public override async Task Correlated_collection_after_distinct_with_complex_projection_not_containing_original_identifier(bool async)
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindSetOperationsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindSetOperationsQueryFbTest.cs
index ecf161e9..1c81f0cf 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindSetOperationsQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindSetOperationsQueryFbTest.cs
@@ -30,8 +30,6 @@ public NorthwindSetOperationsQueryFbTest(NorthwindQueryFbFixture<NoopModelCustom
 		: base(fixture)
 	{ }
 
-	protected override bool CanExecuteQueryString => false;
-
 	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Union_Select_scalar(bool async)
@@ -102,6 +100,20 @@ public override Task Union_Intersect(bool async)
 		return base.Union_Intersect(async);
 	}
 
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Except_on_distinct(bool async)
+	{
+		return base.Except_on_distinct(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Intersect_on_distinct(bool async)
+	{
+		return base.Intersect_on_distinct(async);
+	}
+
 	[Theory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Client_eval_Union_FirstOrDefault(bool async)
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindWhereQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindWhereQueryFbTest.cs
index 9b30b447..0632ea82 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindWhereQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NorthwindWhereQueryFbTest.cs
@@ -86,13 +86,6 @@ public override Task Where_datetimeoffset_utcnow(bool async)
 		return base.Where_datetimeoffset_utcnow(async);
 	}
 
-	[Theory]
-	[MemberData(nameof(IsAsyncData))]
-	public override Task Where_bitwise_xor(bool async)
-	{
-		return AssertTranslationFailed(() => base.Where_bitwise_xor(async));
-	}
-
 	[Theory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Where_compare_constructed_equal(bool async)
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NullSemanticsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NullSemanticsQueryFbTest.cs
index 42ab65d8..b945434f 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NullSemanticsQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/NullSemanticsQueryFbTest.cs
@@ -20,6 +20,7 @@
 using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Query;
 using Microsoft.EntityFrameworkCore.TestModels.NullSemanticsModel;
+using Xunit;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
@@ -40,4 +41,18 @@ protected override NullSemanticsContext CreateContext(bool useRelationalNulls =
 		context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
 		return context;
 	}
+
+	[Theory(Skip = "efcore#34906")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task CaseOpWhen_predicate(bool async)
+	{
+		return base.CaseOpWhen_predicate(async);
+	}
+
+	[Theory(Skip = "efcore#34906")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task CaseOpWhen_projection(bool async)
+	{
+		return base.CaseOpWhen_projection(async);
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OperatorsProceduralFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OperatorsProceduralFbTest.cs
new file mode 100644
index 00000000..1fdbc215
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OperatorsProceduralFbTest.cs
@@ -0,0 +1,27 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class OperatorsProceduralFbTest : OperatorsProceduralQueryTestBase
+{
+	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OperatorsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OperatorsQueryFbTest.cs
new file mode 100644
index 00000000..626db284
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OperatorsQueryFbTest.cs
@@ -0,0 +1,51 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System;
+using System.Threading.Tasks;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+using Microsoft.Extensions.DependencyInjection;
+using Xunit;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class OperatorsQueryFbTest : OperatorsQueryTestBase
+{
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Concat_and_json_scalar(bool async)
+	{
+		return base.Concat_and_json_scalar(async);
+	}
+
+	protected override Task<ContextFactory<TContext>> InitializeAsync<TContext>(Action<ModelBuilder> onModelCreating = null, Action<DbContextOptionsBuilder> onConfiguring = null, Func<IServiceCollection, IServiceCollection> addServices = null, Action<ModelConfigurationBuilder> configureConventions = null, Func<TContext, Task> seed = null, Func<string, bool> shouldLogCategory = null, Func<Task<TestStore>> createTestStore = null, bool usePooling = true, bool useServiceProvider = true)
+	{
+		return base.InitializeAsync(
+			modelBuilder =>
+			{
+				ModelHelpers.SetStringLengths(modelBuilder);
+				onModelCreating?.Invoke(modelBuilder);
+			},
+			onConfiguring, addServices, configureConventions, seed, shouldLogCategory, createTestStore, usePooling, useServiceProvider);
+	}
+
+	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OptionalDependentQueryFbFixture.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OptionalDependentQueryFbFixture.cs
new file mode 100644
index 00000000..337a447e
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OptionalDependentQueryFbFixture.cs
@@ -0,0 +1,27 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class OptionalDependentQueryFbFixture : OptionalDependentQueryFixtureBase
+{
+	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OptionalDependentQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OptionalDependentQueryFbTest.cs
new file mode 100644
index 00000000..72e33e6b
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OptionalDependentQueryFbTest.cs
@@ -0,0 +1,100 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System.Threading.Tasks;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
+using Microsoft.EntityFrameworkCore.Query;
+using Xunit;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class OptionalDependentQueryFbTest : OptionalDependentQueryTestBase<OptionalDependentQueryFbFixture>
+{
+	public OptionalDependentQueryFbTest(OptionalDependentQueryFbFixture fixture)
+		: base(fixture)
+	{ }
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Basic_projection_entity_with_all_optional(bool async)
+	{
+		return base.Basic_projection_entity_with_all_optional(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Basic_projection_entity_with_some_required(bool async)
+	{
+		return base.Basic_projection_entity_with_some_required(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Filter_nested_optional_dependent_with_all_optional_compared_to_not_null(bool async)
+	{
+		return base.Filter_nested_optional_dependent_with_all_optional_compared_to_not_null(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Filter_nested_optional_dependent_with_all_optional_compared_to_null(bool async)
+	{
+		return base.Filter_nested_optional_dependent_with_all_optional_compared_to_null(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Filter_nested_optional_dependent_with_some_required_compared_to_not_null(bool async)
+	{
+		return base.Filter_nested_optional_dependent_with_some_required_compared_to_not_null(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Filter_nested_optional_dependent_with_some_required_compared_to_null(bool async)
+	{
+		return base.Filter_nested_optional_dependent_with_some_required_compared_to_null(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Filter_optional_dependent_with_all_optional_compared_to_not_null(bool async)
+	{
+		return base.Filter_optional_dependent_with_all_optional_compared_to_not_null(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Filter_optional_dependent_with_all_optional_compared_to_null(bool async)
+	{
+		return base.Filter_optional_dependent_with_all_optional_compared_to_null(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Filter_optional_dependent_with_some_required_compared_to_not_null(bool async)
+	{
+		return base.Filter_optional_dependent_with_some_required_compared_to_not_null(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Filter_optional_dependent_with_some_required_compared_to_null(bool async)
+	{
+		return base.Filter_optional_dependent_with_some_required_compared_to_null(async);
+	}
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OwnedQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OwnedQueryFbTest.cs
index 834e3a23..8806524a 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OwnedQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/OwnedQueryFbTest.cs
@@ -270,10 +270,6 @@ public OwnedQueryFbTest(OwnedQueryFbFixture fixture)
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Can_join_on_indexer_property_on_query(bool isAsync) => base.Can_join_on_indexer_property_on_query(isAsync);
 
-	[DoesNotHaveTheDataTheory]
-	[MemberData(nameof(IsAsyncData))]
-	public override Task Can_OrderBy_owened_indexer_properties_converted(bool isAsync) => base.Can_OrderBy_owened_indexer_properties_converted(isAsync);
-
 	[DoesNotHaveTheDataTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Where_collection_navigation_ToList_Count_member(bool isAsync) => base.Where_collection_navigation_ToList_Count_member(isAsync);
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/PrimitiveCollectionsQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/PrimitiveCollectionsQueryFbTest.cs
new file mode 100644
index 00000000..2ba0a856
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/PrimitiveCollectionsQueryFbTest.cs
@@ -0,0 +1,721 @@
+/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System.Threading.Tasks;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Diagnostics;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+using Xunit;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class PrimitiveCollectionsQueryFbTest : PrimitiveCollectionsQueryRelationalTestBase<PrimitiveCollectionsQueryFbTest.PrimitiveCollectionsQueryFbFixture>
+{
+	public PrimitiveCollectionsQueryFbTest(PrimitiveCollectionsQueryFbFixture fixture)
+		: base(fixture)
+	{ }
+
+	[ConditionalFact]
+	public virtual async Task Json_representation_of_bool_array()
+	{
+		await using var context = CreateContext();
+
+		Assert.Equal(
+			"[true,false]",
+			await context.Database.SqlQuery<string>($@"SELECT ""Bools"" AS ""Value"" FROM ""PrimitiveCollectionsEntity"" WHERE ""Id"" = 1")
+				.SingleAsync());
+	}
+
+	[NotSupportedOnFirebirdFact]
+	public override void Parameter_collection_in_subquery_and_Convert_as_compiled_query()
+	{
+		base.Parameter_collection_in_subquery_and_Convert_as_compiled_query();
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_in_subquery_Union_another_parameter_collection_as_compiled_query(bool async)
+	{
+		return base.Parameter_collection_in_subquery_Union_another_parameter_collection_as_compiled_query(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_of_strings_contains_null(bool async)
+	{
+		return base.Column_collection_of_strings_contains_null(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_Count_with_one_value(bool async)
+	{
+		return base.Inline_collection_Count_with_one_value(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_Count_with_two_values(bool async)
+    {
+        return base.Inline_collection_Count_with_two_values(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_Count_with_three_values(bool async)
+    {
+        return base.Inline_collection_Count_with_three_values(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_Count(bool async)
+	{
+		return base.Parameter_collection_Count(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_of_ints_Contains_int(bool async)
+	{
+		return base.Parameter_collection_of_ints_Contains_int(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_of_nullable_ints_Contains_int(bool async)
+	{
+		return base.Parameter_collection_of_nullable_ints_Contains_int(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_of_nullable_ints_Contains_nullable_int(bool async)
+	{
+		return base.Parameter_collection_of_nullable_ints_Contains_nullable_int(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_of_strings_Contains_string(bool async)
+	{
+		return base.Parameter_collection_of_strings_Contains_string(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_of_strings_Contains_nullable_string(bool async)
+	{
+		return base.Parameter_collection_of_strings_Contains_nullable_string(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_of_DateTimes_Contains(bool async)
+	{
+		return base.Parameter_collection_of_DateTimes_Contains(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Parameter_collection_of_bools_Contains(bool async)
+    {
+        return base.Parameter_collection_of_bools_Contains(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Parameter_collection_of_enums_Contains(bool async)
+    {
+        return base.Parameter_collection_of_enums_Contains(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Parameter_collection_null_Contains(bool async)
+    {
+        return base.Parameter_collection_null_Contains(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_of_ints_Contains(bool async)
+    {
+        return base.Column_collection_of_ints_Contains(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_of_nullable_ints_Contains(bool async)
+    {
+        return base.Column_collection_of_nullable_ints_Contains(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_of_nullable_ints_Contains_null(bool async)
+    {
+        return base.Column_collection_of_nullable_ints_Contains_null(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_of_nullable_strings_contains_null(bool async)
+    {
+        return base.Column_collection_of_nullable_strings_contains_null(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_of_bools_Contains(bool async)
+    {
+        return base.Column_collection_of_bools_Contains(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_Count_method(bool async)
+    {
+        return base.Column_collection_Count_method(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_Count_with_predicate(bool async)
+	{
+		return base.Column_collection_Count_with_predicate(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_Length(bool async)
+    {
+        return base.Column_collection_Length(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_index_int(bool async)
+    {
+        return base.Column_collection_index_int(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_index_string(bool async)
+    {
+        return base.Column_collection_index_string(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_index_datetime(bool async)
+    {
+        return base.Column_collection_index_datetime(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_index_beyond_end(bool async)
+    {
+        return base.Column_collection_index_beyond_end(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Nullable_reference_column_collection_index_equals_nullable_column(bool async)
+    {
+        return base.Nullable_reference_column_collection_index_equals_nullable_column(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Non_nullable_reference_column_collection_index_equals_nullable_column(bool async)
+    {
+        return base.Non_nullable_reference_column_collection_index_equals_nullable_column(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Inline_collection_index_Column(bool async)
+    {
+        return base.Inline_collection_index_Column(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_index_Column_equal_Column(bool async)
+	{
+		return base.Parameter_collection_index_Column_equal_Column(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_index_Column_equal_constant(bool async)
+	{
+		return base.Parameter_collection_index_Column_equal_constant(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_ElementAt(bool async)
+    {
+        return base.Column_collection_ElementAt(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_Skip(bool async)
+    {
+        return base.Column_collection_Skip(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_Take(bool async)
+    {
+        return base.Column_collection_Take(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_Skip_Take(bool async)
+    {
+        return base.Column_collection_Skip_Take(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_OrderByDescending_ElementAt(bool async)
+    {
+        return base.Column_collection_OrderByDescending_ElementAt(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_Any(bool async)
+    {
+        return base.Column_collection_Any(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_Distinct(bool async)
+    {
+        return base.Column_collection_Distinct(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_Join_parameter_collection(bool async)
+    {
+        return base.Column_collection_Join_parameter_collection(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Inline_collection_Join_ordered_column_collection(bool async)
+    {
+        return base.Inline_collection_Join_ordered_column_collection(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Parameter_collection_Concat_column_collection(bool async)
+    {
+        return base.Parameter_collection_Concat_column_collection(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_Union_parameter_collection(bool async)
+    {
+        return base.Column_collection_Union_parameter_collection(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_Intersect_inline_collection(bool async)
+    {
+        return base.Column_collection_Intersect_inline_collection(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Inline_collection_Except_column_collection(bool async)
+    {
+        return base.Inline_collection_Except_column_collection(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_in_subquery_Union_column_collection_as_compiled_query(bool async)
+	{
+		return base.Parameter_collection_in_subquery_Union_column_collection_as_compiled_query(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Parameter_collection_in_subquery_Union_column_collection(bool async)
+    {
+        return base.Parameter_collection_in_subquery_Union_column_collection(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Parameter_collection_in_subquery_Union_column_collection_nested(bool async)
+    {
+        return base.Parameter_collection_in_subquery_Union_column_collection_nested(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_in_subquery_Count_as_compiled_query(bool async)
+	{
+		return base.Parameter_collection_in_subquery_Count_as_compiled_query(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Column_collection_in_subquery_Union_parameter_collection(bool async)
+    {
+        return base.Column_collection_in_subquery_Union_parameter_collection(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Project_collection_of_ints_ordered(bool async)
+    {
+        return base.Project_collection_of_ints_ordered(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Project_collection_of_datetimes_filtered(bool async)
+    {
+        return base.Project_collection_of_datetimes_filtered(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Project_collection_of_nullable_ints_with_paging(bool async)
+    {
+        return base.Project_collection_of_nullable_ints_with_paging(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Project_collection_of_nullable_ints_with_paging2(bool async)
+    {
+        return base.Project_collection_of_nullable_ints_with_paging2(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Project_collection_of_nullable_ints_with_paging3(bool async)
+    {
+        return base.Project_collection_of_nullable_ints_with_paging3(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Project_collection_of_ints_with_distinct(bool async)
+    {
+        return base.Project_collection_of_ints_with_distinct(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_empty_collection_of_nullables_and_collection_only_containing_nulls(bool async)
+	{
+		return base.Project_empty_collection_of_nullables_and_collection_only_containing_nulls(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Project_multiple_collections(bool async)
+    {
+        return base.Project_multiple_collections(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Project_primitive_collections_element(bool async)
+    {
+        return base.Project_primitive_collections_element(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Nested_contains_with_Lists_and_no_inferred_type_mapping(bool async)
+    {
+        return base.Nested_contains_with_Lists_and_no_inferred_type_mapping(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+    [MemberData(nameof(IsAsyncData))]
+    public override Task Nested_contains_with_arrays_and_no_inferred_type_mapping(bool async)
+    {
+        return base.Nested_contains_with_arrays_and_no_inferred_type_mapping(async);
+    }
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_Contains_over_subquery(bool async)
+	{
+		return base.Column_collection_Contains_over_subquery(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_First(bool async)
+	{
+		return base.Column_collection_First(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_FirstOrDefault(bool async)
+	{
+		return base.Column_collection_FirstOrDefault(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_SelectMany(bool async)
+	{
+		return base.Column_collection_SelectMany(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_SelectMany_with_filter(bool async)
+	{
+		return base.Column_collection_SelectMany_with_filter(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_SelectMany_with_Select_to_anonymous_type(bool async)
+	{
+		return base.Column_collection_SelectMany_with_Select_to_anonymous_type(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_Single(bool async)
+	{
+		return base.Column_collection_Single(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_SingleOrDefault(bool async)
+	{
+		return base.Column_collection_SingleOrDefault(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_Where_Count(bool async)
+	{
+		return base.Column_collection_Where_Count(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_Where_ElementAt(bool async)
+	{
+		return base.Column_collection_Where_ElementAt(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_Where_Skip(bool async)
+	{
+		return base.Column_collection_Where_Skip(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_Where_Skip_Take(bool async)
+	{
+		return base.Column_collection_Where_Skip_Take(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_Where_Take(bool async)
+	{
+		return base.Column_collection_Where_Take(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Column_collection_Where_Union(bool async)
+	{
+		return base.Column_collection_Where_Union(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_Count_with_column_predicate_with_EF_Parameter(bool async)
+	{
+		return base.Inline_collection_Count_with_column_predicate_with_EF_Parameter(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_List_Max_with_three_values(bool async)
+	{
+		return base.Inline_collection_List_Max_with_three_values(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_List_Max_with_two_values(bool async)
+	{
+		return base.Inline_collection_List_Max_with_two_values(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_List_Min_with_two_values(bool async)
+	{
+		return base.Inline_collection_List_Min_with_two_values(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_List_value_index_Column(bool async)
+	{
+		return base.Inline_collection_List_value_index_Column(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_Max_with_three_values(bool async)
+	{
+		return base.Inline_collection_Max_with_three_values(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_Max_with_two_values(bool async)
+	{
+		return base.Inline_collection_Max_with_two_values(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_Min_with_three_values(bool async)
+	{
+		return base.Inline_collection_Min_with_three_values(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_Min_with_two_values(bool async)
+	{
+		return base.Inline_collection_Min_with_two_values(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_of_nullable_value_type_Max(bool async)
+	{
+		return base.Inline_collection_of_nullable_value_type_Max(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_of_nullable_value_type_Min(bool async)
+	{
+		return base.Inline_collection_of_nullable_value_type_Min(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_of_nullable_value_type_with_null_Max(bool async)
+	{
+		return base.Inline_collection_of_nullable_value_type_with_null_Max(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_of_nullable_value_type_with_null_Min(bool async)
+	{
+		return base.Inline_collection_of_nullable_value_type_with_null_Min(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_value_index_Column(bool async)
+	{
+		return base.Inline_collection_value_index_Column(async);
+	}
+	
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Inline_collection_with_single_parameter_element_Count(bool async)
+	{
+		return base.Inline_collection_with_single_parameter_element_Count(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_Count_with_column_predicate_with_EF_Constant(bool async)
+	{
+		return base.Parameter_collection_Count_with_column_predicate_with_EF_Constant(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_Where_with_EF_Constant_Where_Any(bool async)
+	{
+		return base.Parameter_collection_Where_with_EF_Constant_Where_Any(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Project_inline_collection_with_Union(bool async)
+	{
+		return base.Project_inline_collection_with_Union(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Parameter_collection_ImmutableArray_of_ints_Contains_int(bool async)
+	{
+		return base.Parameter_collection_ImmutableArray_of_ints_Contains_int(async);
+	}
+
+	PrimitiveCollectionsContext CreateContext()
+	{
+		return Fixture.CreateContext();
+	}
+
+	public class PrimitiveCollectionsQueryFbFixture : PrimitiveCollectionsQueryFixtureBase, ITestSqlLoggerFactory
+	{
+		protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
+
+		public TestSqlLoggerFactory TestSqlLoggerFactory => (TestSqlLoggerFactory)ListLoggerFactory;
+	}
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/QueryFilterFuncletizationFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/QueryFilterFuncletizationFbTest.cs
index f0664547..0713a982 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/QueryFilterFuncletizationFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/QueryFilterFuncletizationFbTest.cs
@@ -58,22 +58,7 @@ public override void DbContext_list_is_parameterized()
 		var fbTestStore = (FbTestStore)Fixture.TestStore;
 		if (fbTestStore.ServerLessThan4())
 			return;
-
-		using var context = CreateContext();
-		// Default value of TenantIds is null InExpression over null values throws
-		Assert.Throws<NullReferenceException>(() => context.Set<ListFilter>().ToList());
-
-		context.TenantIds = new List<int>();
-		var query = context.Set<ListFilter>().ToList();
-		Assert.Empty(query);
-
-		context.TenantIds = new List<int> { 1 };
-		query = context.Set<ListFilter>().ToList();
-		Assert.Single(query);
-
-		context.TenantIds = new List<int> { 2, 3 };
-		query = context.Set<ListFilter>().ToList();
-		Assert.Equal(2, query.Count);
+		base.DbContext_list_is_parameterized();
 	}
 
 	[Fact]
@@ -292,6 +277,15 @@ public override void Using_multiple_context_in_filter_parametrize_only_current_c
 		base.Using_multiple_context_in_filter_parametrize_only_current_context();
 	}
 
+	[Fact]
+	public override void Using_multiple_entities_with_filters_reuses_parameters()
+	{
+		var fbTestStore = (FbTestStore)Fixture.TestStore;
+		if (fbTestStore.ServerLessThan4())
+			return;
+		base.Using_multiple_entities_with_filters_reuses_parameters();
+	}
+
 	public class QueryFilterFuncletizationFbFixture : QueryFilterFuncletizationRelationalFixture
 	{
 		protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/SqlExecutorFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/SqlExecutorFbTest.cs
index 0f7e53b5..53b19e37 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/SqlExecutorFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/SqlExecutorFbTest.cs
@@ -21,13 +21,13 @@
 using FirebirdSql.Data.FirebirdClient;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using Microsoft.EntityFrameworkCore.Query;
-using Microsoft.EntityFrameworkCore.TestUtilities;
+using Xunit;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class SqlExecutorFbTest : SqlExecutorTestBase<NorthwindQueryFbFixture<NoopModelCustomizer>>
+public class SqlExecutorFbTest : SqlExecutorTestBase<NorthwindQueryFbFixture<SqlExecutorModelCustomizer>>
 {
-	public SqlExecutorFbTest(NorthwindQueryFbFixture<NoopModelCustomizer> fixture)
+	public SqlExecutorFbTest(NorthwindQueryFbFixture<SqlExecutorModelCustomizer> fixture)
 		: base(fixture)
 	{ }
 
@@ -38,39 +38,27 @@ protected override DbParameter CreateDbParameter(string name, object value)
 	protected override string CustomerOrderHistorySproc => throw new NotSupportedException();
 	protected override string CustomerOrderHistoryWithGeneratedParameterSproc => throw new NotSupportedException();
 
-	[DoesNotHaveTheDataFact]
-	public override void Executes_stored_procedure()
+	[DoesNotHaveTheDataTheory]
+	[InlineData(false)]
+	[InlineData(true)]
+	public override Task Executes_stored_procedure(bool async)
 	{
-		base.Executes_stored_procedure();
+		return base.Executes_stored_procedure(async);
 	}
 
-	[DoesNotHaveTheDataFact]
-	public override Task Executes_stored_procedure_async()
+	[DoesNotHaveTheDataTheory]
+	[InlineData(false)]
+	[InlineData(true)]
+	public override Task Executes_stored_procedure_with_generated_parameter(bool async)
 	{
-		return base.Executes_stored_procedure_async();
+		return base.Executes_stored_procedure_with_generated_parameter(async);
 	}
 
-	[DoesNotHaveTheDataFact]
-	public override void Executes_stored_procedure_with_generated_parameter()
+	[DoesNotHaveTheDataTheory]
+	[InlineData(false)]
+	[InlineData(true)]
+	public override Task Executes_stored_procedure_with_parameter(bool async)
 	{
-		base.Executes_stored_procedure_with_generated_parameter();
-	}
-
-	[DoesNotHaveTheDataFact]
-	public override Task Executes_stored_procedure_with_generated_parameter_async()
-	{
-		return base.Executes_stored_procedure_with_generated_parameter_async();
-	}
-
-	[DoesNotHaveTheDataFact]
-	public override void Executes_stored_procedure_with_parameter()
-	{
-		base.Executes_stored_procedure_with_parameter();
-	}
-
-	[DoesNotHaveTheDataFact]
-	public override Task Executes_stored_procedure_with_parameter_async()
-	{
-		return base.Executes_stored_procedure_with_parameter_async();
+		return base.Executes_stored_procedure_with_parameter(async);
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/SqlQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/SqlQueryFbTest.cs
new file mode 100644
index 00000000..52d10ed2
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/SqlQueryFbTest.cs
@@ -0,0 +1,155 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System.Data.Common;
+using System.Threading.Tasks;
+using FirebirdSql.Data.FirebirdClient;
+using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+using Xunit;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
+
+public class SqlQueryFbTest : SqlQueryTestBase<NorthwindQueryFbFixture<NoopModelCustomizer>>
+{
+	public SqlQueryFbTest(NorthwindQueryFbFixture<NoopModelCustomizer> fixture)
+		: base(fixture)
+	{ }
+
+	[Theory(Skip = "Provider does the casting.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Bad_data_error_handling_invalid_cast(bool async)
+	{
+		return base.Bad_data_error_handling_invalid_cast(async);
+	}
+
+	[Theory(Skip = "Provider does the casting.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Bad_data_error_handling_invalid_cast_key(bool async)
+	{
+		return base.Bad_data_error_handling_invalid_cast_key(async);
+	}
+
+	[Theory(Skip = "Provider does the casting.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Bad_data_error_handling_invalid_cast_no_tracking(bool async)
+	{
+		return base.Bad_data_error_handling_invalid_cast_no_tracking(async);
+	}
+
+	[Theory(Skip = "Provider does the casting.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Bad_data_error_handling_invalid_cast_projection(bool async)
+	{
+		return base.Bad_data_error_handling_invalid_cast_projection(async);
+	}
+
+	[Theory(Skip = "Provider does the casting.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_queryable_simple_projection_composed(bool async)
+	{
+		return base.SqlQueryRaw_queryable_simple_projection_composed(async);
+	}
+
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Multiple_occurrences_of_SqlQuery_with_db_parameter_adds_parameter_only_once(bool async)
+	{
+		return base.Multiple_occurrences_of_SqlQuery_with_db_parameter_adds_parameter_only_once(async);
+	}
+
+	[DoesNotHaveTheDataTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_with_dbParameter_mixed_in_subquery(bool async)
+	{
+		return base.SqlQueryRaw_with_dbParameter_mixed_in_subquery(async);
+	}
+
+	[DoesNotHaveTheDataTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_queryable_multiple_composed_with_parameters_and_closure_parameters(bool async)
+	{
+		return base.SqlQueryRaw_queryable_multiple_composed_with_parameters_and_closure_parameters(async);
+	}
+
+	[DoesNotHaveTheDataTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_queryable_multiple_composed_with_closure_parameters(bool async)
+	{
+		return base.SqlQueryRaw_queryable_multiple_composed_with_closure_parameters(async);
+	}
+
+	[DoesNotHaveTheDataTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_queryable_multiple_composed(bool async)
+	{
+		return base.SqlQueryRaw_queryable_multiple_composed(async);
+	}
+
+	[DoesNotHaveTheDataTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_in_subquery_with_positional_dbParameter_without_name(bool async)
+	{
+		return base.SqlQueryRaw_in_subquery_with_positional_dbParameter_without_name(async);
+	}
+
+	[DoesNotHaveTheDataTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_in_subquery_with_positional_dbParameter_with_name(bool async)
+	{
+		return base.SqlQueryRaw_in_subquery_with_positional_dbParameter_with_name(async);
+	}
+
+	[DoesNotHaveTheDataTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_in_subquery_with_dbParameter(bool async)
+	{
+		return base.SqlQueryRaw_in_subquery_with_dbParameter(async);
+	}
+
+	[DoesNotHaveTheDataTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_does_not_parameterize_interpolated_string(bool async)
+	{
+		return base.SqlQueryRaw_does_not_parameterize_interpolated_string(async);
+	}
+
+	[DoesNotHaveTheDataTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_queryable_with_null_parameter(bool async)
+	{
+		return base.SqlQueryRaw_queryable_with_null_parameter(async);
+	}
+
+	[DoesNotHaveTheDataTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQuery_queryable_multiple_composed_with_parameters_and_closure_parameters_interpolated(bool async)
+	{
+		return base.SqlQuery_queryable_multiple_composed_with_parameters_and_closure_parameters_interpolated(async);
+	}
+
+	[Theory(Skip = "Firebird matches the casing exactly. Frankly the test is weird.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task SqlQueryRaw_queryable_simple_different_cased_columns_and_not_enough_columns_throws(bool async)
+	{
+		return base.SqlQueryRaw_queryable_simple_different_cased_columns_and_not_enough_columns_throws(async);
+	}
+
+	protected override DbParameter CreateDbParameter(string name, object value)
+		=> new FbParameter { ParameterName = name, Value = value };
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCFiltersInheritanceQueryFbFixture.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCFiltersInheritanceQueryFbFixture.cs
index c3634770..4ed46411 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCFiltersInheritanceQueryFbFixture.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCFiltersInheritanceQueryFbFixture.cs
@@ -19,5 +19,5 @@ namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
 public class TPCFiltersInheritanceQueryFbFixture : TPCInheritanceQueryFbFixture
 {
-    protected override bool EnableFilters => true;
+    public override bool EnableFilters => true;
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCGearsOfWarQueryFbFixture.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCGearsOfWarQueryFbFixture.cs
index fe4c60fb..fea02aad 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCGearsOfWarQueryFbFixture.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCGearsOfWarQueryFbFixture.cs
@@ -34,13 +34,5 @@ protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext con
 		ModelHelpers.SetStringLengths(modelBuilder);
 
 		modelBuilder.Entity<City>().Property(g => g.Location).HasColumnType("varchar(100)");
-
-		// No support yet for DateOnly/TimeOnly (#24507)
-		modelBuilder.Entity<Mission>(
-			b =>
-			{
-				b.Ignore(m => m.Date);
-				b.Ignore(m => m.Time);
-			});
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCGearsOfWarQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCGearsOfWarQueryFbTest.cs
index d93eab64..dd1231de 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCGearsOfWarQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCGearsOfWarQueryFbTest.cs
@@ -20,7 +20,6 @@
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using Microsoft.EntityFrameworkCore.Query;
 using Microsoft.EntityFrameworkCore.TestModels.GearsOfWarModel;
-using Microsoft.EntityFrameworkCore.TestUtilities;
 using Xunit;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
@@ -31,6 +30,31 @@ public TPCGearsOfWarQueryFbTest(TPCGearsOfWarQueryFbFixture fixture)
 		: base(fixture)
 	{ }
 
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task ToString_boolean_property_non_nullable(bool async)
+	{
+		return AssertQuery(
+			async,
+			ss => ss.Set<Weapon>().Select(w => w.IsAutomatic.ToString()));
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task ToString_boolean_property_nullable(bool async)
+	{
+		return AssertQuery(
+			async,
+			ss => ss.Set<LocustHorde>().Select(lh => lh.Eradicated.ToString()));
+	}
+
+	[Theory(Skip = "Different implicit ordering on Firebird.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Group_by_on_StartsWith_with_null_parameter_as_argument(bool async)
+	{
+		return base.Group_by_on_StartsWith_with_null_parameter_as_argument(async);
+	}
+
 	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Array_access_on_byte_array(bool async)
@@ -220,6 +244,13 @@ public override Task Subquery_projecting_nullable_scalar_contains_nullable_value
 		return base.Subquery_projecting_nullable_scalar_contains_nullable_value_needs_null_expansion_negated(async);
 	}
 
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Subquery_inside_Take_argument(bool async)
+	{
+		return base.Subquery_inside_Take_argument(async);
+	}
+
 	[NotSupportedByProviderTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Where_DateOnly_AddDays(bool async)
@@ -353,6 +384,13 @@ public override Task Where_datetimeoffset_year_component(bool async)
 		return base.Where_datetimeoffset_year_component(async);
 	}
 
+	[NotSupportedOnFirebirdTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Non_string_concat_uses_appropriate_type_mapping(bool async)
+	{
+		return base.Non_string_concat_uses_appropriate_type_mapping(async);
+	}
+
 	[NotSupportedByProviderTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Where_TimeOnly_Add_TimeSpan(bool async)
@@ -416,20 +454,18 @@ public override Task Where_TimeOnly_subtract_TimeOnly(bool async)
 		return base.Where_TimeOnly_subtract_TimeOnly(async);
 	}
 
-	[Theory]
+	[NotSupportedByProviderTheory]
 	[MemberData(nameof(IsAsyncData))]
-	public override Task ToString_boolean_property_nullable(bool async)
+	public override Task DateTimeOffset_to_unix_time_milliseconds(bool async)
 	{
-		return AssertQuery(async, (ISetSource ss) => from lh in ss.Set<LocustHorde>()
-													 select ((object)lh.Eradicated).ToString(), null, elementAsserter: (lhs, rhs) => { Assert.True(lhs.Equals(rhs, System.StringComparison.InvariantCultureIgnoreCase)); }, assertOrder: false, 0, "ToString_boolean_property_nullable");
+		return base.DateTimeOffset_to_unix_time_milliseconds(async);
 	}
 
-	[Theory]
+	[NotSupportedByProviderTheory]
 	[MemberData(nameof(IsAsyncData))]
-	public override Task ToString_boolean_property_non_nullable(bool async)
+	public override Task DateTimeOffset_to_unix_time_seconds(bool async)
 	{
-		return AssertQuery(async, (ISetSource ss) => from w in ss.Set<Weapon>()
-													 select w.IsAutomatic.ToString(), null, elementAsserter: (lhs, rhs) => { Assert.True(lhs.Equals(rhs, System.StringComparison.InvariantCultureIgnoreCase)); }, assertOrder: false, 0, "ToString_boolean_property_non_nullable");
+		return base.DateTimeOffset_to_unix_time_seconds(async);
 	}
 
 	[Theory(Skip = "Different implicit ordering on Firebird.")]
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbFixture.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbFixture.cs
index eb47f9bd..c0a9d8d0 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbFixture.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbFixture.cs
@@ -19,5 +19,5 @@ namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
 public class TPCInheritanceQueryFbFixture : TPCInheritanceQueryFbFixtureBase
 {
-	protected override bool UseGeneratedKeys => true;
+	public override bool UseGeneratedKeys => true;
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbTest.cs
index 36c29330..02661065 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbTest.cs
@@ -15,11 +15,13 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
+using Xunit.Abstractions;
+
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
 public class TPCInheritanceQueryFbTest : TPCInheritanceQueryFbTestBase<TPCInheritanceQueryFbFixture>
 {
-    public TPCInheritanceQueryFbTest(TPCInheritanceQueryFbFixture fixture)
-        : base(fixture)
+    public TPCInheritanceQueryFbTest(TPCInheritanceQueryFbFixture fixture, ITestOutputHelper testOutputHelper)
+        : base(fixture, testOutputHelper)
     { }
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbTestBase.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbTestBase.cs
index 71ed9486..4f2630de 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbTestBase.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryFbTestBase.cs
@@ -15,15 +15,15 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
-using System.Threading.Tasks;
 using Microsoft.EntityFrameworkCore.Query;
+using Xunit.Abstractions;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
 public abstract class TPCInheritanceQueryFbTestBase<TFixture> : TPCInheritanceQueryTestBase<TFixture>
     where TFixture : TPCInheritanceQueryFbFixtureBase, new()
 {
-	protected TPCInheritanceQueryFbTestBase(TFixture fixture)
-		: base(fixture)
+	protected TPCInheritanceQueryFbTestBase(TFixture fixture, ITestOutputHelper testOutputHelper)
+		: base(fixture, testOutputHelper)
 	{ }
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryHiLoFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryHiLoFbTest.cs
index 1edcc736..39a6d588 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryHiLoFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPCInheritanceQueryHiLoFbTest.cs
@@ -15,11 +15,13 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
+using Xunit.Abstractions;
+
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
 public class TPCInheritanceQueryHiLoFbTest : TPCInheritanceQueryFbTestBase<TPCInheritanceQueryHiLoFbFixture>
 {
-	public TPCInheritanceQueryHiLoFbTest(TPCInheritanceQueryHiLoFbFixture fixture)
-		: base(fixture)
+	public TPCInheritanceQueryHiLoFbTest(TPCInheritanceQueryHiLoFbFixture fixture, ITestOutputHelper testOutputHelper)
+		: base(fixture, testOutputHelper)
 	{ }
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FiltersInheritanceQueryFbFixture.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHFiltersInheritanceQueryFbFixture.cs
similarity index 85%
rename from src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FiltersInheritanceQueryFbFixture.cs
rename to src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHFiltersInheritanceQueryFbFixture.cs
index 7fcf769e..e2e0ac7c 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FiltersInheritanceQueryFbFixture.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHFiltersInheritanceQueryFbFixture.cs
@@ -17,7 +17,7 @@
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class FiltersInheritanceQueryFbFixture : InheritanceQueryFbFixture
+public class TPHFiltersInheritanceQueryFbFixture : TPHInheritanceQueryFbFixture
 {
-	protected override bool EnableFilters => true;
+	public override bool EnableFilters => true;
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FiltersInheritanceQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHFiltersInheritanceQueryFbTest.cs
similarity index 79%
rename from src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FiltersInheritanceQueryFbTest.cs
rename to src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHFiltersInheritanceQueryFbTest.cs
index 714c79e5..895bb962 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/FiltersInheritanceQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHFiltersInheritanceQueryFbTest.cs
@@ -19,9 +19,9 @@
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class FiltersInheritanceQueryFbTest : FiltersInheritanceQueryTestBase<FiltersInheritanceQueryFbFixture>
+public class TPHFiltersInheritanceQueryFbTest : FiltersInheritanceQueryTestBase<TPHFiltersInheritanceQueryFbFixture>
 {
-	public FiltersInheritanceQueryFbTest(FiltersInheritanceQueryFbFixture fixture)
+	public TPHFiltersInheritanceQueryFbTest(TPHFiltersInheritanceQueryFbFixture fixture)
 		: base(fixture)
 	{ }
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceQueryFbFixture.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHInheritanceQueryFbFixture.cs
similarity index 94%
rename from src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceQueryFbFixture.cs
rename to src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHInheritanceQueryFbFixture.cs
index b1a9d94f..b12c114b 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceQueryFbFixture.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHInheritanceQueryFbFixture.cs
@@ -23,7 +23,7 @@
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class InheritanceQueryFbFixture : InheritanceQueryRelationalFixture
+public class TPHInheritanceQueryFbFixture : TPHInheritanceQueryFixture
 {
 	protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
 
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHInheritanceQueryFbTest.cs
similarity index 74%
rename from src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceQueryFbTest.cs
rename to src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHInheritanceQueryFbTest.cs
index 33063a50..3b50b792 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/InheritanceQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPHInheritanceQueryFbTest.cs
@@ -16,12 +16,13 @@
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
 using Microsoft.EntityFrameworkCore.Query;
+using Xunit.Abstractions;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
-public class InheritanceQueryFbTest : InheritanceRelationalQueryTestBase<InheritanceQueryFbFixture>
+public class TPHInheritanceQueryFbTest : TPHInheritanceQueryTestBase<TPHInheritanceQueryFbFixture>
 {
-	public InheritanceQueryFbTest(InheritanceQueryFbFixture fixture)
-		: base(fixture)
+	public TPHInheritanceQueryFbTest(TPHInheritanceQueryFbFixture fixture, ITestOutputHelper testOutputHelper)
+		: base(fixture, testOutputHelper)
 	{ }
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTFiltersInheritanceQueryFbFixture.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTFiltersInheritanceQueryFbFixture.cs
index 056de057..81ad223b 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTFiltersInheritanceQueryFbFixture.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTFiltersInheritanceQueryFbFixture.cs
@@ -22,7 +22,7 @@ namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
 public class TPTFiltersInheritanceQueryFbFixture : TPTInheritanceQueryFbFixture
 {
-	protected override bool EnableFilters => true;
+	public override bool EnableFilters => true;
 
 	protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext context)
 	{
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTGearsOfWarQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTGearsOfWarQueryFbTest.cs
index 3f0dc80d..d0c129d2 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTGearsOfWarQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTGearsOfWarQueryFbTest.cs
@@ -20,7 +20,6 @@
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using Microsoft.EntityFrameworkCore.Query;
 using Microsoft.EntityFrameworkCore.TestModels.GearsOfWarModel;
-using Microsoft.EntityFrameworkCore.TestUtilities;
 using Xunit;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
@@ -31,6 +30,31 @@ public TPTGearsOfWarQueryFbTest(TPTGearsOfWarQueryFbFixture fixture)
 		: base(fixture)
 	{ }
 
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task ToString_boolean_property_non_nullable(bool async)
+	{
+		return AssertQuery(
+			async,
+			ss => ss.Set<Weapon>().Select(w => w.IsAutomatic.ToString()));
+	}
+
+	[Theory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task ToString_boolean_property_nullable(bool async)
+	{
+		return AssertQuery(
+			async,
+			ss => ss.Set<LocustHorde>().Select(lh => lh.Eradicated.ToString()));
+	}
+
+	[Theory(Skip = "Different implicit ordering on Firebird.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task Group_by_on_StartsWith_with_null_parameter_as_argument(bool async)
+	{
+		return base.Group_by_on_StartsWith_with_null_parameter_as_argument(async);
+	}
+
 	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
 	public override Task Correlated_collections_inner_subquery_predicate_references_outer_qsre(bool async)
@@ -297,41 +321,53 @@ public override Task First_on_byte_array(bool async)
 		return base.First_on_byte_array(async);
 	}
 
-	[Theory]
+	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
-	public override Task ToString_boolean_property_nullable(bool async)
+	public override Task Where_TimeOnly_subtract_TimeOnly(bool async)
 	{
-		return AssertQuery(async, (ISetSource ss) => from lh in ss.Set<LocustHorde>()
-													 select ((object)lh.Eradicated).ToString(), null, elementAsserter: (lhs, rhs) => { Assert.True(lhs.Equals(rhs, System.StringComparison.InvariantCultureIgnoreCase)); }, assertOrder: false, 0, "ToString_boolean_property_nullable");
+		return base.Where_TimeOnly_subtract_TimeOnly(async);
 	}
 
-	[Theory]
+	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
-	public override Task ToString_boolean_property_non_nullable(bool async)
+	public override Task Correlated_collection_with_groupby_with_complex_grouping_key_not_projecting_identifier_column_with_group_aggregate_in_final_projection(bool async)
 	{
-		return AssertQuery(async, (ISetSource ss) => from w in ss.Set<Weapon>()
-													 select w.IsAutomatic.ToString(), null, elementAsserter: (lhs, rhs) => { Assert.True(lhs.Equals(rhs, System.StringComparison.InvariantCultureIgnoreCase)); }, assertOrder: false, 0, "ToString_boolean_property_non_nullable");
+		return base.Correlated_collection_with_groupby_with_complex_grouping_key_not_projecting_identifier_column_with_group_aggregate_in_final_projection(async);
 	}
 
 	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
-	public override Task Where_TimeOnly_subtract_TimeOnly(bool async)
+	public override Task DateTimeOffsetNow_minus_timespan(bool async)
 	{
-		return base.Where_TimeOnly_subtract_TimeOnly(async);
+		return base.DateTimeOffsetNow_minus_timespan(async);
 	}
 
 	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
-	public override Task Correlated_collection_with_groupby_with_complex_grouping_key_not_projecting_identifier_column_with_group_aggregate_in_final_projection(bool async)
+	public override Task Subquery_inside_Take_argument(bool async)
 	{
-		return base.Correlated_collection_with_groupby_with_complex_grouping_key_not_projecting_identifier_column_with_group_aggregate_in_final_projection(async);
+		return base.Subquery_inside_Take_argument(async);
 	}
 
 	[NotSupportedOnFirebirdTheory]
 	[MemberData(nameof(IsAsyncData))]
-	public override Task DateTimeOffsetNow_minus_timespan(bool async)
+	public override Task Non_string_concat_uses_appropriate_type_mapping(bool async)
 	{
-		return base.DateTimeOffsetNow_minus_timespan(async);
+		return base.Non_string_concat_uses_appropriate_type_mapping(async);
+	}
+
+	[NotSupportedByProviderTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task DateTimeOffset_to_unix_time_milliseconds(bool async)
+	{
+		return base.DateTimeOffset_to_unix_time_milliseconds(async);
+	}
+
+	[NotSupportedByProviderTheory]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task DateTimeOffset_to_unix_time_seconds(bool async)
+	{
+		return base.DateTimeOffset_to_unix_time_seconds(async);
 	}
 
 	[Theory(Skip = "NETProvider#1008")]
@@ -347,4 +383,11 @@ public override Task Where_TimeOnly_Add_TimeSpan(bool async)
 	{
 		return base.Where_TimeOnly_Add_TimeSpan(async);
 	}
+
+	[Theory(Skip = "Different implicit ordering on Firebird.")]
+	[MemberData(nameof(IsAsyncData))]
+	public override Task String_concat_with_null_conditional_argument(bool async)
+	{
+		return base.String_concat_with_null_conditional_argument(async);
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTInheritanceQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTInheritanceQueryFbTest.cs
index c7e3a46a..f6fa6165 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTInheritanceQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/TPTInheritanceQueryFbTest.cs
@@ -16,12 +16,13 @@
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
 using Microsoft.EntityFrameworkCore.Query;
+using Xunit.Abstractions;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Query;
 
 public class TPTInheritanceQueryFbTest : TPTInheritanceQueryTestBase<TPTInheritanceQueryFbFixture>
 {
-	public TPTInheritanceQueryFbTest(TPTInheritanceQueryFbFixture fixture)
-		: base(fixture)
+	public TPTInheritanceQueryFbTest(TPTInheritanceQueryFbFixture fixture, ITestOutputHelper testOutputHelper)
+		: base(fixture, testOutputHelper)
 	{ }
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ToSqlQueryFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ToSqlQueryFbTest.cs
index a11b0fde..6867be48 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ToSqlQueryFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/ToSqlQueryFbTest.cs
@@ -32,16 +32,16 @@ public class ToSqlQueryFbTest : ToSqlQueryTestBase
 	public override async Task Entity_type_with_navigation_mapped_to_SqlQuery(bool async)
 	{
 		var contextFactory = await InitializeAsync<Context27629>(
-			seed: c =>
+			seed: async c =>
 			{
 				var author = new Author { Name = "Toast", Posts = { new Post { Title = "Sausages of the world!" } } };
 				c.Add(author);
-				c.SaveChanges();
+				await c.SaveChangesAsync();
 
 				var postStat = new PostStat { Count = 10, Author = author };
 				author.PostStat = postStat;
 				c.Add(postStat);
-				c.SaveChanges();
+				await c.SaveChangesAsync();
 			});
 
 		using var context = contextFactory.CreateContext();
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/UdfDbFunctionFbTests.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/UdfDbFunctionFbTests.cs
index 7d201a95..937a842d 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/UdfDbFunctionFbTests.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/Query/UdfDbFunctionFbTests.cs
@@ -16,6 +16,7 @@
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
 using System;
+using System.Threading.Tasks;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
 using Microsoft.EntityFrameworkCore;
@@ -176,18 +177,6 @@ public override void QF_CrossJoin_Parameter()
 		base.QF_CrossJoin_Parameter();
 	}
 
-	[Fact(Skip = "efcore#24228")]
-	public override void Nullable_navigation_property_access_preserves_schema_for_sql_function()
-	{
-		base.Nullable_navigation_property_access_preserves_schema_for_sql_function();
-	}
-
-	[Fact(Skip = "efcore#24228")]
-	public override void Compare_function_without_null_propagation_to_null()
-	{
-		base.Compare_function_without_null_propagation_to_null();
-	}
-
 	protected class FbUDFSqlContext : UDFSqlContext
 	{
 		public FbUDFSqlContext(DbContextOptions options)
@@ -234,11 +223,11 @@ public class Fb : UdfFixtureBase
 		protected override ITestStoreFactory TestStoreFactory => FbTestStoreFactory.Instance;
 		protected override Type ContextType { get; } = typeof(FbUDFSqlContext);
 
-		protected override void Seed(DbContext context)
+		protected override async Task SeedAsync(DbContext context)
 		{
-			base.Seed(context);
+			await base.SeedAsync(context);
 
-			context.Database.ExecuteSqlRaw(
+			await context.Database.ExecuteSqlRawAsync(
 				@"create function ""CustomerOrderCount"" (customerId int)
                                                     returns int
                                                     as
@@ -246,7 +235,7 @@ returns int
                                                         return (select count(""Id"") from ""Orders"" where ""CustomerId"" = :customerId);
                                                     end");
 
-			context.Database.ExecuteSqlRaw(
+			await context.Database.ExecuteSqlRawAsync(
 				@"create function ""StarValue"" (starCount int, val varchar(1000))
                                                     returns varchar(1000)
                                                     as
@@ -254,7 +243,7 @@ returns varchar(1000)
                                                         return rpad('', :starCount, '*') || :val;
                                                     end");
 
-			context.Database.ExecuteSqlRaw(
+			await context.Database.ExecuteSqlRawAsync(
 				@"create function ""DollarValue"" (starCount int, val varchar(1000))
                                                     returns varchar(1000)
                                                     as
@@ -262,7 +251,7 @@ returns varchar(1000)
                                                         return rpad('', :starCount, '$') || :val;
                                                     end");
 
-			context.Database.ExecuteSqlRaw(
+			await context.Database.ExecuteSqlRawAsync(
 				@"create function ""GetReportingPeriodStartDate"" (period int)
                                                     returns timestamp
                                                     as
@@ -270,7 +259,7 @@ returns timestamp
                                                         return cast('1998-01-01' as timestamp);
                                                     end");
 
-			context.Database.ExecuteSqlRaw(
+			await context.Database.ExecuteSqlRawAsync(
 				@"create function ""GetCustWithMostOrdersAfterDate"" (searchDate Date)
                                                     returns int
                                                     as
@@ -282,7 +271,7 @@ group by ""CustomerId""
                                                                 order by count(""Id"") desc);
                                                     end");
 
-			context.Database.ExecuteSqlRaw(
+			await context.Database.ExecuteSqlRawAsync(
 				@"create function ""IsTopCustomer"" (customerId int)
                                                     returns boolean
                                                     as
@@ -293,7 +282,7 @@ returns boolean
                                                         return false;
                                                     end");
 
-			context.Database.ExecuteSqlRaw(
+			await context.Database.ExecuteSqlRawAsync(
 				@"create function ""IdentityString"" (customerName varchar(1000))
                                                     returns varchar(1000)
                                                     as
@@ -301,7 +290,7 @@ returns varchar(1000)
                                                         return :customerName;
                                                     end");
 
-			context.Database.ExecuteSqlRaw(
+			await context.Database.ExecuteSqlRawAsync(
 				@"create function ""IsDate"" (val varchar(1000))
                                                     returns boolean
                                                     as
@@ -319,7 +308,48 @@ returns boolean
                                                         return true;
                                                     end");
 
-			context.SaveChanges();
+			await context.Database.ExecuteSqlRawAsync(
+				@"create procedure ""GetTopTwoSellingProducts""
+                                                    returns
+                                                    (
+                                                        ""ProductId"" int not null,
+                                                        ""AmountSold"" int
+                                                    )
+                                                    as
+                                                    begin
+                                                        for select first 2 ""ProductId"", sum(""Quantity"") as ""TotalSold""
+                                                        from ""LineItem""
+                                                        group by ""ProductId""
+                                                        order by ""TotalSold"" desc
+                                                        into :""ProductId"", :""AmountSold"" do
+                                                        begin
+                                                            suspend;
+                                                        end
+                                                    end");
+
+			await context.Database.ExecuteSqlRawAsync(
+				@"create procedure ""GetOrdersWithMultipleProducts""(customerId int)
+                                                    returns
+                                                    (
+                                                        ""OrderId"" int not null,
+                                                        ""CustomerId"" int not null,
+                                                        ""OrderDate"" timestamp
+                                                    )
+                                                    as
+                                                    begin
+                                                        for select o.""Id"", :customerId, ""OrderDate""
+                                                        from ""Orders"" o
+                                                        join ""LineItem"" li on o.""Id"" = li.""OrderId""
+                                                        where o.""CustomerId"" = :customerId
+                                                        group by o.""Id"", ""OrderDate""
+                                                        having count(""ProductId"") > 1
+                                                        into :""OrderId"", :""CustomerId"", :""OrderDate"" do
+                                                        begin
+                                                            suspend;
+                                                        end
+                                                    end");
+
+			await context.SaveChangesAsync();
 		}
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/TestUtilities/FbPrecompiledQueryTestHelpers.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/TestUtilities/FbPrecompiledQueryTestHelpers.cs
new file mode 100644
index 00000000..023076cf
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/TestUtilities/FbPrecompiledQueryTestHelpers.cs
@@ -0,0 +1,37 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System.Collections.Generic;
+using System.Reflection;
+using FirebirdSql.EntityFrameworkCore.Firebird.Infrastructure.Internal;
+using Microsoft.CodeAnalysis;
+using Microsoft.EntityFrameworkCore.TestUtilities;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
+
+public class FbPrecompiledQueryTestHelpers : PrecompiledQueryTestHelpers
+{
+	public static readonly FbPrecompiledQueryTestHelpers Instance = new();
+
+	protected override IEnumerable<MetadataReference> BuildProviderMetadataReferences()
+	{
+#pragma warning disable EF1001
+		yield return MetadataReference.CreateFromFile(typeof(FbOptionsExtension).Assembly.Location);
+#pragma warning restore EF1001
+		yield return MetadataReference.CreateFromFile(Assembly.GetExecutingAssembly().Location);
+	}
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/TestUtilities/FbTestStore.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/TestUtilities/FbTestStore.cs
index b11c93c5..144862c7 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/TestUtilities/FbTestStore.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/TestUtilities/FbTestStore.cs
@@ -33,20 +33,8 @@ public static FbTestStore GetOrCreate(string name)
 		=> new FbTestStore(name, shared: true);
 
 	public FbTestStore(string name, bool shared)
-		: base(name, shared)
-	{
-		var csb = new FbConnectionStringBuilder
-		{
-			Database = $"EFCore_{name}.fdb",
-			DataSource = "localhost",
-			UserID = "sysdba",
-			Password = "masterkey",
-			Pooling = false,
-			Charset = "utf8"
-		};
-		ConnectionString = csb.ToString();
-		Connection = new FbConnection(ConnectionString);
-	}
+		: base(name, shared, CreateConnection(name, shared))
+	{ }
 
 	protected override string OpenDelimiter => "\"";
 	protected override string CloseDelimiter => "\"";
@@ -54,23 +42,28 @@ public FbTestStore(string name, bool shared)
 	public Version ServerVersion { get; private set; }
 	public bool ServerLessThan4() => ServerVersion < new Version(4, 0, 0, 0);
 
-	protected override void Initialize(Func<DbContext> createContext, Action<DbContext> seed, Action<DbContext> clean)
+	protected override async Task InitializeAsync(Func<DbContext> createContext, Func<DbContext, Task> seed, Func<DbContext, Task> clean)
 	{
-		using (var context = createContext())
+		// create database explicitly to specify Page Size and Forced Writes
+		await FbConnection.CreateDatabaseAsync(ConnectionString, pageSize: 16384, forcedWrites: false, overwrite: true);
+		await using (var context = createContext())
 		{
-			// create database explicitly to specify Page Size and Forced Writes
-			FbConnection.CreateDatabase(ConnectionString, pageSize: 16384, forcedWrites: false, overwrite: true);
 			try
 			{
-				context.Database.EnsureCreated();
+				await context.Database.EnsureCreatedAsync();
 			}
 			catch (FbException ex) when (ServerLessThan4() && ex.Message.EndsWith("Name longer than database column size", StringComparison.Ordinal))
 			{
 				return;
 			}
-			clean?.Invoke(context);
-			Clean(context);
-			seed?.Invoke(context);
+			if (clean != null)
+			{
+				await clean(context);
+			}
+			if (seed != null)
+			{
+				await seed(context);
+			}
 		}
 	}
 
@@ -97,7 +90,7 @@ public override async Task OpenConnectionAsync()
 		await base.OpenConnectionAsync();
 		if (FbServerProperties.ParseServerVersion(Connection.ServerVersion) >= new Version(4, 0, 0, 0))
 		{
-			using (var cmd = Connection.CreateCommand())
+			await using (var cmd = Connection.CreateCommand())
 			{
 				cmd.CommandText = "set bind of decfloat to legacy";
 				await cmd.ExecuteNonQueryAsync();
@@ -113,6 +106,17 @@ public override DbContextOptionsBuilder AddProviderOptions(DbContextOptionsBuild
 		=> builder.UseFirebird(Connection,
 			x => x.UseQuerySplittingBehavior(QuerySplittingBehavior.SingleQuery));
 
-	public override void Clean(DbContext context)
-	{ }
+	static FbConnection CreateConnection(string name, bool shared)
+	{
+		var csb = new FbConnectionStringBuilder
+		{
+			Database = $"EFCore_{name}.fdb",
+			DataSource = "localhost",
+			UserID = "sysdba",
+			Password = "masterkey",
+			Pooling = false,
+			Charset = "utf8"
+		};
+		return new FbConnection(csb.ToString());
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/UpdatesFbTest.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/UpdatesFbTest.cs
index 3ede018e..1b5909bc 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/UpdatesFbTest.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests/UpdatesFbTest.cs
@@ -17,12 +17,14 @@
 
 using System;
 using System.Linq;
+using System.Threading.Tasks;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.Helpers;
 using FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.TestUtilities;
 using FirebirdSql.EntityFrameworkCore.Firebird.Metadata;
 using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.TestModels.UpdatesModel;
 using Microsoft.EntityFrameworkCore.TestUtilities;
+using Microsoft.EntityFrameworkCore.Update;
 using Xunit;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests;
@@ -55,7 +57,7 @@ public override void Identifiers_are_generated_correctly()
 	}
 
 	[Fact(Skip = "Uses type of filtered index that is not supported on Firebird.")]
-	public override void Swap_filtered_unique_index_values() => base.Swap_filtered_unique_index_values();
+	public override Task Swap_filtered_unique_index_values() => base.Swap_filtered_unique_index_values();
 
 	public class UpdatesFbFixture : UpdatesRelationalFixture
 	{
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.Tests/FirebirdSql.EntityFrameworkCore.Firebird.Tests.csproj b/src/FirebirdSql.EntityFrameworkCore.Firebird.Tests/FirebirdSql.EntityFrameworkCore.Firebird.Tests.csproj
index bcb38dba..f126570b 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.Tests/FirebirdSql.EntityFrameworkCore.Firebird.Tests.csproj
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.Tests/FirebirdSql.EntityFrameworkCore.Firebird.Tests.csproj
@@ -1,6 +1,6 @@
 ﻿<Project Sdk="Microsoft.NET.Sdk">
 	<PropertyGroup>
-		<TargetFramework>net7.0</TargetFramework>
+		<TargetFramework>net9.0</TargetFramework>
 		<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
 		<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
 		<SkipSourceLink>true</SkipSourceLink>
@@ -12,13 +12,17 @@
 		<StartupObject>FirebirdSql.Data.TestsBase.Program</StartupObject>
 	</PropertyGroup>
 	<ItemGroup>
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
-		<PackageReference Include="NUnit" Version="3.13.3" />
-		<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
-		<PackageReference Include="NUnitLite" Version="3.13.3" />
+		<Using Include="NUnit.Framework.Legacy.ClassicAssert" Alias="Assert" />
+		<Using Include="NUnit.Framework.Legacy.CollectionAssert" Alias="CollectionAssert" />
+		<Using Include="NUnit.Framework.Legacy.StringAssert" Alias="StringAssert" />
+	</ItemGroup>
+	<ItemGroup>
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+		<PackageReference Include="NUnit" Version="4.2.2" />
+		<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
+		<PackageReference Include="NUnitLite" Version="4.2.2" />
 	</ItemGroup>
 	<ItemGroup>
-		<ProjectReference Include="..\FirebirdSql.Data.FirebirdClient\FirebirdSql.Data.FirebirdClient.csproj" />
 		<ProjectReference Include="..\FirebirdSql.EntityFrameworkCore.Firebird\FirebirdSql.EntityFrameworkCore.Firebird.csproj" />
 	</ItemGroup>
 	<ItemGroup>
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird.Tests/Migrations/MigrationsTests.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird.Tests/Migrations/MigrationsTests.cs
index cc9aaf8a..eabcd1bc 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird.Tests/Migrations/MigrationsTests.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird.Tests/Migrations/MigrationsTests.cs
@@ -624,7 +624,20 @@ public async Task RestartSequence()
 		};
 		var batch = await Generate(new[] { operation });
 		Assert.AreEqual(1, batch.Count());
-		Assert.AreEqual(NewLineEnd(@"ALTER SEQUENCE ""MySequence"" START WITH 23;"), batch[0].CommandText);
+		Assert.AreEqual(NewLineEnd(@"ALTER SEQUENCE ""MySequence"" RESTART WITH 23;"), batch[0].CommandText);
+	}
+
+	[Test]
+	public async Task RestartSequenceNoValue()
+	{
+		var operation = new RestartSequenceOperation()
+		{
+			Name = "MySequence",
+			StartValue = null,
+		};
+		var batch = await Generate(new[] { operation });
+		Assert.AreEqual(1, batch.Count());
+		Assert.AreEqual(NewLineEnd(@"ALTER SEQUENCE ""MySequence"" RESTART;"), batch[0].CommandText);
 	}
 
 	[Test]
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Extensions/FbPropertyExtensions.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Extensions/FbPropertyExtensions.cs
index 85ab07c8..dc76ff76 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Extensions/FbPropertyExtensions.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Extensions/FbPropertyExtensions.cs
@@ -41,7 +41,7 @@ public static FbValueGenerationStrategy GetValueGenerationStrategy(this IPropert
 			return FbValueGenerationStrategy.None;
 		}
 
-		var modelStrategy = property.DeclaringEntityType.Model.GetValueGenerationStrategy();
+		var modelStrategy = property.DeclaringType.Model.GetValueGenerationStrategy();
 
 		if (modelStrategy == FbValueGenerationStrategy.SequenceTrigger && IsCompatibleSequenceTrigger(property))
 		{
@@ -49,7 +49,7 @@ public static FbValueGenerationStrategy GetValueGenerationStrategy(this IPropert
 		}
 		if (modelStrategy == FbValueGenerationStrategy.IdentityColumn)
 		{
-			if (property.DeclaringEntityType.GetMappingStrategy() == RelationalAnnotationNames.TpcMappingStrategy)
+			if (property.DeclaringType.GetMappingStrategy() == RelationalAnnotationNames.TpcMappingStrategy)
 			{
 				return FbValueGenerationStrategy.SequenceTrigger;
 			}
@@ -83,7 +83,7 @@ public static FbValueGenerationStrategy GetValueGenerationStrategy(this IMutable
 			return FbValueGenerationStrategy.None;
 		}
 
-		var modelStrategy = property.DeclaringEntityType.Model.GetValueGenerationStrategy();
+		var modelStrategy = property.DeclaringType.Model.GetValueGenerationStrategy();
 
 		if (modelStrategy == FbValueGenerationStrategy.SequenceTrigger && IsCompatibleSequenceTrigger(property))
 		{
@@ -91,7 +91,7 @@ public static FbValueGenerationStrategy GetValueGenerationStrategy(this IMutable
 		}
 		if (modelStrategy == FbValueGenerationStrategy.IdentityColumn)
 		{
-			if (property.DeclaringEntityType.GetMappingStrategy() == RelationalAnnotationNames.TpcMappingStrategy)
+			if (property.DeclaringType.GetMappingStrategy() == RelationalAnnotationNames.TpcMappingStrategy)
 			{
 				return FbValueGenerationStrategy.SequenceTrigger;
 			}
@@ -125,7 +125,7 @@ public static FbValueGenerationStrategy GetValueGenerationStrategy(this IConvent
 			return FbValueGenerationStrategy.None;
 		}
 
-		var modelStrategy = property.DeclaringEntityType.Model.GetValueGenerationStrategy();
+		var modelStrategy = property.DeclaringType.Model.GetValueGenerationStrategy();
 
 		if (modelStrategy == FbValueGenerationStrategy.SequenceTrigger && IsCompatibleSequenceTrigger(property))
 		{
@@ -133,7 +133,7 @@ public static FbValueGenerationStrategy GetValueGenerationStrategy(this IConvent
 		}
 		if (modelStrategy == FbValueGenerationStrategy.IdentityColumn)
 		{
-			if (property.DeclaringEntityType.GetMappingStrategy() == RelationalAnnotationNames.TpcMappingStrategy)
+			if (property.DeclaringType.GetMappingStrategy() == RelationalAnnotationNames.TpcMappingStrategy)
 			{
 				return FbValueGenerationStrategy.SequenceTrigger;
 			}
@@ -231,7 +231,7 @@ public static string SetHiLoSequenceSchema(this IConventionProperty property, st
 
 	public static IReadOnlySequence FindHiLoSequence(this IReadOnlyProperty property)
 	{
-		var model = property.DeclaringEntityType.Model;
+		var model = property.DeclaringType.Model;
 
 		var sequenceName = property.GetHiLoSequenceName()
 			?? model.GetHiLoSequenceName();
@@ -244,7 +244,7 @@ public static IReadOnlySequence FindHiLoSequence(this IReadOnlyProperty property
 
 	public static IReadOnlySequence FindHiLoSequence(this IReadOnlyProperty property, in StoreObjectIdentifier storeObject)
 	{
-		var model = property.DeclaringEntityType.Model;
+		var model = property.DeclaringType.Model;
 
 		var sequenceName = property.GetHiLoSequenceName(storeObject)
 			?? model.GetHiLoSequenceName();
@@ -329,7 +329,7 @@ public static string SetSequenceSchema(this IConventionProperty property, string
 
 	public static IReadOnlySequence FindSequence(this IReadOnlyProperty property)
 	{
-		var model = property.DeclaringEntityType.Model;
+		var model = property.DeclaringType.Model;
 
 		var sequenceName = property.GetSequenceName()
 			?? model.GetSequenceNameSuffix();
@@ -342,7 +342,7 @@ public static IReadOnlySequence FindSequence(this IReadOnlyProperty property)
 
 	public static IReadOnlySequence FindSequence(this IReadOnlyProperty property, in StoreObjectIdentifier storeObject)
 	{
-		var model = property.DeclaringEntityType.Model;
+		var model = property.DeclaringType.Model;
 
 		var sequenceName = property.GetSequenceName(storeObject)
 			?? model.GetSequenceNameSuffix();
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Extensions/FbServiceCollectionExtensions.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Extensions/FbServiceCollectionExtensions.cs
index 505eeb56..787148ff 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Extensions/FbServiceCollectionExtensions.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Extensions/FbServiceCollectionExtensions.cs
@@ -78,6 +78,7 @@ public static IServiceCollection AddEntityFrameworkFirebird(this IServiceCollect
 			.TryAdd<IMemberTranslatorProvider, FbMemberTranslatorProvider>()
 			.TryAdd<IMethodCallTranslatorProvider, FbMethodCallTranslatorProvider>()
 			.TryAdd<IQuerySqlGeneratorFactory, FbQuerySqlGeneratorFactory>()
+			.TryAdd<IQueryTranslationPreprocessorFactory, FbQueryTranslationPreprocessorFactory>()
 			.TryAdd<ISqlExpressionFactory, FbSqlExpressionFactory>()
 			.TryAdd<ISingletonOptions, IFbOptions>(p => p.GetService<IFbOptions>())
 			.TryAdd<IRelationalSqlTranslatingExpressionVisitorFactory, FbSqlTranslatingExpressionVisitorFactory>()
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/FirebirdSql.EntityFrameworkCore.Firebird.csproj b/src/FirebirdSql.EntityFrameworkCore.Firebird/FirebirdSql.EntityFrameworkCore.Firebird.csproj
index 1991916c..a8f28a98 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/FirebirdSql.EntityFrameworkCore.Firebird.csproj
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/FirebirdSql.EntityFrameworkCore.Firebird.csproj
@@ -1,6 +1,6 @@
 ﻿<Project Sdk="Microsoft.NET.Sdk">
 	<PropertyGroup>
-		<TargetFrameworks>net6.0</TargetFrameworks>
+		<TargetFrameworks>net8.0</TargetFrameworks>
 		<AssemblyName>FirebirdSql.EntityFrameworkCore.Firebird</AssemblyName>
 		<RootNamespace>FirebirdSql.EntityFrameworkCore.Firebird</RootNamespace>
 		<SignAssembly>true</SignAssembly>
@@ -9,14 +9,15 @@
 		<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
 	</PropertyGroup>
 	<PropertyGroup>
+		<Version>$(EFCoreProviderVersion)</Version>
 		<AssemblyTitle>NETProvider - Entity Framework Core Provider</AssemblyTitle>
-		<Copyright>(c) 2017-2023</Copyright>
+		<Copyright>(c) 2017-$(CopyrightEndYear)</Copyright>
 	</PropertyGroup>
 	<PropertyGroup>
 		<PackageId>FirebirdSql.EntityFrameworkCore.Firebird</PackageId>
 		<Title>Firebird Entity Framework Core Provider</Title>
 		<PackageDescription>The Entity Framework Core provider for Firebird enables you to develop .NET applications that connect to the Firebird database using Entity Framework Core.</PackageDescription>
-		<PackageTags>firebird;firebirsql;firebirdclient;entityframeworkcore;adonet;database</PackageTags>
+		<PackageTags>firebird firebirsql firebirdclient entityframeworkcore adonet database</PackageTags>
 	</PropertyGroup>
 	<PropertyGroup Condition="'$(Configuration)'=='Release'">
 		<DefineConstants>EFCORE;TRACE</DefineConstants>
@@ -29,9 +30,12 @@
 		<None Include="..\..\firebird-logo.png" Pack="true" PackagePath="" />
 	</ItemGroup>
 	<ItemGroup>
-		<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.10" />
+		<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="$(EFCoreReferencePackageVersion)" />
 	</ItemGroup>
-	<ItemGroup>
+	<ItemGroup Condition="'$(Configuration)'!='Debug'">
+		<PackageReference Include="FirebirdSql.Data.FirebirdClient" Version="$(EFCoreReferenceProviderVersion)" />
+	</ItemGroup>
+	<ItemGroup Condition="'$(Configuration)'=='Debug'">
 		<ProjectReference Include="..\FirebirdSql.Data.FirebirdClient\FirebirdSql.Data.FirebirdClient.csproj" />
 	</ItemGroup>
 </Project>
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Infrastructure/Internal/FbModelValidator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Infrastructure/Internal/FbModelValidator.cs
index 55581b40..cbcbf2b5 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Infrastructure/Internal/FbModelValidator.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Infrastructure/Internal/FbModelValidator.cs
@@ -32,7 +32,7 @@ public FbModelValidator(ModelValidatorDependencies dependencies, RelationalModel
 
 	protected override void ValidateValueGeneration(IEntityType entityType, IKey key, IDiagnosticsLogger<DbLoggerCategory.Model.Validation> logger)
 	{
-		if (entityType.GetTableName() != null && (string)entityType[RelationalAnnotationNames.MappingStrategy] == RelationalAnnotationNames.TpcMappingStrategy)
+		if (entityType.GetMappingStrategy() == RelationalAnnotationNames.TpcMappingStrategy && entityType.BaseType == null)
 		{
 			foreach (var storeGeneratedProperty in key.Properties.Where(p => (p.ValueGenerated & ValueGenerated.OnAdd) != 0 && p.GetValueGenerationStrategy() == FbValueGenerationStrategy.IdentityColumn))
 			{
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/FbMigrationsSqlGenerator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/FbMigrationsSqlGenerator.cs
index cda1862f..746b6594 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/FbMigrationsSqlGenerator.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/FbMigrationsSqlGenerator.cs
@@ -201,6 +201,19 @@ protected override void Generate(CreateIndexOperation operation, IModel model, M
 		{
 			builder.Append("UNIQUE ");
 		}
+
+		if (operation.IsDescending is not null && operation.IsDescending.Length > 0)
+		{
+			var isDescending = operation.IsDescending[0];
+			if (operation.IsDescending.Any(x => x != isDescending))
+				throw new NotSupportedException("Mixed order indices are not supported by Firebird.");
+
+			if (isDescending)
+			{
+				builder.Append("DESC ");
+			}
+		}
+
 		IndexTraits(operation, model, builder);
 		builder.Append("INDEX ");
 		builder.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name));
@@ -259,8 +272,12 @@ protected override void Generate(RestartSequenceOperation operation, IModel mode
 	{
 		builder.Append("ALTER SEQUENCE ");
 		builder.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name, operation.Schema));
-		builder.Append(" START WITH ");
-		builder.Append(operation.StartValue.ToString(CultureInfo.InvariantCulture));
+		builder.Append(" RESTART");
+		if (operation.StartValue != null)
+		{
+			builder.Append(" WITH ");
+			builder.Append(((long)operation.StartValue).ToString(CultureInfo.InvariantCulture));
+		}
 		TerminateStatement(builder);
 	}
 
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/Internal/FbHistoryRepository.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/Internal/FbHistoryRepository.cs
index fc675b8b..2ccc66ee 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/Internal/FbHistoryRepository.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/Internal/FbHistoryRepository.cs
@@ -16,42 +16,167 @@
 //$Authors = Jiri Cincura (jiri@cincura.net), Jean Ressouche, Rafael Almeida (ralms@ralms.net)
 
 using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.EntityFrameworkCore.Diagnostics;
 using Microsoft.EntityFrameworkCore.Migrations;
 using Microsoft.EntityFrameworkCore.Storage;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.Migrations.Internal;
 
-public class FbHistoryRepository : HistoryRepository
+public class FbHistoryRepository(HistoryRepositoryDependencies dependencies) : HistoryRepository(dependencies)
 {
-	public FbHistoryRepository(HistoryRepositoryDependencies dependencies)
-		: base(dependencies)
-	{ }
+	static readonly TimeSpan RetryDelay = TimeSpan.FromSeconds(1);
 
 	protected override string ExistsSql
 	{
 		get
 		{
 			var escapedTableName = Dependencies.TypeMappingSource.GetMapping(typeof(string)).GenerateSqlLiteral(TableName);
-			return $@"SELECT COUNT(*) FROM rdb$relations WHERE COALESCE(rdb$system_flag, 0) = 0 AND rdb$view_blr IS NULL AND rdb$relation_name = {escapedTableName}";
+			return $"""
+				SELECT COUNT(*) FROM rdb$relations WHERE COALESCE(rdb$system_flag, 0) = 0 AND rdb$view_blr IS NULL AND rdb$relation_name = {escapedTableName}
+				""";
 		}
 	}
 
-	protected override bool InterpretExistsResult(object value) => Convert.ToInt64(value) != 0;
+	protected override bool InterpretExistsResult(object value)
+		=> Convert.ToInt64(value) != 0;
 
-	public override string GetCreateIfNotExistsScript() => GetCreateScript();
+	public override string GetCreateIfNotExistsScript()
+	{
+		var script = GetCreateScript();
+		return BuildIfTableNotExistsBlock(script).CommandText;
+	}
 
-	public override string GetBeginIfExistsScript(string migrationId)
+	protected virtual string LockTableName { get; } = "__EFMigrationsLock";
+
+	public override LockReleaseBehavior LockReleaseBehavior
+		=> LockReleaseBehavior.Explicit;
+
+	public override IMigrationsDatabaseLock AcquireDatabaseLock()
 	{
-		throw new NotSupportedException("Generating idempotent scripts is currently not supported.");
+		Dependencies.MigrationsLogger.AcquiringMigrationLock();
+
+		CreateLockTableCommand().ExecuteNonQuery(CreateRelationalCommandParameters());
+
+		var retryDelay = RetryDelay;
+		while (true)
+		{
+			var dbLock = CreateMigrationDatabaseLock();
+			var insertCount = CreateInsertLockCommand(DateTime.UtcNow)
+				.ExecuteScalar(CreateRelationalCommandParameters());
+			if ((int)insertCount == 1)
+			{
+				return dbLock;
+			}
+
+			Thread.Sleep(retryDelay);
+			if (retryDelay < TimeSpan.FromMinutes(1))
+			{
+				retryDelay = retryDelay.Add(retryDelay);
+			}
+		}
 	}
 
-	public override string GetBeginIfNotExistsScript(string migrationId)
+	public override async Task<IMigrationsDatabaseLock> AcquireDatabaseLockAsync(CancellationToken cancellationToken = default)
 	{
-		throw new NotSupportedException("Generating idempotent scripts is currently not supported.");
+		Dependencies.MigrationsLogger.AcquiringMigrationLock();
+
+		await CreateLockTableCommand().ExecuteNonQueryAsync(CreateRelationalCommandParameters(), cancellationToken).ConfigureAwait(false);
+
+		var retryDelay = RetryDelay;
+		while (true)
+		{
+			var dbLock = CreateMigrationDatabaseLock();
+			var insertCount = await CreateInsertLockCommand(DateTime.UtcNow)
+				.ExecuteScalarAsync(CreateRelationalCommandParameters(), cancellationToken)
+				.ConfigureAwait(false);
+			if ((int)insertCount == 1)
+			{
+				return dbLock;
+			}
+
+			await Task.Delay(RetryDelay, cancellationToken).ConfigureAwait(true);
+			if (retryDelay < TimeSpan.FromMinutes(1))
+			{
+				retryDelay = retryDelay.Add(retryDelay);
+			}
+		}
 	}
 
+	public override string GetBeginIfExistsScript(string migrationId)
+		=> throw new NotSupportedException("Generating idempotent scripts is currently not supported.");
+
+	public override string GetBeginIfNotExistsScript(string migrationId)
+		=> throw new NotSupportedException("Generating idempotent scripts is currently not supported.");
+
 	public override string GetEndIfScript()
+		=> throw new NotSupportedException("Generating idempotent scripts is currently not supported.");
+
+	IRelationalCommand CreateLockTableCommand()
+	{
+		return BuildIfTableNotExistsBlock($"""
+			CREATE TABLE "{LockTableName}" (
+				"Id" INT NOT NULL CONSTRAINT "PK_{LockTableName}" PRIMARY KEY,
+				"Timestamp" TIMESTAMP NOT NULL
+			)
+			""");
+	}
+
+	IRelationalCommand CreateInsertLockCommand(DateTime timestamp)
+	{
+		var timestampLiteral = Dependencies.TypeMappingSource.GetMapping(typeof(DateTime)).GenerateSqlLiteral(timestamp);
+		return Dependencies.RawSqlCommandBuilder.Build($"""
+			EXECUTE BLOCK
+			RETURNS (ROWS_AFFECTED INT)
+			AS
+			BEGIN
+				ROWS_AFFECTED = 1;
+				BEGIN
+					INSERT INTO "{LockTableName}" ("Id", "Timestamp") VALUES (1, {timestampLiteral});
+					WHEN SQLSTATE '23000' DO
+					BEGIN
+						ROWS_AFFECTED = 0;
+					END
+				END
+				SUSPEND;
+			END
+			""");
+	}
+
+	IRelationalCommand CreateDeleteLockCommand()
+	{
+		return Dependencies.RawSqlCommandBuilder.Build($"""
+			DELETE FROM "{LockTableName}" WHERE "Id" = 1
+			""");
+	}
+
+	FbMigrationDatabaseLock CreateMigrationDatabaseLock()
+		=> new(CreateDeleteLockCommand(), CreateRelationalCommandParameters(), this);
+
+	RelationalCommandParameterObject CreateRelationalCommandParameters()
+		=> new(
+			Dependencies.Connection,
+			null,
+			null,
+			Dependencies.CurrentContext.Context,
+			Dependencies.CommandLogger, CommandSource.Migrations);
+
+	IRelationalCommand BuildIfTableNotExistsBlock(string statement)
 	{
-		throw new NotSupportedException("Generating idempotent scripts is currently not supported.");
+		var statementLiteral = Dependencies.TypeMappingSource.GetMapping(typeof(string)).GenerateSqlLiteral(statement);
+		return Dependencies.RawSqlCommandBuilder.Build($"""
+			EXECUTE BLOCK
+			AS
+			BEGIN
+				BEGIN
+					EXECUTE STATEMENT
+						{statementLiteral};
+					WHEN SQLSTATE '42S01' DO
+					BEGIN
+					END
+				END
+			END
+			""");
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/Internal/FbMigrationDatabaseLock.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/Internal/FbMigrationDatabaseLock.cs
new file mode 100644
index 00000000..cb85c830
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Migrations/Internal/FbMigrationDatabaseLock.cs
@@ -0,0 +1,39 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.Migrations.Internal;
+
+public class FbMigrationDatabaseLock(
+	IRelationalCommand releaseLockCommand,
+	RelationalCommandParameterObject relationalCommandParameters,
+	IHistoryRepository historyRepository,
+	CancellationToken cancellationToken = default)
+	: IMigrationsDatabaseLock
+{
+	public virtual IHistoryRepository HistoryRepository => historyRepository;
+
+	public void Dispose()
+		=> releaseLockCommand.ExecuteScalar(relationalCommandParameters);
+
+	public async ValueTask DisposeAsync()
+		=> await releaseLockCommand.ExecuteScalarAsync(relationalCommandParameters, cancellationToken).ConfigureAwait(false);
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbDateOnlyMethodTranslator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbDateOnlyMethodTranslator.cs
new file mode 100644
index 00000000..8557a6f2
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbDateOnlyMethodTranslator.cs
@@ -0,0 +1,66 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Diagnostics;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.Query.ExpressionTranslators.Internal;
+
+public class FbDateOnlyMethodTranslator : IMethodCallTranslator
+{
+	readonly Dictionary<MethodInfo, string> _methodInfoDatePartMapping = new()
+	{
+		{ typeof(DateOnly).GetRuntimeMethod(nameof(DateOnly.AddYears), [typeof(int)]), "year" },
+		{ typeof(DateOnly).GetRuntimeMethod(nameof(DateOnly.AddMonths), [typeof(int)]), "month" },
+		{ typeof(DateOnly).GetRuntimeMethod(nameof(DateOnly.AddDays), [typeof(int)]), "day" }
+	};
+
+	readonly ISqlExpressionFactory _sqlExpressionFactory;
+
+	public FbDateOnlyMethodTranslator(ISqlExpressionFactory sqlExpressionFactory)
+	{
+		_sqlExpressionFactory = sqlExpressionFactory;
+	}
+
+	public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadOnlyList<SqlExpression> arguments, IDiagnosticsLogger<DbLoggerCategory.Query> logger)
+	{
+		if (_methodInfoDatePartMapping.TryGetValue(method, out var datePart) && instance != null)
+		{
+			instance = _sqlExpressionFactory.ApplyDefaultTypeMapping(instance);
+
+			return _sqlExpressionFactory.Function(
+				"DATEADD",
+				new[] { _sqlExpressionFactory.Fragment(datePart), _sqlExpressionFactory.Convert(arguments[0], typeof(int)), instance },
+				nullable: true,
+				argumentsPropagateNullability: new[] { false, true, true },
+				instance.Type,
+				instance.TypeMapping);
+		}
+
+		if (method.DeclaringType == typeof(DateOnly) && method.Name == nameof(DateOnly.FromDateTime) && arguments.Count == 1)
+		{
+			return _sqlExpressionFactory.Convert(arguments[0], typeof(DateOnly));
+		}
+
+		return null;
+	}
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbMathTranslator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbMathTranslator.cs
index 263248f5..63b8ff9b 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbMathTranslator.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbMathTranslator.cs
@@ -52,7 +52,6 @@ public class FbMathTranslator : IMethodCallTranslator
 			{ typeof(Math).GetRuntimeMethod(nameof(Math.Log10), new[] { typeof(double) }), "LOG10" },
 
 			{ typeof(Math).GetRuntimeMethod(nameof(Math.Log), new[] { typeof(double) }), "LN" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Log), new[] { typeof(double), typeof(double) }), "LOG" },
 
 			{ typeof(Math).GetRuntimeMethod(nameof(Math.Sqrt), new[] { typeof(double) }), "SQRT" },
 
@@ -77,30 +76,6 @@ public class FbMathTranslator : IMethodCallTranslator
 			{ typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] { typeof(double) }), "SIGN" },
 			{ typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] { typeof(decimal) }), "SIGN" },
 			{ typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] { typeof(short) }), "SIGN" },
-
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(float), typeof(float) }), "MAXVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(sbyte), typeof(sbyte) }), "MAXVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(ulong), typeof(ulong) }), "MAXVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(uint), typeof(uint) }), "MAXVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(long), typeof(long) }), "MAXVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(ushort), typeof(ushort) }), "MAXVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(short), typeof(short) }), "MAXVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(double), typeof(double) }), "MAXVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(decimal), typeof(decimal) }), "MAXVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(byte), typeof(byte) }), "MAXVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(int), typeof(int) }), "MAXVALUE" },
-
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(float), typeof(float) }), "MINVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(sbyte), typeof(sbyte) }), "MINVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(ulong), typeof(ulong) }), "MINVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(uint), typeof(uint) }), "MINVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(long), typeof(long) }), "MINVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(ushort), typeof(ushort) }), "MINVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(short), typeof(short) }), "MINVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(double), typeof(double) }), "MINVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(decimal), typeof(decimal) }), "MINVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(byte), typeof(byte) }), "MINVALUE" },
-			{ typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(int), typeof(int) }), "MINVALUE" },
 		};
 
 	static readonly HashSet<MethodInfo> TruncateMethodInfos = new HashSet<MethodInfo>
@@ -117,6 +92,8 @@ public class FbMathTranslator : IMethodCallTranslator
 			typeof(Math).GetRuntimeMethod(nameof(Math.Round), new[] { typeof(double), typeof(int) })
 		};
 
+	static readonly MethodInfo LogNewBaseMethod = typeof(Math).GetRuntimeMethod(nameof(Math.Log), new[] { typeof(double), typeof(double) });
+
 	readonly FbSqlExpressionFactory _fbSqlExpressionFactory;
 
 	public FbMathTranslator(FbSqlExpressionFactory fbSqlExpressionFactory)
@@ -154,6 +131,10 @@ public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadO
 				nullability,
 				method.ReturnType));
 		}
+		if (LogNewBaseMethod == method)
+		{
+			return _fbSqlExpressionFactory.Function("LOG", arguments.Reverse(), true, arguments.Select(_ => true), method.ReturnType);
+		}
 		return null;
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbObjectToStringTranslator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbObjectToStringTranslator.cs
index 835f923f..0c7e2b24 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbObjectToStringTranslator.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbObjectToStringTranslator.cs
@@ -33,7 +33,6 @@ public class FbObjectToStringTranslator : IMethodCallTranslator
 			typeof(int),
 			typeof(long),
 			typeof(DateTime),
-			typeof(bool),
 			typeof(byte),
 			typeof(byte[]),
 			typeof(double),
@@ -59,18 +58,54 @@ public FbObjectToStringTranslator(FbSqlExpressionFactory fbSqlExpressionFactory)
 
 	public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadOnlyList<SqlExpression> arguments, IDiagnosticsLogger<DbLoggerCategory.Query> logger)
 	{
-		if (method.Name == nameof(ToString) && method.GetParameters().Length == 0)
+		if (instance == null || method.Name != nameof(ToString) || arguments.Count != 0)
 		{
-			var type = instance.Type.UnwrapNullableType();
-			if (SupportedTypes.Contains(type))
+			return null;
+		}
+
+		if (instance.TypeMapping?.ClrType == typeof(string))
+		{
+			return instance;
+		}
+
+		if (SupportedTypes.Contains(instance.Type))
+		{
+			return _fbSqlExpressionFactory.Convert(instance, typeof(string));
+		}
+		else if (instance.Type == typeof(Guid))
+		{
+			return _fbSqlExpressionFactory.Function("UUID_TO_CHAR", new[] { instance }, true, new[] { true }, typeof(string));
+		}
+		else if (instance.Type == typeof(bool))
+		{
+			if (instance is not ColumnExpression { IsNullable: false })
 			{
-				return _fbSqlExpressionFactory.Convert(instance, typeof(string));
+				return _fbSqlExpressionFactory.Case(
+					instance,
+					new[]
+					{
+						new CaseWhenClause(
+							_fbSqlExpressionFactory.Constant(false),
+							_fbSqlExpressionFactory.Constant(false.ToString())),
+						new CaseWhenClause(
+							_fbSqlExpressionFactory.Constant(true),
+							_fbSqlExpressionFactory.Constant(true.ToString()))
+					},
+					_fbSqlExpressionFactory.Constant(string.Empty));
 			}
-			else if (type == typeof(Guid))
+			else
 			{
-				return _fbSqlExpressionFactory.Function("UUID_TO_CHAR", new[] { instance }, true, new[] { true }, typeof(string));
+				return _fbSqlExpressionFactory.Case(
+					new[]
+					{
+						new CaseWhenClause(
+							instance,
+							_fbSqlExpressionFactory.Constant(true.ToString()))
+					},
+					_fbSqlExpressionFactory.Constant(false.ToString()));
 			}
 		}
+
 		return null;
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringContainsTranslator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringContainsTranslator.cs
index 87ec7716..bc1905ad 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringContainsTranslator.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringContainsTranslator.cs
@@ -50,14 +50,15 @@ public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadO
 				new[] { true, true },
 				typeof(int)),
 			_fbSqlExpressionFactory.Constant(0));
-		return patternExpression is SqlConstantExpression sqlConstantExpression
+		var matchingExpression = patternExpression is SqlConstantExpression sqlConstantExpression
 			? ((string)sqlConstantExpression.Value)?.Length == 0
 				? (SqlExpression)_fbSqlExpressionFactory.Constant(true)
-				: positionExpression
+				: (SqlExpression)positionExpression
 			: _fbSqlExpressionFactory.OrElse(
 				positionExpression,
 				_fbSqlExpressionFactory.Equal(
 					_fbSqlExpressionFactory.Function("CHAR_LENGTH", new[] { patternExpression }, true, new[] { true }, typeof(int)),
 					_fbSqlExpressionFactory.Constant(0)));
+		return _fbSqlExpressionFactory.AndAlso(matchingExpression, _fbSqlExpressionFactory.AndAlso(_fbSqlExpressionFactory.IsNotNull(instance), _fbSqlExpressionFactory.IsNotNull(patternExpression)));
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringEndsWithTranslator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringEndsWithTranslator.cs
index a0353c0d..0ddb1cdb 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringEndsWithTranslator.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringEndsWithTranslator.cs
@@ -57,14 +57,13 @@ public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadO
 					new[] { true, true },
 					instance.Type)),
 			patternExpression);
-		return patternExpression is SqlConstantExpression sqlConstantExpression
-			? (string)sqlConstantExpression.Value == string.Empty
-				? (SqlExpression)_fbSqlExpressionFactory.Constant(true)
-				: endsWithExpression
-			: _fbSqlExpressionFactory.OrElse(
+		var matchingExpression = patternExpression is SqlConstantExpression sqlConstantExpression
+			? (SqlExpression)((string)sqlConstantExpression.Value == string.Empty ? (SqlExpression)_fbSqlExpressionFactory.Constant(true) : endsWithExpression)
+			: (SqlExpression)_fbSqlExpressionFactory.OrElse(
 				endsWithExpression,
 				_fbSqlExpressionFactory.Equal(
 					_fbSqlExpressionFactory.Function("CHAR_LENGTH", new[] { patternExpression }, true, new[] { true }, typeof(int)),
 					_fbSqlExpressionFactory.Constant(0)));
+		return _fbSqlExpressionFactory.AndAlso(matchingExpression, _fbSqlExpressionFactory.AndAlso(_fbSqlExpressionFactory.IsNotNull(instance), _fbSqlExpressionFactory.IsNotNull(patternExpression)));
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringStartsWithTranslator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringStartsWithTranslator.cs
index b89294c3..0608835b 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringStartsWithTranslator.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringStartsWithTranslator.cs
@@ -65,14 +65,13 @@ public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadO
 					new[] { true, true },
 					instance.Type)),
 				patternExpression));
-		return patternConstantExpression != null
-			? (string)patternConstantExpression.Value == string.Empty
-				? _fbSqlExpressionFactory.Constant(true)
-				: startsWithExpression
-			: _fbSqlExpressionFactory.OrElse(
+		var matchingExpression = patternConstantExpression != null
+			? (SqlExpression)((string)patternConstantExpression.Value == string.Empty ? _fbSqlExpressionFactory.Constant(true) : startsWithExpression)
+			: (SqlExpression)_fbSqlExpressionFactory.OrElse(
 				startsWithExpression,
 				_fbSqlExpressionFactory.Equal(
 					_fbSqlExpressionFactory.Function("CHAR_LENGTH", new[] { patternExpression }, true, new[] { true }, typeof(int)),
 					_fbSqlExpressionFactory.Constant(0)));
+		return _fbSqlExpressionFactory.AndAlso(matchingExpression, _fbSqlExpressionFactory.AndAlso(_fbSqlExpressionFactory.IsNotNull(instance), _fbSqlExpressionFactory.IsNotNull(patternExpression)));
 	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbTimeOnlyMethodTranslator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbTimeOnlyMethodTranslator.cs
new file mode 100644
index 00000000..16946d9e
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbTimeOnlyMethodTranslator.cs
@@ -0,0 +1,54 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Diagnostics;
+using Microsoft.EntityFrameworkCore.Query;
+using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.Query.ExpressionTranslators.Internal;
+
+public class FbTimeOnlyMethodTranslator : IMethodCallTranslator
+{
+	static readonly MethodInfo FromDateTime = typeof(TimeOnly).GetRuntimeMethod(nameof(TimeOnly.FromDateTime), [typeof(DateTime)]);
+	static readonly MethodInfo FromTimeSpan = typeof(TimeOnly).GetRuntimeMethod(nameof(TimeOnly.FromTimeSpan), [typeof(TimeSpan)]);
+
+	readonly ISqlExpressionFactory _sqlExpressionFactory;
+
+	public FbTimeOnlyMethodTranslator(ISqlExpressionFactory sqlExpressionFactory)
+	{
+		_sqlExpressionFactory = sqlExpressionFactory;
+	}
+
+	public virtual SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadOnlyList<SqlExpression> arguments, IDiagnosticsLogger<DbLoggerCategory.Query> logger)
+	{
+		if (method.DeclaringType != typeof(TimeOnly))
+		{
+			return null;
+		}
+
+		if ((method == FromDateTime || method == FromTimeSpan) && instance is null && arguments.Count == 1)
+		{
+			return _sqlExpressionFactory.Convert(arguments[0], typeof(TimeOnly));
+		}
+
+		return null;
+	}
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQueryRootProcessor.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQueryRootProcessor.cs
new file mode 100644
index 00000000..495717e3
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQueryRootProcessor.cs
@@ -0,0 +1,33 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System.Linq.Expressions;
+using Microsoft.EntityFrameworkCore.Query;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.Query.Internal;
+
+public class FbQueryRootProcessor : RelationalQueryRootProcessor
+{
+	public FbQueryRootProcessor(QueryTranslationPreprocessorDependencies dependencies, RelationalQueryTranslationPreprocessorDependencies relationalDependencies, QueryCompilationContext queryCompilationContext)
+		: base(dependencies, relationalDependencies, queryCompilationContext)
+	{ }
+
+	protected override bool ShouldConvertToParameterQueryRoot(ParameterExpression constantExpression)
+	{
+		return false;
+	}
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQuerySqlGenerator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQuerySqlGenerator.cs
index 51268e4f..17fb2ff6 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQuerySqlGenerator.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQuerySqlGenerator.cs
@@ -65,31 +65,64 @@ protected override Expression VisitSqlBinary(SqlBinaryExpression sqlBinaryExpres
 			Sql.Append(")");
 			return sqlBinaryExpression;
 		}
-		else if (sqlBinaryExpression.OperatorType == ExpressionType.And && sqlBinaryExpression.TypeMapping.ClrType != typeof(bool))
+		else if (sqlBinaryExpression.OperatorType == ExpressionType.And)
 		{
-			Sql.Append("BIN_AND(");
-			Visit(sqlBinaryExpression.Left);
-			Sql.Append(", ");
-			Visit(sqlBinaryExpression.Right);
-			Sql.Append(")");
+			if (sqlBinaryExpression.TypeMapping.ClrType == typeof(bool))
+			{
+				Sql.Append("IIF(BIN_AND(");
+				BooleanToIntegralAndVisit(sqlBinaryExpression.Left);
+				Sql.Append(", ");
+				BooleanToIntegralAndVisit(sqlBinaryExpression.Right);
+				Sql.Append(") = 0, FALSE, TRUE)");
+			}
+			else
+			{
+				Sql.Append("BIN_AND(");
+				Visit(sqlBinaryExpression.Left);
+				Sql.Append(", ");
+				Visit(sqlBinaryExpression.Right);
+				Sql.Append(")");
+			}
 			return sqlBinaryExpression;
 		}
-		else if (sqlBinaryExpression.OperatorType == ExpressionType.Or && sqlBinaryExpression.TypeMapping.ClrType != typeof(bool))
+		else if (sqlBinaryExpression.OperatorType == ExpressionType.Or)
 		{
-			Sql.Append("BIN_OR(");
-			Visit(sqlBinaryExpression.Left);
-			Sql.Append(", ");
-			Visit(sqlBinaryExpression.Right);
-			Sql.Append(")");
+			if (sqlBinaryExpression.TypeMapping.ClrType == typeof(bool))
+			{
+				Sql.Append("IIF(BIN_OR(");
+				BooleanToIntegralAndVisit(sqlBinaryExpression.Left);
+				Sql.Append(", ");
+				BooleanToIntegralAndVisit(sqlBinaryExpression.Right);
+				Sql.Append(") = 0, FALSE, TRUE)");
+			}
+			else
+			{
+				Sql.Append("BIN_OR(");
+				Visit(sqlBinaryExpression.Left);
+				Sql.Append(", ");
+				Visit(sqlBinaryExpression.Right);
+				Sql.Append(")");
+			}
 			return sqlBinaryExpression;
 		}
 		else if (sqlBinaryExpression.OperatorType == ExpressionType.ExclusiveOr)
 		{
-			Sql.Append("BIN_XOR(");
-			Visit(sqlBinaryExpression.Left);
-			Sql.Append(", ");
-			Visit(sqlBinaryExpression.Right);
-			Sql.Append(")");
+			if (sqlBinaryExpression.TypeMapping.ClrType == typeof(bool))
+			{
+				Sql.Append("IIF(BIN_XOR(");
+				BooleanToIntegralAndVisit(sqlBinaryExpression.Left);
+				Sql.Append(", ");
+				BooleanToIntegralAndVisit(sqlBinaryExpression.Right);
+				Sql.Append(") = 0, FALSE, TRUE)");
+			}
+			else
+			{
+				Sql.Append("BIN_XOR(");
+				Visit(sqlBinaryExpression.Left);
+				Sql.Append(", ");
+				Visit(sqlBinaryExpression.Right);
+				Sql.Append(")");
+			}
 			return sqlBinaryExpression;
 		}
 		else if (sqlBinaryExpression.OperatorType == ExpressionType.LeftShift)
@@ -114,6 +147,13 @@ protected override Expression VisitSqlBinary(SqlBinaryExpression sqlBinaryExpres
 		{
 			return base.VisitSqlBinary(sqlBinaryExpression);
 		}
+
+		void BooleanToIntegralAndVisit(SqlExpression expression)
+		{
+			Sql.Append("IIF(");
+			Visit(expression);
+			Sql.Append(", 1, 0)");
+		}
 	}
 
 	protected override Expression VisitSqlParameter(SqlParameterExpression sqlParameterExpression)
@@ -151,8 +191,9 @@ protected override Expression VisitSqlConstant(SqlConstantExpression sqlConstant
 		base.VisitSqlConstant(sqlConstantExpression);
 		if (shouldExplicitStringLiteralTypes)
 		{
+			var isUnicode = FbTypeMappingSource.IsUnicode(sqlConstantExpression.TypeMapping);	
 			Sql.Append(" AS ");
-			Sql.Append(((IFbSqlGenerationHelper)Dependencies.SqlGenerationHelper).StringLiteralQueryType(sqlConstantExpression.Value as string));
+			Sql.Append(((IFbSqlGenerationHelper)Dependencies.SqlGenerationHelper).StringLiteralQueryType(sqlConstantExpression.Value as string, isUnicode));
 			Sql.Append(")");
 		}
 		return sqlConstantExpression;
@@ -160,11 +201,7 @@ protected override Expression VisitSqlConstant(SqlConstantExpression sqlConstant
 
 	protected override void GenerateEmptyProjection(SelectExpression selectExpression)
 	{
-		base.GenerateEmptyProjection(selectExpression);
-		if (selectExpression.Alias != null)
-		{
-			Sql.Append(" AS empty");
-		}
+		Sql.Append("1 AS dummy");
 	}
 
 	protected override void GenerateTop(SelectExpression selectExpression)
@@ -271,7 +308,7 @@ protected override Expression VisitOrdering(OrderingExpression orderingExpressio
 
 	protected override Expression VisitTableValuedFunction(TableValuedFunctionExpression tableValuedFunctionExpression)
 	{
-		Sql.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(tableValuedFunctionExpression.StoreFunction.Name));
+		Sql.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(tableValuedFunctionExpression.Name));
 		if (tableValuedFunctionExpression.Arguments.Any())
 		{
 			Sql.Append("(");
@@ -292,7 +329,7 @@ protected override Expression VisitExtension(Expression extensionExpression)
 		};
 	}
 
-	public virtual Expression VisitSpacedFunction(FbSpacedFunctionExpression spacedFunctionExpression)
+	protected virtual Expression VisitSpacedFunction(FbSpacedFunctionExpression spacedFunctionExpression)
 	{
 		Sql.Append(spacedFunctionExpression.Name);
 		Sql.Append("(");
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQueryTranslationPreprocessor.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQueryTranslationPreprocessor.cs
new file mode 100644
index 00000000..d95a444a
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQueryTranslationPreprocessor.cs
@@ -0,0 +1,34 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using System.Linq.Expressions;
+using Microsoft.EntityFrameworkCore.Query;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.Query.Internal;
+
+public class FbQueryTranslationPreprocessor : RelationalQueryTranslationPreprocessor
+{
+	public FbQueryTranslationPreprocessor(QueryTranslationPreprocessorDependencies dependencies, RelationalQueryTranslationPreprocessorDependencies relationalDependencies, QueryCompilationContext queryCompilationContext)
+		: base(dependencies, relationalDependencies, queryCompilationContext)
+	{ }
+
+	protected override Expression ProcessQueryRoots(Expression expression)
+	{
+		return new FbQueryRootProcessor(Dependencies, RelationalDependencies, QueryCompilationContext)
+			.Visit(expression);
+	}
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQueryTranslationPreprocessorFactory.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQueryTranslationPreprocessorFactory.cs
new file mode 100644
index 00000000..ebc6092e
--- /dev/null
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbQueryTranslationPreprocessorFactory.cs
@@ -0,0 +1,37 @@
+﻿/*
+ *    The contents of this file are subject to the Initial
+ *    Developer's Public License Version 1.0 (the "License");
+ *    you may not use this file except in compliance with the
+ *    License. You may obtain a copy of the License at
+ *    https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
+ *
+ *    Software distributed under the License is distributed on
+ *    an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+ *    express or implied. See the License for the specific
+ *    language governing rights and limitations under the License.
+ *
+ *    All Rights Reserved.
+ */
+
+//$Authors = Jiri Cincura (jiri@cincura.net)
+
+using Microsoft.EntityFrameworkCore.Query;
+
+namespace FirebirdSql.EntityFrameworkCore.Firebird.Query.Internal;
+
+public class FbQueryTranslationPreprocessorFactory : IQueryTranslationPreprocessorFactory
+{
+	readonly QueryTranslationPreprocessorDependencies _dependecies;
+	readonly RelationalQueryTranslationPreprocessorDependencies _relationalDependencies;
+
+	public FbQueryTranslationPreprocessorFactory(QueryTranslationPreprocessorDependencies dependecies, RelationalQueryTranslationPreprocessorDependencies relationalDependencies)
+	{
+		_dependecies = dependecies;
+		_relationalDependencies = relationalDependencies;
+	}
+
+	public QueryTranslationPreprocessor Create(QueryCompilationContext queryCompilationContext)
+	{
+		return new FbQueryTranslationPreprocessor(_dependecies, _relationalDependencies, queryCompilationContext);
+	}
+}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbSqlTranslatingExpressionVisitor.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbSqlTranslatingExpressionVisitor.cs
index e8a0754b..b1f81d54 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbSqlTranslatingExpressionVisitor.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Query/Internal/FbSqlTranslatingExpressionVisitor.cs
@@ -15,6 +15,9 @@
 
 //$Authors = Jiri Cincura (jiri@cincura.net)
 
+using System;
+using System.Collections.Generic;
+using System.Linq;
 using System.Linq.Expressions;
 using Microsoft.EntityFrameworkCore.Query;
 using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
@@ -39,4 +42,28 @@ protected override Expression VisitUnary(UnaryExpression unaryExpression)
 		}
 		return base.VisitUnary(unaryExpression);
 	}
+
+	public override SqlExpression GenerateGreatest(IReadOnlyList<SqlExpression> expressions, Type resultType)
+	{
+		var resultTypeMapping = ExpressionExtensions.InferTypeMapping(expressions);
+		return Dependencies.SqlExpressionFactory.Function(
+		   "MAXVALUE",
+		   expressions,
+		   nullable: true,
+		   Enumerable.Repeat(true, expressions.Count),
+		   resultType,
+		   resultTypeMapping);
+	}
+
+	public override SqlExpression GenerateLeast(IReadOnlyList<SqlExpression> expressions, Type resultType)
+	{
+		var resultTypeMapping = ExpressionExtensions.InferTypeMapping(expressions);
+		return Dependencies.SqlExpressionFactory.Function(
+		   "MINVALUE",
+		   expressions,
+		   nullable: true,
+		   Enumerable.Repeat(true, expressions.Count),
+		   resultType,
+		   resultTypeMapping);
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Scaffolding/Internal/FbDatabaseModelFactory.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Scaffolding/Internal/FbDatabaseModelFactory.cs
index 53599820..7bc317d1 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Scaffolding/Internal/FbDatabaseModelFactory.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Scaffolding/Internal/FbDatabaseModelFactory.cs
@@ -311,6 +311,7 @@ private void GetPrimaryKeys(DbConnection connection, IReadOnlyList<DatabaseTable
 		@"SELECT
                trim(I.rdb$index_name) as INDEX_NAME,
                COALESCE(I.rdb$unique_flag, 0) as IS_UNIQUE,
+               Coalesce(I.rdb$index_type, 0) as IS_DESC,
                list(trim(sg.RDB$FIELD_NAME)) as COLUMNS
               FROM
                RDB$INDICES i
@@ -319,7 +320,7 @@ private void GetPrimaryKeys(DbConnection connection, IReadOnlyList<DatabaseTable
               WHERE
                trim(i.rdb$relation_name) = '{0}'
               GROUP BY
-               INDEX_NAME, IS_UNIQUE ;";
+               INDEX_NAME, IS_UNIQUE, IS_DESC ;";
 
 	/// <remarks>
 	/// Primary keys are handled as in <see cref="GetConstraints"/>, not here
@@ -343,11 +344,18 @@ private void GetIndexes(DbConnection connection, IReadOnlyList<DatabaseTable> ta
 							IsUnique = reader.GetBoolean(1),
 						};
 
-						foreach (var column in reader.GetString(2).Split(','))
+						foreach (var column in reader.GetString(3).Split(','))
 						{
 							index.Columns.Add(table.Columns.Single(y => y.Name == column.Trim()));
 						}
 
+						if (reader.GetBoolean(2))
+						{
+							var isDescending = new bool[index.Columns.Count];
+							isDescending.AsSpan().Fill(true);
+							index.IsDescending = isDescending;
+						}
+
 						table.Indexes.Add(index);
 					}
 				}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbDatabaseCreator.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbDatabaseCreator.cs
index 5c233f90..c44bf21f 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbDatabaseCreator.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbDatabaseCreator.cs
@@ -22,6 +22,7 @@
 using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Infrastructure;
 using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
 using Microsoft.EntityFrameworkCore.Storage;
 
 namespace FirebirdSql.EntityFrameworkCore.Firebird.Storage.Internal;
@@ -163,4 +164,21 @@ IRelationalCommand CreateAlterCollationCommand(string collation)
 BEGIN
 	execute statement 'alter character set ' || (select coalesce(trim(rdb$character_set_name), 'NONE') from rdb$database) || ' set default collation {collation}';
 END");
+
+	public override void CreateTables()
+	{
+		// we need to execute commands separately to avoid issues with inserts and transactions after creating a table
+		foreach (var command in GetCreateTablesCommands())
+		{
+			Dependencies.MigrationCommandExecutor.ExecuteNonQuery([command], Dependencies.Connection, new MigrationExecutionState(), commitTransaction: true);
+		}
+	}
+	public override async Task CreateTablesAsync(CancellationToken cancellationToken = default)
+	{
+		// we need to execute commands separately to avoid issues with inserts and transactions after creating a table
+		foreach (var command in GetCreateTablesCommands())
+		{
+			await Dependencies.MigrationCommandExecutor.ExecuteNonQueryAsync([command], Dependencies.Connection, new MigrationExecutionState(), commitTransaction: true, cancellationToken: cancellationToken);
+		}
+	}
 }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbDateTimeTypeMapping.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbDateTimeTypeMapping.cs
index 86dad167..b9dc140d 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbDateTimeTypeMapping.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbDateTimeTypeMapping.cs
@@ -48,11 +48,11 @@ protected override string GenerateNonNullSqlLiteral(object value)
 		switch (_fbDbType)
 		{
 			case FbDbType.TimeStamp:
-				return $"CAST('{value:yyyy-MM-dd HH:mm:ss.ffff}' AS TIMESTAMP)";
+				return $"CAST('{value:yyyy-MM-dd HH\\:mm\\:ss.ffff}' AS TIMESTAMP)";
 			case FbDbType.Date:
 				return $"CAST('{value:yyyy-MM-dd}' AS DATE)";
 			case FbDbType.Time:
-				return $"CAST('{value:HH:mm:ss.ffff}' AS TIME)";
+				return $"CAST('{value:HH\\:mm\\:ss.ffff}' AS TIME)";
 			default:
 				throw new ArgumentOutOfRangeException(nameof(_fbDbType), $"{nameof(_fbDbType)}={_fbDbType}");
 		}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbSqlGenerationHelper.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbSqlGenerationHelper.cs
index 3aa22fc4..78bbff57 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbSqlGenerationHelper.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbSqlGenerationHelper.cs
@@ -27,11 +27,11 @@ public FbSqlGenerationHelper(RelationalSqlGenerationHelperDependencies dependenc
 		: base(dependencies)
 	{ }
 
-	public virtual string StringLiteralQueryType(string s)
+	public virtual string StringLiteralQueryType(string s, bool isUnicode = true)
 	{
 		var length = MinimumStringQueryTypeLength(s);
-		EnsureStringLiteralQueryTypeLength(length);
-		return $"VARCHAR({length}) CHARACTER SET UTF8";
+		var charset = isUnicode ? " CHARACTER SET UTF8" : string.Empty;
+		return $"VARCHAR({length}){charset}";
 	}
 
 	public virtual string StringParameterQueryType(bool isUnicode)
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTimeOnlyTypeMapping.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTimeOnlyTypeMapping.cs
index ee72312a..d9d4138a 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTimeOnlyTypeMapping.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTimeOnlyTypeMapping.cs
@@ -31,7 +31,7 @@ protected FbTimeOnlyTypeMapping(RelationalTypeMappingParameters parameters)
 
 	protected override string GenerateNonNullSqlLiteral(object value)
 	{
-		return $"CAST('{value:HH:mm:ss.ffff}' AS TIME)";
+		return $"CAST('{value:HH\\:mm\\:ss.ffff}' AS TIME)";
 	}
 
 	protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters)
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTimeSpanTypeMapping.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTimeSpanTypeMapping.cs
index 35c4a459..0dac60af 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTimeSpanTypeMapping.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTimeSpanTypeMapping.cs
@@ -48,7 +48,7 @@ protected override string GenerateNonNullSqlLiteral(object value)
 		switch (_fbDbType)
 		{
 			case FbDbType.Time:
-				return $"CAST('{value:hh\\:mm\\:ss\\.ffff}' AS TIME)";
+				return $"CAST('{value:hh\\:mm\\:ss.ffff}' AS TIME)";
 			default:
 				throw new ArgumentOutOfRangeException(nameof(_fbDbType), $"{nameof(_fbDbType)}={_fbDbType}");
 		}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTypeMappingSource.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTypeMappingSource.cs
index e4d85de9..9e41a9ef 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTypeMappingSource.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/FbTypeMappingSource.cs
@@ -168,7 +168,7 @@ RelationalTypeMapping FindRawMapping(RelationalTypeMappingInfo mappingInfo)
 				var size = mappingInfo.Size ?? (mappingInfo.IsKeyOrIndex ? 256 : (int?)null);
 				var maxSize = isUnicode ? UnicodeVarcharMaxSize : VarcharMaxSize;
 
-				if (size > maxSize)
+				if (size < 0 || size > maxSize)
 				{
 					size = isFixedLength ? maxSize : (int?)null;
 				}
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/IFbSqlGenerationHelper.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/IFbSqlGenerationHelper.cs
index 149cb2a9..56c4c1f5 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/IFbSqlGenerationHelper.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/Storage/Internal/IFbSqlGenerationHelper.cs
@@ -22,7 +22,7 @@ namespace FirebirdSql.EntityFrameworkCore.Firebird.Storage.Internal;
 
 public interface IFbSqlGenerationHelper : ISqlGenerationHelper
 {
-	string StringLiteralQueryType(string s);
+	string StringLiteralQueryType(string s, bool isUnicode);
 	string StringParameterQueryType(bool isUnicode);
 	void GenerateBlockParameterName(StringBuilder builder, string name);
 	string AlternativeStatementTerminator { get; }
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/ValueGeneration/Internal/FbValueGeneratorCache.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/ValueGeneration/Internal/FbValueGeneratorCache.cs
index 1eb45a3a..7c713751 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/ValueGeneration/Internal/FbValueGeneratorCache.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/ValueGeneration/Internal/FbValueGeneratorCache.cs
@@ -33,7 +33,7 @@ public FbValueGeneratorCache(ValueGeneratorCacheDependencies dependencies)
 
 	public virtual FbSequenceValueGeneratorState GetOrAddSequenceState(IProperty property, IRelationalConnection connection)
 	{
-		var tableIdentifier = StoreObjectIdentifier.Create(property.DeclaringEntityType, StoreObjectType.Table);
+		var tableIdentifier = StoreObjectIdentifier.Create(property.DeclaringType, StoreObjectType.Table);
 		var sequence = tableIdentifier != null
 			? property.FindHiLoSequence(tableIdentifier.Value)
 			: property.FindHiLoSequence();
diff --git a/src/FirebirdSql.EntityFrameworkCore.Firebird/ValueGeneration/Internal/FbValueGeneratorSelector.cs b/src/FirebirdSql.EntityFrameworkCore.Firebird/ValueGeneration/Internal/FbValueGeneratorSelector.cs
index 7f80548f..4e01ee43 100644
--- a/src/FirebirdSql.EntityFrameworkCore.Firebird/ValueGeneration/Internal/FbValueGeneratorSelector.cs
+++ b/src/FirebirdSql.EntityFrameworkCore.Firebird/ValueGeneration/Internal/FbValueGeneratorSelector.cs
@@ -44,17 +44,30 @@ public FbValueGeneratorSelector(ValueGeneratorSelectorDependencies dependencies,
 
 	public new virtual IFbValueGeneratorCache Cache => (IFbValueGeneratorCache)base.Cache;
 
-	public override ValueGenerator Select(IProperty property, IEntityType entityType)
+	[Obsolete("Use TrySelect and throw if needed when the generator is not found.")]
+	public override ValueGenerator Select(IProperty property, ITypeBase entityType)
+	{
+		if (TrySelect(property, entityType, out var generator))
+		{
+			return generator;
+		}
+
+		throw new ArgumentException(
+			CoreStrings.InvalidValueGeneratorFactoryProperty(
+				nameof(FbSequenceValueGeneratorFactory), property.Name, property.DeclaringType.DisplayName()));
+	}
+
+	public override bool TrySelect(IProperty property, ITypeBase entityType, out ValueGenerator valueGenerator)
 	{
 		if (property.GetValueGeneratorFactory() != null
 			|| property.GetValueGenerationStrategy() != FbValueGenerationStrategy.HiLo)
 		{
-			return base.Select(property, entityType);
+			return base.TrySelect(property, entityType, out valueGenerator);
 		}
 
 		var propertyType = property.ClrType.UnwrapNullableType().UnwrapEnumType();
 
-		var generator = _sequenceFactory.TryCreate(
+		valueGenerator = _sequenceFactory.TryCreate(
 			property,
 			propertyType,
 			Cache.GetOrAddSequenceState(property, _connection),
@@ -62,16 +75,16 @@ public override ValueGenerator Select(IProperty property, IEntityType entityType
 			_rawSqlCommandBuilder,
 			_commandLogger);
 
-		if (generator != null)
+		if (valueGenerator != null)
 		{
-			return generator;
+			return true;
 		}
 
 		var converter = property.GetTypeMapping().Converter;
 		if (converter != null
 			&& converter.ProviderClrType != propertyType)
 		{
-			generator = _sequenceFactory.TryCreate(
+			valueGenerator = _sequenceFactory.TryCreate(
 				property,
 				converter.ProviderClrType,
 				Cache.GetOrAddSequenceState(property, _connection),
@@ -79,18 +92,17 @@ public override ValueGenerator Select(IProperty property, IEntityType entityType
 				_rawSqlCommandBuilder,
 				_commandLogger);
 
-			if (generator != null)
+			if (valueGenerator != null)
 			{
-				return generator.WithConverter(converter);
+				valueGenerator = valueGenerator.WithConverter(converter);
+				return true;
 			}
 		}
 
-		throw new ArgumentException(
-			CoreStrings.InvalidValueGeneratorFactoryProperty(
-				nameof(FbSequenceValueGeneratorFactory), property.Name, property.DeclaringEntityType.DisplayName()));
+		return false;
 	}
 
-	protected override ValueGenerator FindForType(IProperty property, IEntityType entityType, Type clrType)
+	protected override ValueGenerator FindForType(IProperty property, ITypeBase entityType, Type clrType)
 		=> property.ClrType.UnwrapNullableType() == typeof(Guid)
 			? property.ValueGenerated == ValueGenerated.Never || property.GetDefaultValueSql() != null
 				? new TemporaryGuidValueGenerator()
diff --git a/src/NETProvider.sln b/src/NETProvider.sln
index c7e67410..6c41c6e3 100644
--- a/src/NETProvider.sln
+++ b/src/NETProvider.sln
@@ -27,6 +27,7 @@ EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C68C23A7-AACE-4335-88F8-1060EDAB2131}"
 	ProjectSection(SolutionItems) = preProject
 		Directory.Build.props = Directory.Build.props
+		Versions.props = Versions.props
 	EndProjectSection
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests", "FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests\FirebirdSql.EntityFrameworkCore.Firebird.FunctionalTests.csproj", "{2925DB97-5B39-4D9E-90CC-F7470F9AA8F3}"
@@ -39,7 +40,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Perf", "Perf", "{CE2BB2BB-4
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scratchpad", "Scratchpad", "{5F1D1BB9-4657-424C-B3DE-75818824940E}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Scratchpad", "Scratchpad\Scratchpad.csproj", "{C3F47B3D-FA1F-4665-A58D-63B6FFDCD65F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Scratchpad", "Scratchpad\Scratchpad.csproj", "{C3F47B3D-FA1F-4665-A58D-63B6FFDCD65F}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/src/Perf/Perf.csproj b/src/Perf/Perf.csproj
index 4f300758..f47a017c 100644
--- a/src/Perf/Perf.csproj
+++ b/src/Perf/Perf.csproj
@@ -1,11 +1,11 @@
 ﻿<Project Sdk="Microsoft.NET.Sdk">
 	<PropertyGroup>
 		<OutputType>Exe</OutputType>
-		<TargetFramework>net7.0</TargetFramework>
+		<TargetFramework>net9.0</TargetFramework>
 		<SkipSourceLink>true</SkipSourceLink>
 	</PropertyGroup>
 	<ItemGroup>
-		<PackageReference Include="BenchmarkDotNet" Version="0.13.2" />
+		<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/src/Scratchpad/Scratchpad.csproj b/src/Scratchpad/Scratchpad.csproj
index 03f5f17c..e6caecba 100644
--- a/src/Scratchpad/Scratchpad.csproj
+++ b/src/Scratchpad/Scratchpad.csproj
@@ -1,7 +1,7 @@
 ﻿<Project Sdk="Microsoft.NET.Sdk">
 	<PropertyGroup>
 		<OutputType>Exe</OutputType>
-		<TargetFramework>net7.0</TargetFramework>
+		<TargetFramework>net9.0</TargetFramework>
 		<SkipSourceLink>true</SkipSourceLink>
 		<SignAssembly>true</SignAssembly>
 		<AssemblyOriginatorKeyFile>..\FirebirdSql.Data.TestsBase\FirebirdSql.Data.TestsBase.snk</AssemblyOriginatorKeyFile>
diff --git a/src/Versions.props b/src/Versions.props
new file mode 100644
index 00000000..c05a921e
--- /dev/null
+++ b/src/Versions.props
@@ -0,0 +1,18 @@
+<Project>
+	<!-- Provider -->
+	<PropertyGroup>
+		<ProviderVersion>10.3.3</ProviderVersion>
+	</PropertyGroup>
+	<!-- EFCore -->
+	<PropertyGroup>
+		<EFCoreProviderVersion>12.0.0</EFCoreProviderVersion>
+		<EFCoreReferenceProviderVersion>10.3.2</EFCoreReferenceProviderVersion>
+		<EFCoreReferencePackageVersion>9.0.1</EFCoreReferencePackageVersion>
+	</PropertyGroup>
+	<!-- EF6 -->
+	<PropertyGroup>
+		<EF6ProviderVersion>10.1.0</EF6ProviderVersion>
+		<EF6ReferenceProviderVersion>10.3.2</EF6ReferenceProviderVersion>
+		<EF6ReferencePackageVersion>6.5.1</EF6ReferencePackageVersion>
+	</PropertyGroup>
+</Project>
diff --git a/tests.ps1 b/tests.ps1
index 391a9bee..49940f13 100644
--- a/tests.ps1
+++ b/tests.ps1
@@ -6,7 +6,6 @@ param(
 $ErrorActionPreference = 'Stop'
 $ProgressPreference = 'SilentlyContinue' # Faster downloads with Invoke-RestMethod -- https://stackoverflow.com/a/43477248/33244
 
-
 $baseDir = Split-Path -Parent $PSCommandPath
 
 . "$baseDir\include.ps1"
@@ -29,8 +28,9 @@ $FirebirdConfiguration = @{
 	}
 }
 
+$frameworkVersion = 'net9.0'
 $testsBaseDir = "$baseDir\src\FirebirdSql.Data.FirebirdClient.Tests"
-$testsProviderDir = "$testsBaseDir\bin\$Configuration\$(Get-UsedTargetFramework)"
+$testsProviderDir = "$testsBaseDir\bin\$Configuration\$frameworkVersion"
 
 $firebirdProcess = $null
 
@@ -131,7 +131,7 @@ function Tests-FirebirdClient($serverType, $compression, $wireCrypt) {
 }
 
 function Tests-EF6() {
-	pushd "$baseDir\src\EntityFramework.Firebird.Tests\bin\$Configuration\$(Get-UsedTargetFramework)"
+	pushd "$baseDir\src\EntityFramework.Firebird.Tests\bin\$Configuration\$frameworkVersion"
 	try {
 		.\EntityFramework.Firebird.Tests.exe --labels=All
 		Check-ExitCode
@@ -142,7 +142,7 @@ function Tests-EF6() {
 }
 
 function Tests-EFCore() {
-	pushd "$baseDir\src\FirebirdSql.EntityFrameworkCore.Firebird.Tests\bin\$Configuration\$(Get-UsedTargetFramework)"
+	pushd "$baseDir\src\FirebirdSql.EntityFrameworkCore.Firebird.Tests\bin\$Configuration\$frameworkVersion"
 	try {
 		.\FirebirdSql.EntityFrameworkCore.Firebird.Tests.exe --labels=All
 		Check-ExitCode
