diff --git a/build-common/nhibernate-properties.xml b/build-common/nhibernate-properties.xml
index 4b62e992a55..d01178e24d1 100644
--- a/build-common/nhibernate-properties.xml
+++ b/build-common/nhibernate-properties.xml
@@ -2,6 +2,6 @@
 
 	
 	
-	
+	
 	
 
diff --git a/build-common/teamcity-hibernate.cfg.xml b/build-common/teamcity-hibernate.cfg.xml
index e8cb7f7e6dd..31ec67dcee9 100644
--- a/build-common/teamcity-hibernate.cfg.xml
+++ b/build-common/teamcity-hibernate.cfg.xml
@@ -15,7 +15,7 @@
 			true
 
 			
-			NHibernate.Driver.Sql2008ClientDriver
+			NHibernate.Driver.SqlServer2008Driver, NHibernate.Driver.SqlServer
 			NHibernate.Dialect.MsSql2008Dialect
 			Server=.\SQLExpress;initial catalog=nhibernate;Integrated Security=SSPI
 			false
diff --git a/default.build b/default.build
index 8201995f47a..21f4379fd95 100644
--- a/default.build
+++ b/default.build
@@ -223,6 +223,7 @@
 		
 		
 		
+		
 		
 		
 		
@@ -254,6 +255,41 @@
 				
 			
 		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
 		
 		
 		
diff --git a/doc/reference/modules/configuration.xml b/doc/reference/modules/configuration.xml
index 5c2e4024d74..c0e6d9a932d 100644
--- a/doc/reference/modules/configuration.xml
+++ b/doc/reference/modules/configuration.xml
@@ -227,6 +227,13 @@ var session = sessions.OpenSession(conn);
                         take care of setting the IDriver using a sensible default.  See the API
                         documentation of the specific dialect for the defaults.
                     
+                    
+                        Since NHibernate v5.1, drivers having a NuGet package for their data provider have a
+                        NHibernate.Driver dedicated assembly, which have to be referenced by your project.
+                        Those assemblies are also available as NuGet packages.
+                        If an obsolete driver is configured, NHibernate will issue a warning log when building the session
+                        factory.
+                    
                 
             
             
@@ -1186,9 +1193,13 @@ in the parameter binding.
                             Firebird
                             NHibernate.Dialect.FirebirdDialect
                             
-                                Set driver_class to
-                                NHibernate.Driver.FirebirdClientDriver
-                                for Firebird ADO.NET provider 2.0.
+                                Install NuGet package 
+                                NHibernate.Driver.Firebird
+                                and set driver_class to
+                                NHibernate.Driver.FirebirdDriver, NHibernate.Driver.Firebird
+                                with a fallback on the built-in reflection based
+                                NHibernate.Driver.FirebirdClientDriver.
+                                Both use Firebird ADO.NET provider.
                             
                         
                         
@@ -1219,65 +1230,99 @@ in the parameter binding.
                         
                             Microsoft SQL Server 7
                             NHibernate.Dialect.MsSql7Dialect
-                            
+                            Use the same default driver as NHibernate.Dialect.MsSql2000Dialect.
                         
                         
                             Microsoft SQL Server 2000
                             NHibernate.Dialect.MsSql2000Dialect
-                            
+                            
+                                Install NuGet package 
+                                NHibernate.Driver.SqlServer
+                                and set driver_class to
+                                NHibernate.Driver.SqlServer2000Driver, NHibernate.Driver.SqlServer
+                                with a fallback on the built-in reflection based
+                                NHibernate.Driver.SqlClientDriver.
+                                Both use System.Data.SqlClient.
+                            
                         
                         
                             Microsoft SQL Server 2005
                             NHibernate.Dialect.MsSql2005Dialect
-                            
+                            Use the same default driver as NHibernate.Dialect.MsSql2000Dialect.
                         
                         
                             Microsoft SQL Server 2008
                             NHibernate.Dialect.MsSql2008Dialect
-                            
+                            
+                                Install NuGet package 
+                                NHibernate.Driver.SqlServer
+                                and set driver_class to
+                                NHibernate.Driver.SqlServer2008Driver, NHibernate.Driver.SqlServer
+                                with a fallback on the built-in reflection based
+                                NHibernate.Driver.Sql2008ClientDriver.
+                                Both use System.Data.SqlClient.
+                            
                         
                         
                             Microsoft SQL Azure Server 2008
                             NHibernate.Dialect.MsSqlAzure2008Dialect
-                            
+                            Use the same default driver as NHibernate.Dialect.MsSql2008Dialect.
                         
                         
                             Microsoft SQL Server 2012
                             NHibernate.Dialect.MsSql2012Dialect
-                            
+                            Use the same default driver as NHibernate.Dialect.MsSql2008Dialect.
                         
                         
                             Microsoft SQL Server Compact Edition
                             NHibernate.Dialect.MsSqlCeDialect
+                            
+                                Install NuGet package 
+                                NHibernate.Driver.SqlServer.Compact
+                                and set driver_class to
+                                NHibernate.Driver.SqlServerCompactDriver, NHibernate.Driver.SqlServer.Compact
+                                with a fallback on the built-in reflection based
+                                NHibernate.Driver.SqlServerCeDriver.
+                                Both use System.Data.SqlServerCe.
+                            
                         
                         
                             Microsoft SQL Server Compact Edition 4.0
                             NHibernate.Dialect.MsSqlCe40Dialect
+                            Use the same default driver as NHibernate.Dialect.MsSqlCeDialect.
                         
                         
-                            MySQL 3 or 4 
+                            MySQL 3 or 4
                             NHibernate.Dialect.MySQLDialect
-                            
+                            
+                                Install NuGet package 
+                                NHibernate.Driver.MySql
+                                and set driver_class to
+                                NHibernate.Driver.MySqlDriver, NHibernate.Driver.MySql
+                                with a fallback on the built-in reflection based
+                                NHibernate.Driver.MySqlDataDriver.
+                                Both use MySql.Data.
+                            
                         
                         
                             MySQL 5
                             NHibernate.Dialect.MySQL5Dialect
-                            
+                            Use the same default driver as NHibernate.Dialect.MySQLDialect.
                         
                         
                             MySQL 5 Inno DB
                             NHibernate.Dialect.MySQL5InnoDBDialect
-                            
+                            Use the same default driver as NHibernate.Dialect.MySQLDialect.
                         
                         
                             MySQL 5.5
                             NHibernate.Dialect.MySQL55Dialect
-                            
+                            Use the same default driver as NHibernate.Dialect.MySQLDialect.
                         
                         
                             MySQL 5.5 Inno DB
                             NHibernate.Dialect.MySQL55InnoDBDialect
-                            
+                            Use the same default driver as NHibernate.Dialect.MySQLDialect.
                         
                         
                             Oracle 
@@ -1299,15 +1344,17 @@ in the parameter binding.
                             NHibernate.Dialect.Oracle12cDialect
                             
                         
-                        
-                            PostgreSQL
-                            NHibernate.Dialect.PostgreSQLDialect
-                            
-                        
                         
                             PostgreSQL
                             NHibernate.Dialect.PostgreSQLDialect
                             
+                                Install NuGet package 
+                                NHibernate.Driver.PostgreSql
+                                and set driver_class to
+                                NHibernate.Driver.PostgreSqlDriver, NHibernate.Driver.PostgreSql
+                                with a fallback on the built-in reflection based
+                                NHibernate.Driver.NpgsqlDriver.
+                                Both use Npgsql.
                             
                         
                         
@@ -1316,6 +1363,7 @@ in the parameter binding.
                             
                                 This dialect supports FOR UPDATE NOWAIT
                                 available in PostgreSQL 8.1.
+                                Use the same default driver as NHibernate.Dialect.PostgreSQLDialect.
                             
                         
                         
@@ -1325,6 +1373,7 @@ in the parameter binding.
                                 This dialect supports IF EXISTS keyword in
                                 DROP TABLE and DROP SEQUENCE
                                 available in PostgreSQL 8.2.
+                                Use the same default driver as NHibernate.Dialect.PostgreSQLDialect.
                             
                         
                         
@@ -1332,15 +1381,20 @@ in the parameter binding.
                             NHibernate.Dialect.PostgreSQL83Dialect
                             
                                 This dialect supports XML type.
+                                Use the same default driver as NHibernate.Dialect.PostgreSQLDialect.
                             
                         
                         
                             SQLite
                             NHibernate.Dialect.SQLiteDialect
                             
-                                Set driver_class to
-                                NHibernate.Driver.SQLite20Driver
-                                for System.Data.SQLite provider for .NET 2.0.
+                                Install NuGet package 
+                                NHibernate.Driver.SQLite
+                                and set driver_class to
+                                NHibernate.Driver.SQLiteDriver, NHibernate.Driver.SQLite
+                                with a fallback on the built-in reflection based
+                                NHibernate.Driver.SQLite20Driver.
+                                Both use System.Data.SQLite.
                                 
                                     Due to
                                     the
diff --git a/psake.ps1 b/psake.ps1
index e9cd52d7081..5864d9f2e4d 100644
--- a/psake.ps1
+++ b/psake.ps1
@@ -11,12 +11,12 @@ Task Set-Configuration {
     $allSettings = @{
         'Firebird' = @{
             'connection.connection_string' = 'DataSource=localhost;Database=nhibernate;User ID=SYSDBA;Password=masterkey;MaxPoolSize=200;';
-            'connection.driver_class' = 'NHibernate.Driver.FirebirdClientDriver';
+            'connection.driver_class' = 'NHibernate.Driver.FirebirdDriver, NHibernate.Driver.Firebird';
             'dialect' = 'NHibernate.Dialect.FirebirdDialect'
         };
         'MySQL' = @{
             'connection.connection_string' = 'Server=127.0.0.1;Uid=root;Pwd=Password12!;Database=nhibernate;Old Guids=True;';
-            'connection.driver_class' = 'NHibernate.Driver.MySqlDataDriver';
+            'connection.driver_class' = 'NHibernate.Driver.MySqlDriver, NHibernate.Driver.MySql';
             'dialect' = 'NHibernate.Dialect.MySQL5Dialect'
         };
         'Odbc' = @{
@@ -35,7 +35,7 @@ Task Set-Configuration {
         };
         'PostgreSQL' = @{
             'connection.connection_string' = 'Host=localhost;Port=5432;Username=postgres;Password=Password12!;Database=nhibernate;Enlist=true';
-            'connection.driver_class' = 'NHibernate.Driver.NpgsqlDriver';
+            'connection.driver_class' = 'NHibernate.Driver.PostgreSqlDriver, NHibernate.Driver.PostgreSql';
             'dialect' = 'NHibernate.Dialect.PostgreSQL83Dialect'
         };
         'SQLite' = @{
@@ -46,13 +46,13 @@ Task Set-Configuration {
                 and https://github.com/nhibernate/nhibernate-core/issues/1362 #>
             # Please note the connection string is formated for putting the db file in $configDir.
             'connection.connection_string' = "Data Source=$configDir/NHibernate.db;DateTimeFormatString=yyyy-MM-dd HH:mm:ss.FFFFFFF;";
-            'connection.driver_class' = 'NHibernate.Driver.SQLite20Driver';
+            'connection.driver_class' = 'NHibernate.Driver.SQLiteDriver, NHibernate.Driver.SQLite';
             'dialect' = 'NHibernate.Dialect.SQLiteDialect'
         };
         'SqlServerCe' = @{
             # Please note the connection string is formated for putting the db file in $configDir.
             'connection.connection_string' = "Data Source=$configDir/NHibernate.sdf;";
-            'connection.driver_class' = 'NHibernate.Driver.SqlServerCeDriver';
+            'connection.driver_class' = 'NHibernate.Driver.SqlServerCompactDriver, NHibernate.Driver.SqlServer.Compact';
             'command_timeout' = '0';
             'dialect' = 'NHibernate.Dialect.MsSqlCe40Dialect'
         };
@@ -102,15 +102,15 @@ Task Build {
     }
 }
 
-Task Test -depends Build {
+Task Test {
     @(
         'NHibernate.TestDatabaseSetup',
         'NHibernate.Test',
         'NHibernate.Test.VisualBasic'
     ) | ForEach-Object { 
-        $assembly = [IO.Path]::Combine("src", $_, "bin", "Release", "netcoreapp2.0", "$_.dll")
+        $project = [IO.Path]::Combine("src", $_)
         Exec {
-            dotnet $assembly --labels=before --nocolor "--result=$_-TestResult.xml"
+            dotnet run -f netcoreapp2.0 -c Release -p $project -- --labels=before --nocolor "--result=$_-TestResult.xml"
         }
     }
 }
\ No newline at end of file
diff --git a/src/NHibernate.Config.Templates/FireBird.cfg.xml b/src/NHibernate.Config.Templates/FireBird.cfg.xml
index 9e3c8e42992..82c4f81e603 100644
--- a/src/NHibernate.Config.Templates/FireBird.cfg.xml
+++ b/src/NHibernate.Config.Templates/FireBird.cfg.xml
@@ -16,7 +16,7 @@ for your own use before compile tests in VisualStudio.
 -->
 
 	
-		NHibernate.Driver.FirebirdClientDriver
+		NHibernate.Driver.FirebirdDriver, NHibernate.Driver.Firebird
 		
 			DataSource=localhost;
 			Database=nhibernate;
diff --git a/src/NHibernate.Config.Templates/MSSQL.cfg.xml b/src/NHibernate.Config.Templates/MSSQL.cfg.xml
index 8e5706a5c56..4aea9caec11 100644
--- a/src/NHibernate.Config.Templates/MSSQL.cfg.xml
+++ b/src/NHibernate.Config.Templates/MSSQL.cfg.xml
@@ -7,7 +7,7 @@ for your own use before compile tests in VisualStudio.
 
 
 	
-		NHibernate.Driver.Sql2008ClientDriver
+		NHibernate.Driver.SqlServer2008Driver, NHibernate.Driver.SqlServer
 		
 			Server=(local);initial catalog=nhibernate;Integrated Security=SSPI
 		
diff --git a/src/NHibernate.Config.Templates/MySql.cfg.xml b/src/NHibernate.Config.Templates/MySql.cfg.xml
index be2366cd660..ef246809489 100644
--- a/src/NHibernate.Config.Templates/MySql.cfg.xml
+++ b/src/NHibernate.Config.Templates/MySql.cfg.xml
@@ -6,11 +6,11 @@ for your own use before compile tests in VisualStudio.
 -->
 
 	
-		NHibernate.Driver.MySqlDataDriver
+		NHibernate.Driver.MySqlDriver, NHibernate.Driver.MySql
 		
 			Database=nhibernate;Data Source=localhost;User Id=nhibernate;Password=;
 			Protocol=memory;Old Guids=True;
 		
 		NHibernate.Dialect.MySQL5Dialect
 	
-
\ No newline at end of file
+
diff --git a/src/NHibernate.Config.Templates/Oracle-Managed.cfg.xml b/src/NHibernate.Config.Templates/Oracle-Managed.cfg.xml
index efa6b51a596..44b2e57287b 100644
--- a/src/NHibernate.Config.Templates/Oracle-Managed.cfg.xml
+++ b/src/NHibernate.Config.Templates/Oracle-Managed.cfg.xml
@@ -7,7 +7,7 @@ for your own use before compile tests in VisualStudio.
 
 
 	
-		NHibernate.Driver.OracleManagedDataClientDriver
+		NHibernate.Driver.OracleManagedDriver, NHibernate.Driver.Oracle.Managed
 		
 			User ID=nhibernate;Password=nhibernate;Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL)))
 		
diff --git a/src/NHibernate.Config.Templates/PostgreSQL.cfg.xml b/src/NHibernate.Config.Templates/PostgreSQL.cfg.xml
index 459543f2bbf..219fbbcc6be 100644
--- a/src/NHibernate.Config.Templates/PostgreSQL.cfg.xml
+++ b/src/NHibernate.Config.Templates/PostgreSQL.cfg.xml
@@ -6,7 +6,7 @@ for your own use before compile tests in VisualStudio.
 -->
 
 	
-		NHibernate.Driver.NpgsqlDriver
+		NHibernate.Driver.PostgreSqlDriver, NHibernate.Driver.PostgreSql
 		
 			Server=localhost;Database=nhibernate;User ID=nhibernate;Password=nhibernate;Enlist=true;
 		
diff --git a/src/NHibernate.Config.Templates/SQLite.cfg.xml b/src/NHibernate.Config.Templates/SQLite.cfg.xml
index 50890aea597..559f9312d7e 100644
--- a/src/NHibernate.Config.Templates/SQLite.cfg.xml
+++ b/src/NHibernate.Config.Templates/SQLite.cfg.xml
@@ -6,7 +6,7 @@ for your own use before compile tests in VisualStudio.
 -->
 
 	
-		NHibernate.Driver.SQLite20Driver
+		NHibernate.Driver.SQLiteDriver, NHibernate.Driver.SQLite
 		
+  
+    
+      false
+      %(RecursiveDir)%(Filename)%(Extension)
+      PreserveNewest
+    
+  
+
+  
+    
+  
+
+  
+    
+      NHibernate.license.txt
+    
+  
+
+
diff --git a/src/NHibernate.Driver.SQLite/Properties/AssemblyInfo.cs b/src/NHibernate.Driver.SQLite/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000000..71b3de6ca17
--- /dev/null
+++ b/src/NHibernate.Driver.SQLite/Properties/AssemblyInfo.cs
@@ -0,0 +1,8 @@
+using System;
+using System.Reflection;
+using System.Security;
+
+[assembly: CLSCompliantAttribute(true)]
+[assembly: AssemblyDelaySignAttribute(false)]
+[assembly: AllowPartiallyTrustedCallersAttribute()]
+[assembly: SecurityRulesAttribute(SecurityRuleSet.Level1)]
diff --git a/src/NHibernate.Driver.SqlServer.Compact/.gitignore b/src/NHibernate.Driver.SqlServer.Compact/.gitignore
new file mode 100644
index 00000000000..c3106783d7c
--- /dev/null
+++ b/src/NHibernate.Driver.SqlServer.Compact/.gitignore
@@ -0,0 +1 @@
+!build/
\ No newline at end of file
diff --git a/src/NHibernate.Driver.SqlServer.Compact/Cfg/ConnectionConfigurationExtensionSqlServerCompact.cs b/src/NHibernate.Driver.SqlServer.Compact/Cfg/ConnectionConfigurationExtensionSqlServerCompact.cs
new file mode 100644
index 00000000000..cc144b3c044
--- /dev/null
+++ b/src/NHibernate.Driver.SqlServer.Compact/Cfg/ConnectionConfigurationExtensionSqlServerCompact.cs
@@ -0,0 +1,18 @@
+using NHibernate.Cfg.Loquacious;
+using NHibernate.Driver;
+
+namespace NHibernate.Cfg
+{
+	public static class ConnectionConfigurationExtensionSqlServerCompact
+	{
+		public static IConnectionConfiguration BySqlServerCompactDriver(this IConnectionConfiguration cfg)
+		{
+			return cfg.By();
+		}
+
+		public static void SqlServerCompactDriver(this IDbIntegrationConfigurationProperties cfg)
+		{
+			cfg.Driver();
+		}
+	}
+}
diff --git a/src/NHibernate.Driver.SqlServer.Compact/NHibernate.Driver.SqlServer.Compact.csproj b/src/NHibernate.Driver.SqlServer.Compact/NHibernate.Driver.SqlServer.Compact.csproj
new file mode 100644
index 00000000000..52a61456f4a
--- /dev/null
+++ b/src/NHibernate.Driver.SqlServer.Compact/NHibernate.Driver.SqlServer.Compact.csproj
@@ -0,0 +1,71 @@
+
+  
+
+  
+    Driver for SQL Server Compact 4.0 to be used with NHibernate 5.
+    NHibernate; Driver; SQL; Compact; ADO.Net
+
+    net461
+    $(NoWarn);3001;3002;3003;3005;1591
+    True
+    true
+    ..\NHibernate.snk
+    true
+    True
+    
+
+    true
+  
+  
+  
+    NETFX;$(DefineConstants)
+  
+
+  
+    $(DefineConstants);DRIVER_PACKAGE
+    NHibernate
+  
+
+  
+    
+  
+
+  
+    
+  
+
+  
+    
+  
+
+  
+    
+  
+
+  
+  
+    
+      true
+      build\
+    
+  
+
+  
+  
+    
+      false
+      %(RecursiveDir)%(Filename)%(Extension)
+      PreserveNewest
+    
+  
+
+  
+    
+      NHibernate.license.txt
+    
+  
+
+
diff --git a/src/NHibernate.Driver.SqlServer.Compact/Properties/AssemblyInfo.cs b/src/NHibernate.Driver.SqlServer.Compact/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000000..71b3de6ca17
--- /dev/null
+++ b/src/NHibernate.Driver.SqlServer.Compact/Properties/AssemblyInfo.cs
@@ -0,0 +1,8 @@
+using System;
+using System.Reflection;
+using System.Security;
+
+[assembly: CLSCompliantAttribute(true)]
+[assembly: AssemblyDelaySignAttribute(false)]
+[assembly: AllowPartiallyTrustedCallersAttribute()]
+[assembly: SecurityRulesAttribute(SecurityRuleSet.Level1)]
diff --git a/src/NHibernate.Driver.SqlServer.Compact/build/NHibernate.Driver.SqlServer.Compact.targets b/src/NHibernate.Driver.SqlServer.Compact/build/NHibernate.Driver.SqlServer.Compact.targets
new file mode 100644
index 00000000000..1bafcf18130
--- /dev/null
+++ b/src/NHibernate.Driver.SqlServer.Compact/build/NHibernate.Driver.SqlServer.Compact.targets
@@ -0,0 +1,22 @@
+
+
+
+  
+    
+      
+      
+        %(RecursiveDir)%(Filename)%(Extension)
+        PreserveNewest
+        false
+      
+    
+  
+  
+    $(ResolveAssemblyReferencesDependsOn);InjectReference_eb5aa2e4-6c92-4a75-85b8-1348b65397d1
+  
+
\ No newline at end of file
diff --git a/src/NHibernate.Driver.SqlServer/Cfg/ConnectionConfigurationExtensionSqlServer.cs b/src/NHibernate.Driver.SqlServer/Cfg/ConnectionConfigurationExtensionSqlServer.cs
new file mode 100644
index 00000000000..b49c46e79a2
--- /dev/null
+++ b/src/NHibernate.Driver.SqlServer/Cfg/ConnectionConfigurationExtensionSqlServer.cs
@@ -0,0 +1,28 @@
+using NHibernate.Cfg.Loquacious;
+using NHibernate.Driver;
+
+namespace NHibernate.Cfg
+{
+	public static class ConnectionConfigurationExtensionSqlServer
+	{
+		public static IConnectionConfiguration BySqlServer2000Driver(this IConnectionConfiguration cfg)
+		{
+			return cfg.By();
+		}
+
+		public static void SqlServer2000Driver(this IDbIntegrationConfigurationProperties cfg)
+		{
+			cfg.Driver();
+		}
+
+		public static IConnectionConfiguration BySqlServer2008Driver(this IConnectionConfiguration cfg)
+		{
+			return cfg.By();
+		}
+
+		public static void SqlServer2008Driver(this IDbIntegrationConfigurationProperties cfg)
+		{
+			cfg.Driver();
+		}
+	}
+}
diff --git a/src/NHibernate.Driver.SqlServer/NHibernate.Driver.SqlServer.csproj b/src/NHibernate.Driver.SqlServer/NHibernate.Driver.SqlServer.csproj
new file mode 100644
index 00000000000..11a89607b2e
--- /dev/null
+++ b/src/NHibernate.Driver.SqlServer/NHibernate.Driver.SqlServer.csproj
@@ -0,0 +1,52 @@
+
+  
+
+  
+    Driver for Microsoft SQL Server to be used with NHibernate 5.
+    NHibernate; Driver; SqlClient; SqlServer; SQL Server; ADO.Net; Core
+
+    netstandard2.0;net461
+    $(NoWarn);3001;3002;3003;3005;1591
+    True
+    true
+    ..\NHibernate.snk
+    true
+    True
+    
+
+    true
+  
+  
+  
+    NETFX;$(DefineConstants)
+  
+
+  
+    $(DefineConstants);DRIVER_PACKAGE
+    NHibernate
+  
+
+  
+    
+    
+  
+
+  
+    
+  
+
+  
+    
+  
+
+  
+    
+  
+
+  
+    
+      NHibernate.license.txt
+    
+  
+
+
diff --git a/src/NHibernate.Driver.SqlServer/Properties/AssemblyInfo.cs b/src/NHibernate.Driver.SqlServer/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000000..71b3de6ca17
--- /dev/null
+++ b/src/NHibernate.Driver.SqlServer/Properties/AssemblyInfo.cs
@@ -0,0 +1,8 @@
+using System;
+using System.Reflection;
+using System.Security;
+
+[assembly: CLSCompliantAttribute(true)]
+[assembly: AssemblyDelaySignAttribute(false)]
+[assembly: AllowPartiallyTrustedCallersAttribute()]
+[assembly: SecurityRulesAttribute(SecurityRuleSet.Level1)]
diff --git a/src/NHibernate.Everything.sln b/src/NHibernate.Everything.sln
index c2c257360fc..867db2fedd8 100644
--- a/src/NHibernate.Everything.sln
+++ b/src/NHibernate.Everything.sln
@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.26730.12
+VisualStudioVersion = 15.0.27004.2010
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Support", "Support", "{9BDB5C84-14EC-4384-B423-9E319675B3CA}"
 	ProjectSection(SolutionItems) = preProject
@@ -70,6 +70,22 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Tool.HbmXsd", "N
 EndProject
 Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "NHibernate.Test.VisualBasic", "NHibernate.Test.VisualBasic\NHibernate.Test.VisualBasic.vbproj", "{7C2EF610-BCA0-4D1F-898A-DE9908E4970C}"
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Drivers", "Drivers", "{A47739AF-6D04-45AA-B688-4E39CDE48FFD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.Firebird", "NHibernate.Driver.Firebird\NHibernate.Driver.Firebird.csproj", "{DADD54C1-3679-4672-9774-9362428EB9E0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.MySql", "NHibernate.Driver.MySql\NHibernate.Driver.MySql.csproj", "{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.PostgreSql", "NHibernate.Driver.PostgreSql\NHibernate.Driver.PostgreSql.csproj", "{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.Oracle.Managed", "NHibernate.Driver.Oracle.Managed\NHibernate.Driver.Oracle.Managed.csproj", "{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.SQLite", "NHibernate.Driver.SQLite\NHibernate.Driver.SQLite.csproj", "{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.SqlServer", "NHibernate.Driver.SqlServer\NHibernate.Driver.SqlServer.csproj", "{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.SqlServer.Compact", "NHibernate.Driver.SqlServer.Compact\NHibernate.Driver.SqlServer.Compact.csproj", "{11B3C504-D501-4766-AC36-0CF1A813815B}"
+EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Example.Web", "NHibernate.Example.Web\NHibernate.Example.Web.csproj", "{B291C1C1-599B-418E-8591-8A8CF1CAA188}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.TestDatabaseSetup", "NHibernate.TestDatabaseSetup\NHibernate.TestDatabaseSetup.csproj", "{783DB85E-2EED-4377-8EF4-8D6EFE042007}"
@@ -133,6 +149,90 @@ Global
 		{7C2EF610-BCA0-4D1F-898A-DE9908E4970C}.Release|Any CPU.Build.0 = Release|Any CPU
 		{7C2EF610-BCA0-4D1F-898A-DE9908E4970C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
 		{7C2EF610-BCA0-4D1F-898A-DE9908E4970C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Debug|.NET.Build.0 = Debug|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Release|.NET.ActiveCfg = Release|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Release|.NET.Build.0 = Release|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Debug|.NET.Build.0 = Debug|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Release|.NET.ActiveCfg = Release|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Release|.NET.Build.0 = Release|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Debug|.NET.Build.0 = Debug|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Release|.NET.ActiveCfg = Release|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Release|.NET.Build.0 = Release|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Debug|.NET.Build.0 = Debug|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Release|.NET.ActiveCfg = Release|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Release|.NET.Build.0 = Release|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Debug|.NET.Build.0 = Debug|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Release|.NET.ActiveCfg = Release|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Release|.NET.Build.0 = Release|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Release|Any CPU.Build.0 = Release|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Debug|.NET.Build.0 = Debug|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Release|.NET.ActiveCfg = Release|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Release|.NET.Build.0 = Release|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Debug|.NET.Build.0 = Debug|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Release|.NET.ActiveCfg = Release|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Release|.NET.Build.0 = Release|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
 		{B291C1C1-599B-418E-8591-8A8CF1CAA188}.Debug|.NET.ActiveCfg = Debug|Any CPU
 		{B291C1C1-599B-418E-8591-8A8CF1CAA188}.Debug|.NET.Build.0 = Debug|Any CPU
 		{B291C1C1-599B-418E-8591-8A8CF1CAA188}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -172,6 +272,14 @@ Global
 		{7AEE5B37-C552-4E59-9B6F-88755BCB5070} = {094F74CD-2DD7-496F-BC48-A6D357BF33FD}
 		{446E148D-A9D5-4D7D-A706-BEDD45B2BC7D} = {92509065-DAEA-4457-8300-C7B64CD0E9F4}
 		{7C2EF610-BCA0-4D1F-898A-DE9908E4970C} = {094F74CD-2DD7-496F-BC48-A6D357BF33FD}
+		{A47739AF-6D04-45AA-B688-4E39CDE48FFD} = {28EA2C84-8295-49ED-BC67-803B7778513E}
+		{DADD54C1-3679-4672-9774-9362428EB9E0} = {A47739AF-6D04-45AA-B688-4E39CDE48FFD}
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8} = {A47739AF-6D04-45AA-B688-4E39CDE48FFD}
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C} = {A47739AF-6D04-45AA-B688-4E39CDE48FFD}
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2} = {A47739AF-6D04-45AA-B688-4E39CDE48FFD}
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862} = {A47739AF-6D04-45AA-B688-4E39CDE48FFD}
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39} = {A47739AF-6D04-45AA-B688-4E39CDE48FFD}
+		{11B3C504-D501-4766-AC36-0CF1A813815B} = {A47739AF-6D04-45AA-B688-4E39CDE48FFD}
 		{783DB85E-2EED-4377-8EF4-8D6EFE042007} = {094F74CD-2DD7-496F-BC48-A6D357BF33FD}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
diff --git a/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs b/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs
index 38265648eda..f783e670153 100644
--- a/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs
+++ b/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs
@@ -24,7 +24,7 @@ public AppSessionFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFacto
 				{
 					db.ConnectionString = @"Server=(local)\SQLEXPRESS;initial catalog=nhibernate;Integrated Security=true";
 					db.Dialect();
-					db.Driver();
+					db.SqlServer2008Driver();
 				})
 				.AddMapping(domainMapping);
 			Configuration.SessionFactory().GenerateStatistics();
diff --git a/src/NHibernate.Example.Web/NHibernate.Example.Web.csproj b/src/NHibernate.Example.Web/NHibernate.Example.Web.csproj
index 98f7c8bdf68..04fcbb41fd4 100644
--- a/src/NHibernate.Example.Web/NHibernate.Example.Web.csproj
+++ b/src/NHibernate.Example.Web/NHibernate.Example.Web.csproj
@@ -29,6 +29,7 @@
   
 
   
+    
     
   
 
diff --git a/src/NHibernate.Test/App.config b/src/NHibernate.Test/App.config
index d3965012af5..e81be0b5a1d 100644
--- a/src/NHibernate.Test/App.config
+++ b/src/NHibernate.Test/App.config
@@ -30,7 +30,7 @@
 			
 			NHibernate.Dialect.MsSql2008Dialect
 
-			NHibernate.Driver.Sql2008ClientDriver 
+			NHibernate.Driver.SqlServer2008Driver, NHibernate.Driver.SqlServer 
 			Server=localhost\sqlexpress;Database=nhibernate;Integrated Security=SSPI
 			NHibernate.Test.DebugConnectionProvider, NHibernate.Test
 			ReadCommitted 
diff --git a/src/NHibernate.Test/Async/CfgTest/ConfigurationFixture.cs b/src/NHibernate.Test/Async/CfgTest/ConfigurationFixture.cs
index 9855db73094..8a4e813eab4 100644
--- a/src/NHibernate.Test/Async/CfgTest/ConfigurationFixture.cs
+++ b/src/NHibernate.Test/Async/CfgTest/ConfigurationFixture.cs
@@ -44,7 +44,7 @@ public async Task ManualConfigurationAsync()
 
 			props[Environment.ConnectionProvider] = "NHibernate.Connection.DriverConnectionProvider";
 			props[Environment.Dialect] = "NHibernate.Dialect.MsSql2000Dialect";
-			props[Environment.ConnectionDriver] = "NHibernate.Driver.SqlClientDriver";
+			props[Environment.ConnectionDriver] = "NHibernate.Driver.SqlServer2000Driver, NHibernate.Driver.SqlServer";
 			props[Environment.ConnectionString] =
 				"Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI";
 
diff --git a/src/NHibernate.Test/Async/DriverTest/FirebirdClientDriverFixture.cs b/src/NHibernate.Test/Async/DriverTest/FirebirdClientDriverFixture.cs
index 734866bda0c..df95610b93b 100644
--- a/src/NHibernate.Test/Async/DriverTest/FirebirdClientDriverFixture.cs
+++ b/src/NHibernate.Test/Async/DriverTest/FirebirdClientDriverFixture.cs
@@ -21,6 +21,7 @@ namespace NHibernate.Test.DriverTest
 	using System.Threading.Tasks;
 	using System.Threading;
 	[TestFixture]
+	[Obsolete("Uses old driver")]
 	public class FirebirdClientDriverFixtureAsync
 	{
 		private string _connectionString;
diff --git a/src/NHibernate.Test/Async/DriverTest/FirebirdDriverFixture.cs b/src/NHibernate.Test/Async/DriverTest/FirebirdDriverFixture.cs
new file mode 100644
index 00000000000..cb0ab53d9cc
--- /dev/null
+++ b/src/NHibernate.Test/Async/DriverTest/FirebirdDriverFixture.cs
@@ -0,0 +1,201 @@
+//------------------------------------------------------------------------------
+// 
+//     This code was generated by AsyncGenerator.
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// 
+//------------------------------------------------------------------------------
+
+
+using System;
+using System.Data;
+using System.Data.Common;
+using NHibernate.Driver;
+using NHibernate.SqlCommand;
+using NHibernate.SqlTypes;
+using NUnit.Framework;
+
+namespace NHibernate.Test.DriverTest
+{
+	using System.Threading.Tasks;
+	using System.Threading;
+	[TestFixture]
+	public class FirebirdDriverFixtureAsync
+	{
+		private string _connectionString;
+		private FirebirdDriver _driver;
+
+		[OneTimeSetUp]
+		public void OneTimeSetup()
+		{
+			var cfg = TestConfigurationHelper.GetDefaultConfiguration();
+
+			var dlct = cfg.GetProperty("dialect");
+			if (!dlct.Contains("Firebird"))
+				Assert.Ignore("Applies only to Firebird");
+
+			_driver = new FirebirdDriver();
+			_driver.Configure(cfg.Properties);
+			_connectionString = cfg.GetProperty("connection.connection_string");
+		}
+
+		[Test]
+		public async Task ConnectionPooling_OpenThenCloseThenOpenAnotherOne_OnlyOneConnectionIsPooledAsync()
+		{
+			_driver.ClearPool(_connectionString);
+
+			var allreadyEstablished = await (GetEstablishedConnectionsAsync());
+
+			using (var connection1 = MakeConnection())
+			using (var connection2 = MakeConnection())
+			{
+				//open first connection
+				await (connection1.OpenAsync());
+				await (VerifyCountOfEstablishedConnectionsIsAsync(allreadyEstablished + 1, "After first open"));
+
+				//return it to the pool
+				connection1.Close();
+				await (VerifyCountOfEstablishedConnectionsIsAsync(allreadyEstablished + 1, "After first close"));
+
+				//open the second connection
+				await (connection2.OpenAsync());
+				await (VerifyCountOfEstablishedConnectionsIsAsync(allreadyEstablished + 1, "After second open"));
+
+				//return it to the pool
+				connection2.Close();
+				await (VerifyCountOfEstablishedConnectionsIsAsync(allreadyEstablished + 1, "After second close"));
+			}
+		}
+
+		[Test]
+		public async Task ConnectionPooling_OpenThenCloseTwoAtTheSameTime_TowConnectionsArePooledAsync()
+		{
+			_driver.ClearPool(_connectionString);
+
+			var allreadyEstablished = await (GetEstablishedConnectionsAsync());
+
+			using (var connection1 = MakeConnection())
+			using (var connection2 = MakeConnection())
+			{
+				//open first connection
+				await (connection1.OpenAsync());
+				await (VerifyCountOfEstablishedConnectionsIsAsync(allreadyEstablished + 1, "After first open"));
+
+				//open second one
+				await (connection2.OpenAsync());
+				await (VerifyCountOfEstablishedConnectionsIsAsync(allreadyEstablished + 2, "After second open"));
+
+				//return connection1 to the pool
+				connection1.Close();
+				await (VerifyCountOfEstablishedConnectionsIsAsync(allreadyEstablished + 2, "After first close"));
+
+				//return connection2 to the pool
+				connection2.Close();
+				await (VerifyCountOfEstablishedConnectionsIsAsync(allreadyEstablished + 2, "After second close"));
+			}
+		}
+
+		private DbConnection MakeConnection()
+		{
+			var result = _driver.CreateConnection();
+			result.ConnectionString = _connectionString;
+			return result;
+		}
+
+		private async Task VerifyCountOfEstablishedConnectionsIsAsync(int expectedCount, string step, CancellationToken cancellationToken = default(CancellationToken))
+		{
+			var physicalConnections = await (GetEstablishedConnectionsAsync(cancellationToken));
+			Assert.That(physicalConnections, Is.EqualTo(expectedCount), step);
+		}
+
+		private async Task GetEstablishedConnectionsAsync(CancellationToken cancellationToken = default(CancellationToken))
+		{
+			using (var conn = _driver.CreateConnection())
+			{
+				conn.ConnectionString = _connectionString;
+				await (conn.OpenAsync(cancellationToken));
+				using (var cmd = conn.CreateCommand())
+				{
+					cmd.CommandText = "select count(*) from mon$attachments where mon$attachment_id <> current_connection";
+					return Convert.ToInt32(await (cmd.ExecuteScalarAsync(cancellationToken)));
+				}
+			}
+		}
+
+		private DbCommand BuildSelectCaseCommand(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("select (case when col = ")
+				.AddParameter()
+				.Add(" then ")
+				.AddParameter()
+				.Add(" else ")
+				.AddParameter()
+				.Add(" end) from table")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType, paramType, paramType });
+		}
+
+		private DbCommand BuildSelectConcatCommand(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("select col || ")
+				.AddParameter()
+				.Add(" || ")
+				.Add("col ")
+				.Add("from table")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType });
+		}
+
+		private DbCommand BuildSelectAddCommand(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("select col + ")
+				.AddParameter()
+				.Add(" from table")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType });
+		}
+
+		private DbCommand BuildInsertWithParamsInSelectCommand(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("insert into table1 (col1, col2) ")
+				.Add("select col1, ")
+				.AddParameter()
+				.Add(" from table2")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType });
+		}
+
+		private DbCommand BuildInsertWithParamsInSelectCommandWithSelectInColumnName(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("insert into table1 (col1_select_aaa) ")
+				.Add("values(")
+				.AddParameter()
+				.Add(") from table2")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType });
+		}
+
+		private DbCommand BuildInsertWithParamsInSelectCommandWithWhereInColumnName(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("insert into table1 (col1_where_aaa) ")
+				.Add("values(")
+				.AddParameter()
+				.Add(") from table2")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType });
+		}
+	}
+}
diff --git a/src/NHibernate.Test/Async/DriverTest/ObsoleteDriverFixture.cs b/src/NHibernate.Test/Async/DriverTest/ObsoleteDriverFixture.cs
new file mode 100644
index 00000000000..09fa703e1da
--- /dev/null
+++ b/src/NHibernate.Test/Async/DriverTest/ObsoleteDriverFixture.cs
@@ -0,0 +1,101 @@
+//------------------------------------------------------------------------------
+// 
+//     This code was generated by AsyncGenerator.
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// 
+//------------------------------------------------------------------------------
+
+
+using System;
+using System.Collections;
+using System.Linq.Dynamic.Core;
+using NHibernate.Cfg;
+using NHibernate.Connection;
+using NHibernate.Dialect;
+using NHibernate.DomainModel;
+using NHibernate.Driver;
+using NHibernate.Util;
+using NUnit.Framework;
+
+namespace NHibernate.Test.DriverTest
+{
+	using System.Threading.Tasks;
+	[TestFixture, Obsolete]
+	public class ObsoleteDriverFixtureAsync : TestCase
+	{
+		protected override IList Mappings => new [] {"Simple.hbm.xml"};
+
+		protected override bool AppliesTo(Dialect.Dialect dialect)
+		{
+			switch (dialect)
+			{
+				case FirebirdDialect _:
+				case MsSql2000Dialect _:
+				case MsSqlCeDialect _:
+				case MySQLDialect _:
+				case PostgreSQLDialect _:
+				case SQLiteDialect _:
+					System.Type driverType = ReflectHelper.ClassForName(cfg.GetProperty(Cfg.Environment.ConnectionDriver));
+					return !(driverType.IsOdbcDriver() || driverType.IsOleDbDriver());
+				default:
+					return false;
+			}
+		}
+
+		protected override void Configure(Configuration configuration)
+		{
+			base.Configure(configuration);
+
+			System.Type driverType = ReflectHelper.ClassForName(cfg.GetProperty(Cfg.Environment.ConnectionDriver));
+			if (driverType.IsOdbcDriver() || driverType.IsOleDbDriver())
+			{
+				// ODBC and OLE DB drivers are not obsoleted, do not switch it.
+				return;
+			}
+
+			var dialect = NHibernate.Dialect.Dialect.GetDialect(configuration.Properties);
+			System.Type driver;
+			switch (dialect)
+			{
+				case FirebirdDialect _:
+					driver = typeof(FirebirdClientDriver);
+					break;
+				case MsSql2008Dialect _:
+					driver = typeof(Sql2008ClientDriver);
+					break;
+				case MsSql2000Dialect _:
+					driver = typeof(SqlClientDriver);
+					break;
+				case MsSqlCeDialect _:
+					driver = typeof(SqlServerCeDriver);
+					break;
+				case MySQLDialect _:
+					driver = typeof(MySqlDataDriver);
+					break;
+				case PostgreSQLDialect _:
+					driver = typeof(NpgsqlDriver);
+					break;
+				case SQLiteDialect _:
+					driver = typeof(SQLite20Driver);
+					break;
+				default:
+					return;
+			}
+			configuration.SetProperty(Cfg.Environment.ConnectionDriver, driver.FullName);
+		}
+
+		[Test]
+		public async Task CanUseObsoleteDriverAsync()
+		{
+			using (var s = OpenSession())
+			using (var t = s.BeginTransaction())
+			{
+				var count = s.Query().Count();
+				Assert.That(count, Is.Zero);
+				await (t.CommitAsync());
+			}
+		}
+	}
+}
diff --git a/src/NHibernate.Test/Async/DriverTest/OdbcDriverFixture.cs b/src/NHibernate.Test/Async/DriverTest/OdbcDriverFixture.cs
index a0f0f8664f9..afecb1a49f3 100644
--- a/src/NHibernate.Test/Async/DriverTest/OdbcDriverFixture.cs
+++ b/src/NHibernate.Test/Async/DriverTest/OdbcDriverFixture.cs
@@ -8,10 +8,8 @@
 //------------------------------------------------------------------------------
 
 
-using System;
 using System.Collections;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -32,7 +30,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is OdbcDriver;
+			return factory.ConnectionProvider.Driver.IsOdbcDriver();
 		}
 
 		protected override void OnTearDown()
diff --git a/src/NHibernate.Test/Async/DriverTest/SqlClientDriverFixture.cs b/src/NHibernate.Test/Async/DriverTest/SqlServerDriverFixture.cs
similarity index 97%
rename from src/NHibernate.Test/Async/DriverTest/SqlClientDriverFixture.cs
rename to src/NHibernate.Test/Async/DriverTest/SqlServerDriverFixture.cs
index 62fe9232900..d98674b1552 100644
--- a/src/NHibernate.Test/Async/DriverTest/SqlClientDriverFixture.cs
+++ b/src/NHibernate.Test/Async/DriverTest/SqlServerDriverFixture.cs
@@ -12,7 +12,6 @@
 using System.Collections;
 using System.Data;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.SqlTypes;
 using NUnit.Framework;
@@ -23,7 +22,7 @@ namespace NHibernate.Test.DriverTest
 	using System.Threading.Tasks;
 
 	[TestFixture]
-	public class SqlClientDriverFixtureAsync : TestCase
+	public class SqlServerDriverFixtureAsync : TestCase
 	{
 		protected override string MappingsAssembly => "NHibernate.Test";
 
@@ -36,7 +35,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override void OnTearDown()
diff --git a/src/NHibernate.Test/Async/ExceptionsTest/SQLExceptionConversionTest.cs b/src/NHibernate.Test/Async/ExceptionsTest/SQLExceptionConversionTest.cs
index fd65322ce8a..13e072c37f0 100644
--- a/src/NHibernate.Test/Async/ExceptionsTest/SQLExceptionConversionTest.cs
+++ b/src/NHibernate.Test/Async/ExceptionsTest/SQLExceptionConversionTest.cs
@@ -13,7 +13,6 @@
 using System.Data;
 using System.Data.Common;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Exceptions;
 using NHibernate.Util;
@@ -43,7 +42,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			var driver = factory.ConnectionProvider.Driver;
-			return !(driver is OracleDataClientDriver) && !(driver is OracleManagedDataClientDriver) && !(driver is OracleLiteDataClientDriver) && !(driver is OdbcDriver) && !(driver is OleDbDriver);
+			return !(driver.IsOracleDataClientDriver()) && !(driver.IsOracleManagedDataClientDriver()) && !(driver.IsOracleLiteDataClientDriver()) && !(driver.IsOdbcDriver()) && !(driver.IsOleDbDriver());
 		}
 
 		protected override void Configure(Cfg.Configuration configuration)
diff --git a/src/NHibernate.Test/Async/Futures/FallbackFixture.cs b/src/NHibernate.Test/Async/Futures/FallbackFixture.cs
index 80a2d1b6156..ddfde2275c8 100644
--- a/src/NHibernate.Test/Async/Futures/FallbackFixture.cs
+++ b/src/NHibernate.Test/Async/Futures/FallbackFixture.cs
@@ -8,6 +8,7 @@
 //------------------------------------------------------------------------------
 
 
+using System;
 using System.Linq;
 using NHibernate.Cfg;
 using NHibernate.Connection;
@@ -24,7 +25,7 @@ namespace NHibernate.Test.Futures
 	using System.Threading;
 
 	/// 
-	/// I'm using a Driver which derives from SqlClientDriver to
+	/// I'm using a Driver which derives from SqlServer2000Driver to
 	/// return false for the SupportsMultipleQueries property. This is purely to test the way NHibernate
 	/// will behave when the driver that's being used does not support multiple queries... so even though
 	/// the test is using MsSql, it's only relevant for databases that don't support multiple queries
@@ -46,7 +47,7 @@ protected override void Configure(Configuration configuration)
 			base.Configure(configuration);
 			using (var cp = ConnectionProviderFactory.NewConnectionProvider(cfg.Properties))
 			{
-				if (cp.Driver is SqlClientDriver)
+				if (cp.Driver.IsSqlClientDriver())
 				{
 					configuration.Properties[Environment.ConnectionDriver] =
 						typeof(TestDriverThatDoesntSupportQueryBatching).AssemblyQualifiedName;
diff --git a/src/NHibernate.Test/Async/Hql/Ast/LimitClauseFixture.cs b/src/NHibernate.Test/Async/Hql/Ast/LimitClauseFixture.cs
index 90d885db753..f9ceb3a0c7e 100644
--- a/src/NHibernate.Test/Async/Hql/Ast/LimitClauseFixture.cs
+++ b/src/NHibernate.Test/Async/Hql/Ast/LimitClauseFixture.cs
@@ -10,7 +10,6 @@
 
 using System.Linq;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Hql.Ast.ANTLR;
 using NHibernate.Util;
 using NUnit.Framework;
@@ -25,7 +24,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		{
 			return dialect.SupportsVariableLimit
 				&& !(Dialect is Dialect.MsSql2000Dialect && // don't know why, but these tests don't work on SQL Server using ODBC
-					typeof(OdbcDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)))); 
+					ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)).IsOdbcDriver()); 
 		}
 
 		protected override void OnSetUp()
diff --git a/src/NHibernate.Test/Async/Insertordering/InsertOrderingFixture.cs b/src/NHibernate.Test/Async/Insertordering/InsertOrderingFixture.cs
index 79382c114d1..6528d71d1cc 100644
--- a/src/NHibernate.Test/Async/Insertordering/InsertOrderingFixture.cs
+++ b/src/NHibernate.Test/Async/Insertordering/InsertOrderingFixture.cs
@@ -18,7 +18,6 @@
 using NHibernate.AdoNet;
 using NHibernate.Cfg;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.SqlCommand;
 using NHibernate.SqlTypes;
@@ -52,7 +51,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// Custom batcher does not support oledb driver.
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override void Configure(Configuration configuration)
diff --git a/src/NHibernate.Test/Async/Linq/ByMethod/GroupByTests.cs b/src/NHibernate.Test/Async/Linq/ByMethod/GroupByTests.cs
index ca1c7c8985d..ac24728d7fb 100644
--- a/src/NHibernate.Test/Async/Linq/ByMethod/GroupByTests.cs
+++ b/src/NHibernate.Test/Async/Linq/ByMethod/GroupByTests.cs
@@ -15,7 +15,6 @@
 using System.Text.RegularExpressions;
 using NHibernate.Dialect;
 using NHibernate.DomainModel.Northwind.Entities;
-using NHibernate.Driver;
 using NHibernate.Linq;
 using NUnit.Framework;
 
@@ -562,7 +561,7 @@ public async Task GroupByComputedValueAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.Orders.GroupBy(o => o.Customer.CustomerId == null ? 0 : 1).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -574,7 +573,7 @@ public async Task GroupByComputedValueInAnonymousTypeAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.Orders.GroupBy(o => new { Key = o.Customer.CustomerId == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -586,7 +585,7 @@ public async Task GroupByComputedValueInObjectArrayAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.Orders.GroupBy(o => new[] { o.Customer.CustomerId == null ? 0 : 1, }).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -715,7 +714,7 @@ public async Task GroupByComputedValueWithJoinOnObjectAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.OrderLines.GroupBy(o => o.Order.Customer == null ? 0 : 1).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -727,7 +726,7 @@ public async Task GroupByComputedValueWithJoinOnIdAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.OrderLines.GroupBy(o => o.Order.Customer.CustomerId == null ? 0 : 1).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -739,7 +738,7 @@ public async Task GroupByComputedValueInAnonymousTypeWithJoinOnObjectAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.OrderLines.GroupBy(o => new { Key = o.Order.Customer == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -751,7 +750,7 @@ public async Task GroupByComputedValueInAnonymousTypeWithJoinOnIdAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.OrderLines.GroupBy(o => new { Key = o.Order.Customer.CustomerId == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -763,7 +762,7 @@ public async Task GroupByComputedValueInObjectArrayWithJoinOnObjectAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.OrderLines.GroupBy(o => new[] { o.Order.Customer == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -775,7 +774,7 @@ public async Task GroupByComputedValueInObjectArrayWithJoinOnIdAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.OrderLines.GroupBy(o => new[] { o.Order.Customer.CustomerId == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -787,7 +786,7 @@ public async Task GroupByComputedValueInObjectArrayWithJoinInRightSideOfCaseAsyn
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.OrderLines.GroupBy(o => new[] { o.Order.Customer.CustomerId == null ? "unknown" : o.Order.Customer.CompanyName }).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -799,7 +798,7 @@ public async Task GroupByComputedValueFromNestedArraySelectAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.OrderLines.Select(o => new object[] { o }).GroupBy(x => new object[] { ((OrderLine)x[0]).Order.Customer == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
@@ -811,7 +810,7 @@ public async Task GroupByComputedValueFromNestedObjectSelectAsync()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = await (db.OrderLines.Select(o => new { OrderLine = (object)o }).GroupBy(x => new object[] { ((OrderLine)x.OrderLine).Order.Customer == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToListAsync());
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Dates/DateTimeOffsetFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/Dates/DateTimeOffsetFixture.cs
index 587100668c1..d0508910baa 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/Dates/DateTimeOffsetFixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/Dates/DateTimeOffsetFixture.cs
@@ -14,7 +14,6 @@
 using System.IO;
 using System.Runtime.Serialization.Formatters.Binary;
 using System.Xml.Serialization;
-using NHibernate.Driver;
 using NHibernate.Type;
 using NUnit.Framework;
 
@@ -33,7 +32,7 @@ protected override IList Mappings
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
 			// Cannot handle DbType.DateTimeOffset via ODBC.
-			if (factory.ConnectionProvider.Driver is OdbcDriver)
+			if (factory.ConnectionProvider.Driver.IsOdbcDriver())
 				return false;
 
 			return base.AppliesTo(factory);
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Dates/DateTimeOffsetQueryFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/Dates/DateTimeOffsetQueryFixture.cs
index 3af6e8995e8..f2ec239effe 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/Dates/DateTimeOffsetQueryFixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/Dates/DateTimeOffsetQueryFixture.cs
@@ -12,7 +12,6 @@
 using System.Collections;
 using System.Data;
 using System.Linq;
-using NHibernate.Driver;
 using NHibernate.Type;
 using NUnit.Framework;
 using Environment = NHibernate.Cfg.Environment;
@@ -32,7 +31,7 @@ protected override IList Mappings
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
 			// Cannot handle DbType.DateTimeOffset via ODBC.
-			if (factory.ConnectionProvider.Driver is OdbcDriver)
+			if (factory.ConnectionProvider.Driver.IsOdbcDriver())
 				return false;
 
 			return base.AppliesTo(factory);
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs
index 1e8dc255183..74ab0f13fc1 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs
@@ -11,7 +11,6 @@
 using log4net.Core;
 using NHibernate.AdoNet;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Util;
 using NUnit.Framework;
 
@@ -37,7 +36,7 @@ protected override void Configure(Configuration configuration)
 		[Test]
 		public async Task CanSaveInSingleBatchAsync()
 		{
-			if (!typeof(OracleDataClientDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver))))
+			if (!ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)).IsOracleDataClientDriver())
 			{
 				Assert.Ignore("Only applicable for Oracle Data Client driver");
 			}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1507/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1507/Fixture.cs
index 48a864ef62c..196797ea10d 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH1507/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1507/Fixture.cs
@@ -10,7 +10,6 @@
 
 using System;
 using System.Collections;
-using NHibernate.Driver;
 using NUnit.Framework;
 
 namespace NHibernate.Test.NHSpecificTest.NH1507
@@ -21,7 +20,7 @@ public class FixtureAsync : BugTestCase
 	{
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
-			return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+			return !(factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
 		}
 
 		protected override void OnSetUp()
@@ -128,4 +127,4 @@ public async Task ImplicitJoinFailingTestAsync()
 			}
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs
index 2ce5e39ce00..b1f701416de 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs
@@ -12,7 +12,6 @@
 using System.Data;
 using NHibernate.Cfg;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 using NUnit.Framework.Constraints;
@@ -152,7 +151,7 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// SQLUpdateConflictToStaleStateExceptionConverter is specific to Sql client driver, and does not work
 			// with Odbc (and likeley Oledb).
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		private bool _isSnapshotIsolationAlreadyAllowed;
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1756/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1756/Fixture.cs
index ae654b85b77..933c703d5a0 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH1756/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1756/Fixture.cs
@@ -10,7 +10,6 @@
 
 using System.Collections.Generic;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -41,7 +40,7 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory)
 			//     N'@P1 nvarchar(18),@P2 int,@P3 datetime2',N'modified test book',1,'2017-08-02 16:37:16.0630000'
 			// Setting the scale to 2 still causes failure for two thirds of tries, due to 3ms/7ms being truncated in such case
 			// with ODBC and SQL Server 2008+ Client, which is rejected by ODBC.
-			return !(factory.ConnectionProvider.Driver is OdbcDriver);
+			return !(factory.ConnectionProvider.Driver.IsOdbcDriver());
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2020/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2020/Fixture.cs
index f3376f32a6d..378cc5fba14 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH2020/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2020/Fixture.cs
@@ -10,7 +10,6 @@
 
 using NUnit.Framework;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Exceptions;
 using NHibernate.Test.ExceptionsTest;
 using NHibernate.Engine;
@@ -37,7 +36,7 @@ protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// Use a SQL Server Client exception converter, cannot work for ODBC or OleDb
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override void OnTearDown()
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2207/SampleTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2207/SampleTest.cs
index dd26d362887..a27f4fc039f 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH2207/SampleTest.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2207/SampleTest.cs
@@ -11,7 +11,6 @@
 using System;
 using System.Data;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -29,7 +28,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is Sql2008ClientDriver;
+			return factory.ConnectionProvider.Driver.IsSql2008ClientDriver();
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2296/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2296/Fixture.cs
index 28a2d60d9c5..8ee9d680433 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH2296/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2296/Fixture.cs
@@ -9,7 +9,6 @@
 
 
 using System.Linq;
-using NHibernate.Driver;
 using NUnit.Framework;
 
 namespace NHibernate.Test.NHSpecificTest.NH2296
@@ -20,7 +19,7 @@ public class FixtureAsync : BugTestCase
 	{
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
-			return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+			return !(factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
 		}
 
 		protected override void OnSetUp()
@@ -84,4 +83,4 @@ public async Task TestAsync()
 			}
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2302/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2302/Fixture.cs
index df16c52023c..2ca311d4ae5 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH2302/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2302/Fixture.cs
@@ -10,7 +10,6 @@
 
 using System.Data;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Mapping;
 using NUnit.Framework;
 
@@ -49,7 +48,7 @@ protected override void OnTearDown()
         [Test]
         public async Task StringHugeLengthAsync()
         {
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver || Dialect is MsSqlCeDialect)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver() || Dialect is MsSqlCeDialect)
 				Assert.Ignore("NH-4065, not fixed for Odbc and MsSqlCe");
 
             int id;
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs
index 0f71ee82087..132a84ec8cf 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs
@@ -14,7 +14,6 @@
 using System.Configuration;
 using System.Transactions;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -73,7 +72,7 @@ public async Task ShouldBeAbleToReleaseSuppliedConnectionAfterDistributedTransac
 						new DummyEnlistment(),
 						EnlistmentOptions.None);
 
-					if (Sfi.ConnectionProvider.Driver.GetType() == typeof(OdbcDriver))
+					if (Sfi.ConnectionProvider.Driver.GetType().IsOdbcDriver())
 						connection = new OdbcConnection(connectionString);
 					else
 						connection = new SqlConnection(connectionString);
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2660And2661/Test.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2660And2661/Test.cs
index d13589002f3..8cc9f87f061 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH2660And2661/Test.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2660And2661/Test.cs
@@ -50,7 +50,7 @@ protected override void Configure(Configuration configuration)
 				{
 					// to be sure we are using the new drive
 					base.Configure(configuration);
-					configuration.DataBaseIntegration(x=> x.Driver());
+					configuration.DataBaseIntegration(x=> x.Driver());
 				}
 
 		[Test]
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2846/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2846/Fixture.cs
index 71a6dd7fb6d..f09fd96c407 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH2846/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2846/Fixture.cs
@@ -9,7 +9,6 @@
 
 
 using System.Linq;
-using NHibernate.Driver;
 using NHibernate.Linq;
 using NUnit.Framework;
 
@@ -21,7 +20,7 @@ public class FixtureAsync : BugTestCase
 	{
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
-			return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+			return !(factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
 		}
 
 		protected override void OnSetUp()
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2852/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2852/Fixture.cs
index 4bd4d82cabe..4b92853bb40 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH2852/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2852/Fixture.cs
@@ -9,7 +9,6 @@
 
 
 using System.Linq;
-using NHibernate.Driver;
 using NHibernate.Linq;
 using NUnit.Framework;
 
@@ -21,7 +20,7 @@ public class FixtureAsync : BugTestCase
 	{
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
-			return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+			return !(factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
 		}
 
 		protected override void OnSetUp()
@@ -92,4 +91,4 @@ public async Task AlsoFailsAsync()
 			}
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3023/DeadlockConnectionPoolIssueTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3023/DeadlockConnectionPoolIssueTest.cs
index 052557dc4c0..f569b887c95 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3023/DeadlockConnectionPoolIssueTest.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3023/DeadlockConnectionPoolIssueTest.cs
@@ -20,7 +20,6 @@
 using log4net.Repository.Hierarchy;
 using NHibernate.Cfg;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -43,7 +42,7 @@ protected override void Configure(Configuration configuration)
 
 		// Uses directly SqlConnection.
 		protected override bool AppliesTo(ISessionFactoryImplementor factory) =>
-			factory.ConnectionProvider.Driver is SqlClientDriver &&
+			factory.ConnectionProvider.Driver.IsSqlClientDriver() &&
 			factory.ConnectionProvider.Driver.SupportsSystemTransactions;
 
 		protected override bool AppliesTo(Dialect.Dialect dialect) =>
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3121/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3121/Fixture.cs
index 525c4b3d6c2..d6d708231e5 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3121/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3121/Fixture.cs
@@ -13,7 +13,6 @@
 using System.Linq;
 using System.Reflection;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NUnit.Framework;
 
 namespace NHibernate.Test.NHSpecificTest.NH3121
@@ -36,10 +35,10 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		[Test]
 		public void ShouldThrowWhenByteArrayTooLongAsync()
 		{
-			// For SQL Server only the SqlClientDriver sets parameter lengths
+			// For SQL Server only the SqlServer2000Driver sets parameter lengths
 			// even when there is no length specified in the mapping. The ODBC
 			// driver won't cause the truncation issue and hence not the exception.
-			if (!(Sfi.ConnectionProvider.Driver is SqlClientDriver))
+			if (!(Sfi.ConnectionProvider.Driver.IsSqlClientDriver()))
 				Assert.Ignore("Test limited to drivers that sets parameter length even with no length specified in the mapping.");
 
 			const int reportSize = 17158;
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3142/ChildrenTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3142/ChildrenTest.cs
index c5f420db6de..52f9f3fd726 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3142/ChildrenTest.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3142/ChildrenTest.cs
@@ -11,7 +11,6 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
-using NHibernate.Driver;
 using NUnit.Framework;
 
 namespace NHibernate.Test.NHSpecificTest.NH3142
@@ -22,7 +21,7 @@ public class ChildrenTestAsync : BugTestCase
 	{
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
-			return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+			return !(factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
 		}
 
 		protected override void OnSetUp()
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3202/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3202/Fixture.cs
index 61a8bf45526..8793de14f64 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3202/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3202/Fixture.cs
@@ -27,7 +27,7 @@ protected override void Configure(Configuration configuration)
 			if (!(Dialect is MsSql2008Dialect))
 				Assert.Ignore("Test is for MS SQL Server dialect only (custom dialect).");
 
-			if (!typeof(SqlClientDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver))))
+			if (!ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)).IsSqlClientDriver())
 				Assert.Ignore("Test is for MS SQL Server driver only (custom driver is used).");
 
 			cfg.SetProperty(Environment.Dialect, typeof(OffsetStartsAtOneTestDialect).AssemblyQualifiedName);
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3202/FixtureObsolete.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3202/FixtureObsolete.cs
new file mode 100644
index 00000000000..26ae06fe297
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3202/FixtureObsolete.cs
@@ -0,0 +1,114 @@
+//------------------------------------------------------------------------------
+// 
+//     This code was generated by AsyncGenerator.
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// 
+//------------------------------------------------------------------------------
+
+
+using System;
+using System.Data.Common;
+using System.Text.RegularExpressions;
+using NHibernate.Cfg;
+using NHibernate.Dialect;
+using NHibernate.Driver;
+using NHibernate.Util;
+using NUnit.Framework;
+using Environment = NHibernate.Cfg.Environment;
+
+namespace NHibernate.Test.NHSpecificTest.NH3202
+{
+	using System.Threading.Tasks;
+	[TestFixture]
+	[Obsolete("Uses old driver")]
+	public class FixtureObsoleteAsync : BugTestCase
+	{
+		protected override void Configure(Configuration configuration)
+		{
+			if (!(Dialect is MsSql2008Dialect))
+				Assert.Ignore("Test is for MS SQL Server dialect only (custom dialect).");
+
+			if (!ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)).IsSqlClientDriver())
+				Assert.Ignore("Test is for MS SQL Server driver only (custom driver is used).");
+
+			cfg.SetProperty(Environment.Dialect, typeof(OffsetStartsAtOneTestDialect).AssemblyQualifiedName);
+			cfg.SetProperty(Environment.ConnectionDriver, typeof(OffsetTestObsoleteDriver).AssemblyQualifiedName);
+		}
+
+		private OffsetStartsAtOneTestDialect OffsetStartsAtOneTestDialect
+		{
+			get { return (OffsetStartsAtOneTestDialect)Sfi.Dialect; }
+		}
+
+		private OffsetTestObsoleteDriver CustomDriver
+		{
+			get { return (OffsetTestObsoleteDriver)Sfi.ConnectionProvider.Driver; }
+		}
+
+		protected override void OnSetUp()
+		{
+			CustomDriver.OffsetStartsAtOneTestDialect = OffsetStartsAtOneTestDialect;
+
+			base.OnSetUp();
+
+			using (var session = OpenSession())
+			using (var transaction = session.BeginTransaction())
+			{
+				session.Save(new SequencedItem(1));
+				session.Save(new SequencedItem(2));
+				session.Save(new SequencedItem(3));
+
+				session.Flush();
+				transaction.Commit();
+			}
+		}
+
+		protected override void OnTearDown()
+		{
+			using (ISession s = OpenSession())
+			using (ITransaction t = s.BeginTransaction())
+			{
+				s.Delete("from SequencedItem");
+				t.Commit();
+			}
+			base.OnTearDown();
+		}
+
+
+		[Test]
+		public async Task OffsetNotStartingAtOneSetsParameterToSkipValueAsync()
+		{
+			OffsetStartsAtOneTestDialect.ForceOffsetStartsAtOne = false;
+
+			using (var session = OpenSession())
+			{
+				var item2 =
+				await (session.QueryOver()
+					.OrderBy(i => i.I).Asc
+					.Take(1).Skip(2)
+					.SingleOrDefaultAsync());
+
+				Assert.That(CustomDriver.OffsetParameterValueFromCommand, Is.EqualTo(2));
+			}
+		}
+
+		[Test]
+		public async Task OffsetStartingAtOneSetsParameterToSkipValuePlusOneAsync()
+		{
+			OffsetStartsAtOneTestDialect.ForceOffsetStartsAtOne = true;
+
+			using (var session = OpenSession())
+			{
+				var item2 =
+				await (session.QueryOver()
+					.OrderBy(i => i.I).Asc
+					.Take(1).Skip(2)
+					.SingleOrDefaultAsync());
+
+				Assert.That(CustomDriver.OffsetParameterValueFromCommand, Is.EqualTo(3));
+			}
+		}
+	}
+}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3252/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3252/Fixture.cs
index 3f2dd8084a8..c3c0021e44c 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3252/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3252/Fixture.cs
@@ -10,7 +10,6 @@
 
 using System;
 using System.Linq;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Linq;
 using NUnit.Framework;
@@ -23,7 +22,7 @@ public class FixtureAsync : BugTestCase
 	{
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3518/XmlColumnTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3518/XmlColumnTest.cs
index 31b08659374..52b1ff0bff1 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3518/XmlColumnTest.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3518/XmlColumnTest.cs
@@ -11,7 +11,6 @@
 using System.Xml;
 using NHibernate.Cfg;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -38,7 +37,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override void Configure(Configuration configuration)
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3620/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3620/Fixture.cs
index 076371afdfa..572b9668a45 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3620/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3620/Fixture.cs
@@ -9,7 +9,6 @@
 
 
 using System;
-using NHibernate.Driver;
 using NUnit.Framework;
 
 namespace NHibernate.Test.NHSpecificTest.NH3620 {
@@ -17,7 +16,7 @@ namespace NHibernate.Test.NHSpecificTest.NH3620 {
     [TestFixture]
     public class FixtureAsync : BugTestCase {
         protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) {
-            return (factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+            return (factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
         }
 
         protected override void OnTearDown() {
@@ -52,4 +51,4 @@ private void CleanupData() {
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3844/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3844/Fixture.cs
index 006536ab127..461c718c0d0 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3844/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3844/Fixture.cs
@@ -9,7 +9,6 @@
 
 
 using System.Linq;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Linq;
 using NUnit.Framework;
@@ -28,7 +27,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// SQL Server seems unable to match complex group by and select list arguments when running over ODBC.";
-			return !(factory.ConnectionProvider.Driver is OdbcDriver);
+			return !(factory.ConnectionProvider.Driver.IsOdbcDriver());
 		}
 
 		protected override void OnSetUp()
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3850/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3850/Fixture.cs
index c0ee2b089dd..e95b1dd4740 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3850/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3850/Fixture.cs
@@ -15,7 +15,6 @@
 using System.Linq;
 using System.Reflection;
 using System.Text;
-using NHibernate.Driver;
 using NHibernate.Linq;
 using NHibernate.SqlTypes;
 using NHibernate.Util;
@@ -42,7 +41,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
 			// Cannot handle DbType.DateTimeOffset via ODBC.
-			return !(factory.ConnectionProvider.Driver is OdbcDriver);
+			return !(factory.ConnectionProvider.Driver.IsOdbcDriver());
 		}
 
 		protected override void OnSetUp()
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3912/ReusableBatcherFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3912/ReusableBatcherFixture.cs
index d5bbb05a2be..11323f53134 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/NH3912/ReusableBatcherFixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3912/ReusableBatcherFixture.cs
@@ -13,7 +13,6 @@
 using NHibernate.AdoNet;
 using NHibernate.Cfg;
 using NHibernate.Cfg.MappingSchema;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Linq;
 using NHibernate.Mapping.ByCode;
@@ -28,9 +27,9 @@ public class ReusableBatcherFixtureAsync : TestCaseMappingByCode
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			var driver = factory.ConnectionProvider.Driver;
-			return driver is OracleDataClientDriver ||
-			       driver is OracleLiteDataClientDriver ||
-			       driver is OracleManagedDataClientDriver;
+			return driver.IsOracleDataClientDriver() ||
+			       driver.IsOracleLiteDataClientDriver() ||
+			       driver.IsOracleManagedDataClientDriver();
 		}
 
 		protected override HbmMapping GetMappings()
diff --git a/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs
index fc8c339848e..86c87c2eb22 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs
@@ -9,7 +9,6 @@
 
 
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -32,7 +31,7 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory)
 			// tend to (validly) send InvalidOperationException during prepare phase due to the closed
 			// connection, which get not converted. For testing other case, maybe a failure caused by a
 			// schema mismatch (like done in transaction tests) would be better.
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/Async/Pagination/CustomDialectFixture.cs b/src/NHibernate.Test/Async/Pagination/CustomDialectFixture.cs
index 49bd4e48bfb..c47813308f6 100644
--- a/src/NHibernate.Test/Async/Pagination/CustomDialectFixture.cs
+++ b/src/NHibernate.Test/Async/Pagination/CustomDialectFixture.cs
@@ -13,7 +13,6 @@
 using NHibernate.Cfg;
 using NHibernate.Criterion;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Util;
 using NUnit.Framework;
 using Environment = NHibernate.Cfg.Environment;
@@ -40,7 +39,7 @@ protected override void Configure(Configuration configuration)
 			if (!(Dialect is MsSql2005Dialect))
 				Assert.Ignore("Test is for SQL dialect only");
 			var driverClass = ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver));
-			if (!typeof(SqlClientDriver).IsAssignableFrom(driverClass))
+			if (!driverClass.IsSqlClientDriver())
 				Assert.Ignore("Test is compatible only with Sql Server Client driver connection strings");
 
 			cfg.SetProperty(Environment.Dialect, typeof(CustomMsSqlDialect).AssemblyQualifiedName);
@@ -134,4 +133,4 @@ public async Task LimitFirstMultiCriteriaAsync()
 			}
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs b/src/NHibernate.Test/Async/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs
index c8c2ec8e31b..759606691fa 100644
--- a/src/NHibernate.Test/Async/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs
+++ b/src/NHibernate.Test/Async/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs
@@ -25,7 +25,7 @@ protected override IList Mappings
 
 		protected override bool AppliesTo(NHibernate.Engine.ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is Driver.OracleDataClientDriver;
+			return factory.ConnectionProvider.Driver.IsOracleDataClientDriver();
 		}
 
 		protected override bool AppliesTo(Dialect.Dialect dialect)
@@ -68,4 +68,4 @@ public async Task RefCursorOutStoredProcedureAsync()
 		}
 
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs b/src/NHibernate.Test/Async/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs
index 82c57049d41..609f4d42242 100644
--- a/src/NHibernate.Test/Async/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs
+++ b/src/NHibernate.Test/Async/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs
@@ -10,7 +10,6 @@
 
 using System.Collections;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -28,7 +27,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// Tested resulting SQL depends on driver.
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override string GetExpectedInsertOrgLogStatement(string orgName)
diff --git a/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs b/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs
index c9dc337df13..cf17f86b268 100644
--- a/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs
+++ b/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs
@@ -14,11 +14,10 @@
 using System.Threading;
 using System.Transactions;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Engine;
-using NHibernate.Linq;
 using NHibernate.Test.TransactionTest;
 using NUnit.Framework;
+using NHibernate.Linq;
 
 namespace NHibernate.Test.SystemTransactions
 {
@@ -190,7 +189,7 @@ public async Task CanUseSessionWithManyScopesAsync(bool explicitFlush)
 			// ODBC with SQL-Server always causes scopes to go distributed, which causes their transaction completion to run
 			// asynchronously. But ODBC enlistment also check the previous transaction in a way that do not guard against it
 			// being concurrently disposed of. See https://github.com/nhibernate/nhibernate-core/pull/1505 for more details.
-			Assume.That(!(Sfi.ConnectionProvider.Driver is OdbcDriver),
+			Assume.That(!(Sfi.ConnectionProvider.Driver.IsOdbcDriver()),
 			            "ODBC sometimes fails on second scope by checking the previous transaction status, which may yield an object disposed exception");
 
 			using (var s = WithOptions().ConnectionReleaseMode(ConnectionReleaseMode.OnClose).OpenSession())
diff --git a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaMetadataUpdaterTest/SchemaMetadataUpdaterFixture.cs b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaMetadataUpdaterTest/SchemaMetadataUpdaterFixture.cs
index 9e8f4dcf332..d9b9c86f62b 100644
--- a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaMetadataUpdaterTest/SchemaMetadataUpdaterFixture.cs
+++ b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaMetadataUpdaterTest/SchemaMetadataUpdaterFixture.cs
@@ -12,7 +12,6 @@
 using System.Collections.Generic;
 using System.Linq;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Mapping;
 using NHibernate.Tool.hbm2ddl;
@@ -116,7 +115,7 @@ public async Task EnsureReservedWordsHardCodedInDialectAsync()
 				}
 			}
 
-			if (sf.ConnectionProvider.Driver is OdbcDriver)
+			if (sf.ConnectionProvider.Driver.IsOdbcDriver())
 			{
 				Assert.Inconclusive("ODBC has excess keywords reserved");
 			}
@@ -252,7 +251,7 @@ public async Task WhenConfiguredOnlyExplicitAutoQuoteAsync()
 			var configuration = TestConfigurationHelper.GetDefaultConfiguration();
 			var driverClass = ReflectHelper.ClassForName(configuration.GetProperty(Environment.ConnectionDriver));
 			// Test uses the default dialect driver, which will not accept Odbc or OleDb connection strings.
-			if (typeof(OdbcDriver).IsAssignableFrom(driverClass) || typeof(OleDbDriver).IsAssignableFrom(driverClass))
+			if (driverClass.IsOdbcDriver() || driverClass.IsOleDbDriver())
 				Assert.Ignore("Test is not compatible with OleDb or ODBC driver connection strings");
 			var configuredDialect = Dialect.Dialect.GetDialect();
 			if(!configuredDialect.DefaultProperties.ContainsKey(Environment.ConnectionDriver))
diff --git a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs
index 6dee59c9771..9b5f2960157 100644
--- a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs
+++ b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs
@@ -12,7 +12,6 @@
 using System.IO;
 using System.Reflection;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Tool.hbm2ddl;
 using NHibernate.Util;
 using NUnit.Framework;
@@ -31,7 +30,7 @@ public class MigrationFixtureAsync
 			var driverClass = ReflectHelper.ClassForName(v1cfg.GetProperty(Environment.ConnectionDriver));
 			// Odbc is not supported by schema update: System.Data.Odbc.OdbcConnection.GetSchema("ForeignKeys") fails with an ArgumentException: ForeignKeys is undefined.
 			// It seems it would require its own DataBaseSchema, but this is bound to the dialect, not the driver.
-			if (typeof(OdbcDriver).IsAssignableFrom(driverClass))
+			if (driverClass.IsOdbcDriver())
 				Assert.Ignore("Test is not compatible with ODBC");
 
 			using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource1))
@@ -91,4 +90,4 @@ public Task SimpleColumnReplaceAsync()
 			}
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/TypesTest/DateTime2TypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/DateTime2TypeFixture.cs
index e30eaa872aa..6751cca00c4 100644
--- a/src/NHibernate.Test/Async/TypesTest/DateTime2TypeFixture.cs
+++ b/src/NHibernate.Test/Async/TypesTest/DateTime2TypeFixture.cs
@@ -9,7 +9,6 @@
 
 
 using System;
-using NHibernate.Driver;
 using NHibernate.SqlTypes;
 using NHibernate.Type;
 using NUnit.Framework;
@@ -29,7 +28,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) =>
 
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) =>
 			// Cannot handle DbType.DateTime2 via .Net ODBC.
-			!(factory.ConnectionProvider.Driver is OdbcDriver);
+			!(factory.ConnectionProvider.Driver.IsOdbcDriver());
 
 		protected override string TypeName => "DateTime2";
 		protected override AbstractDateTimeType Type => NHibernateUtil.DateTime2;
@@ -44,7 +43,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) =>
 
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) =>
 			// Cannot handle DbType.DateTime2 via .Net ODBC.
-			!(factory.ConnectionProvider.Driver is OdbcDriver);
+			!(factory.ConnectionProvider.Driver.IsOdbcDriver());
 
 		protected override string TypeName => "DateTime2WithScale";
 		protected override AbstractDateTimeType Type => (AbstractDateTimeType)TypeFactory.GetDateTime2Type(3);
diff --git a/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs
index a6ef854fad2..bab0c914f73 100644
--- a/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs
+++ b/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs
@@ -12,7 +12,6 @@
 using System.Data;
 using System.Linq;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.SqlTypes;
 using NHibernate.Tool.hbm2ddl;
 using NHibernate.Type;
@@ -38,7 +37,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) =>
 
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) =>
 			// Cannot handle DbType.DateTimeOffset via .Net ODBC.
-			!(factory.ConnectionProvider.Driver is OdbcDriver);
+			!(factory.ConnectionProvider.Driver.IsOdbcDriver());
 
 		protected override void Configure(Configuration configuration)
 		{
diff --git a/src/NHibernate.Test/Async/TypesTest/StringTypeWithLengthFixture.cs b/src/NHibernate.Test/Async/TypesTest/StringTypeWithLengthFixture.cs
index be75a5c5805..d75cb3b086c 100644
--- a/src/NHibernate.Test/Async/TypesTest/StringTypeWithLengthFixture.cs
+++ b/src/NHibernate.Test/Async/TypesTest/StringTypeWithLengthFixture.cs
@@ -13,7 +13,6 @@
 using NHibernate.Cfg.MappingSchema;
 using NHibernate.Criterion;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Exceptions;
 using NHibernate.Mapping.ByCode;
 using NUnit.Framework;
@@ -81,7 +80,7 @@ public Task ShouldPreventInsertionOfVeryLongStringThatWouldBeTruncatedAsync()
 			try
 			{
 				// This test case is for when the current driver will use a parameter size
-				// that is significantly larger than the mapped column size (e.g. SqlClientDriver currently).
+				// that is significantly larger than the mapped column size (e.g. SqlServer2000Driver currently).
 
 				// Note: This test could possible be written as
 				//   "database must raise an error OR it must store and return the full value"
@@ -139,7 +138,7 @@ public async Task CanCompareLongValueWithLongStringAsync()
 		{
 			var maxStringLength = GetLongStringMappedLength();
 
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver && maxStringLength >= 2000)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver() && maxStringLength >= 2000)
 				Assert.Ignore("Odbc wrecks nvarchar parameter types when they are longer than 2000, it switch them to ntext");
 
 			var longString = new string('x', maxStringLength);
diff --git a/src/NHibernate.Test/Async/TypesTest/XDocTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/XDocTypeFixture.cs
index b7fae9dc5c2..d2d0fb8afaf 100644
--- a/src/NHibernate.Test/Async/TypesTest/XDocTypeFixture.cs
+++ b/src/NHibernate.Test/Async/TypesTest/XDocTypeFixture.cs
@@ -10,7 +10,6 @@
 
 using System.Data;
 using System.Xml.Linq;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.SqlTypes;
 using NHibernate.Type;
@@ -35,7 +34,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// No Xml support with Odbc (and likely OleDb too).
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/Async/TypesTest/XmlDocTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/XmlDocTypeFixture.cs
index bc975d62590..83db7e7df9e 100644
--- a/src/NHibernate.Test/Async/TypesTest/XmlDocTypeFixture.cs
+++ b/src/NHibernate.Test/Async/TypesTest/XmlDocTypeFixture.cs
@@ -10,7 +10,6 @@
 
 using System.Data;
 using System.Xml;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.SqlTypes;
 using NHibernate.Type;
@@ -35,7 +34,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// No Xml support with Odbc (and likely OleDb too).
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/CfgTest/ConfigurationFixture.cs b/src/NHibernate.Test/CfgTest/ConfigurationFixture.cs
index 73a2b9671f4..3abf3b05cdb 100644
--- a/src/NHibernate.Test/CfgTest/ConfigurationFixture.cs
+++ b/src/NHibernate.Test/CfgTest/ConfigurationFixture.cs
@@ -52,7 +52,7 @@ public void ManualConfiguration()
 
 			props[Environment.ConnectionProvider] = "NHibernate.Connection.DriverConnectionProvider";
 			props[Environment.Dialect] = "NHibernate.Dialect.MsSql2000Dialect";
-			props[Environment.ConnectionDriver] = "NHibernate.Driver.SqlClientDriver";
+			props[Environment.ConnectionDriver] = "NHibernate.Driver.SqlServer2000Driver, NHibernate.Driver.SqlServer";
 			props[Environment.ConnectionString] =
 				"Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI";
 
diff --git a/src/NHibernate.Test/CfgTest/Loquacious/ConfigurationFixture.cs b/src/NHibernate.Test/CfgTest/Loquacious/ConfigurationFixture.cs
index d9b94d355de..1ae077347c5 100644
--- a/src/NHibernate.Test/CfgTest/Loquacious/ConfigurationFixture.cs
+++ b/src/NHibernate.Test/CfgTest/Loquacious/ConfigurationFixture.cs
@@ -53,7 +53,7 @@ public void CompleteConfiguration()
 #endif
 					.Connected
 						.Through()
-						.By()
+						.By()
 						.Releasing(ConnectionReleaseMode.AfterTransaction)
 						.With(IsolationLevel.ReadCommitted)
 						.Using(connectionString)
@@ -87,7 +87,7 @@ public void CompleteConfiguration()
 			Assert.That(cfg.Properties[Environment.BatchSize], Is.EqualTo("15"));
 #endif
 			Assert.That(cfg.Properties[Environment.ConnectionProvider], Is.EqualTo(typeof(DebugConnectionProvider).AssemblyQualifiedName));
-			Assert.That(cfg.Properties[Environment.ConnectionDriver], Is.EqualTo(typeof(SqlClientDriver).AssemblyQualifiedName));
+			Assert.That(cfg.Properties[Environment.ConnectionDriver], Is.EqualTo(typeof(SqlServer2000Driver).AssemblyQualifiedName));
 			Assert.That(cfg.Properties[Environment.ReleaseConnections], Is.EqualTo(ConnectionReleaseModeParser.ToString(ConnectionReleaseMode.AfterTransaction)));
 			Assert.That(cfg.Properties[Environment.Isolation], Is.EqualTo("ReadCommitted"));
 			Assert.That(cfg.Properties[Environment.ConnectionString], Is.EqualTo(connectionString));
diff --git a/src/NHibernate.Test/CfgTest/Loquacious/LambdaConfigurationFixture.cs b/src/NHibernate.Test/CfgTest/Loquacious/LambdaConfigurationFixture.cs
index f422035fd85..62e857d73bf 100644
--- a/src/NHibernate.Test/CfgTest/Loquacious/LambdaConfigurationFixture.cs
+++ b/src/NHibernate.Test/CfgTest/Loquacious/LambdaConfigurationFixture.cs
@@ -51,7 +51,7 @@ public void FullConfiguration()
 #endif
 												db.BatchSize = 15;
 												db.ConnectionProvider();
-												db.Driver();
+												db.Driver();
 												db.ConnectionReleaseMode = ConnectionReleaseMode.AfterTransaction;
 												db.IsolationLevel = IsolationLevel.ReadCommitted;
 												db.ConnectionString = "The connection string";
@@ -92,7 +92,7 @@ public void FullConfiguration()
 			Assert.That(configure.Properties[Environment.ConnectionProvider],
 						Is.EqualTo(typeof(DebugConnectionProvider).AssemblyQualifiedName));
 			Assert.That(configure.Properties[Environment.ConnectionDriver],
-						Is.EqualTo(typeof(SqlClientDriver).AssemblyQualifiedName));
+						Is.EqualTo(typeof(SqlServer2000Driver).AssemblyQualifiedName));
 			Assert.That(configure.Properties[Environment.ReleaseConnections],
 									Is.EqualTo(ConnectionReleaseModeParser.ToString(ConnectionReleaseMode.AfterTransaction)));
 			Assert.That(configure.Properties[Environment.Isolation], Is.EqualTo("ReadCommitted"));
diff --git a/src/NHibernate.Test/DriverTest/FirebirdClientDriverFixture.cs b/src/NHibernate.Test/DriverTest/FirebirdClientDriverFixture.cs
index 2bd4177e8db..51c3df69242 100644
--- a/src/NHibernate.Test/DriverTest/FirebirdClientDriverFixture.cs
+++ b/src/NHibernate.Test/DriverTest/FirebirdClientDriverFixture.cs
@@ -9,6 +9,7 @@
 namespace NHibernate.Test.DriverTest
 {
 	[TestFixture]
+	[Obsolete("Uses old driver")]
 	public class FirebirdClientDriverFixture
 	{
 		private string _connectionString;
diff --git a/src/NHibernate.Test/DriverTest/FirebirdDriverFixture.cs b/src/NHibernate.Test/DriverTest/FirebirdDriverFixture.cs
new file mode 100644
index 00000000000..c7a51668cb2
--- /dev/null
+++ b/src/NHibernate.Test/DriverTest/FirebirdDriverFixture.cs
@@ -0,0 +1,275 @@
+using System;
+using System.Data;
+using System.Data.Common;
+using NHibernate.Driver;
+using NHibernate.SqlCommand;
+using NHibernate.SqlTypes;
+using NUnit.Framework;
+
+namespace NHibernate.Test.DriverTest
+{
+	[TestFixture]
+	public class FirebirdDriverFixture
+	{
+		private string _connectionString;
+		private FirebirdDriver _driver;
+
+		[OneTimeSetUp]
+		public void OneTimeSetup()
+		{
+			var cfg = TestConfigurationHelper.GetDefaultConfiguration();
+
+			var dlct = cfg.GetProperty("dialect");
+			if (!dlct.Contains("Firebird"))
+				Assert.Ignore("Applies only to Firebird");
+
+			_driver = new FirebirdDriver();
+			_driver.Configure(cfg.Properties);
+			_connectionString = cfg.GetProperty("connection.connection_string");
+		}
+
+		[Test]
+		public void ConnectionPooling_OpenThenCloseThenOpenAnotherOne_OnlyOneConnectionIsPooled()
+		{
+			_driver.ClearPool(_connectionString);
+
+			var allreadyEstablished = GetEstablishedConnections();
+
+			using (var connection1 = MakeConnection())
+			using (var connection2 = MakeConnection())
+			{
+				//open first connection
+				connection1.Open();
+				VerifyCountOfEstablishedConnectionsIs(allreadyEstablished + 1, "After first open");
+
+				//return it to the pool
+				connection1.Close();
+				VerifyCountOfEstablishedConnectionsIs(allreadyEstablished + 1, "After first close");
+
+				//open the second connection
+				connection2.Open();
+				VerifyCountOfEstablishedConnectionsIs(allreadyEstablished + 1, "After second open");
+
+				//return it to the pool
+				connection2.Close();
+				VerifyCountOfEstablishedConnectionsIs(allreadyEstablished + 1, "After second close");
+			}
+		}
+
+		[Test]
+		public void ConnectionPooling_OpenThenCloseTwoAtTheSameTime_TowConnectionsArePooled()
+		{
+			_driver.ClearPool(_connectionString);
+
+			var allreadyEstablished = GetEstablishedConnections();
+
+			using (var connection1 = MakeConnection())
+			using (var connection2 = MakeConnection())
+			{
+				//open first connection
+				connection1.Open();
+				VerifyCountOfEstablishedConnectionsIs(allreadyEstablished + 1, "After first open");
+
+				//open second one
+				connection2.Open();
+				VerifyCountOfEstablishedConnectionsIs(allreadyEstablished + 2, "After second open");
+
+				//return connection1 to the pool
+				connection1.Close();
+				VerifyCountOfEstablishedConnectionsIs(allreadyEstablished + 2, "After first close");
+
+				//return connection2 to the pool
+				connection2.Close();
+				VerifyCountOfEstablishedConnectionsIs(allreadyEstablished + 2, "After second close");
+			}
+		}
+
+		[Test]
+		public void AdjustCommand_StringParametersWithinConditionalSelect_ThenParameterIsWrappedByAVarcharCastStatement()
+		{
+			using (var cmd = BuildSelectCaseCommand(SqlTypeFactory.GetString(255)))
+			{
+				_driver.AdjustCommand(cmd);
+
+				var expectedCommandTxt =
+					"select (case when col = @p0 then cast(@p1 as VARCHAR(4000)) else cast(@p2 as VARCHAR(4000)) end) from table";
+				Assert.That(cmd.CommandText, Is.EqualTo(expectedCommandTxt));
+			}
+		}
+
+		[Test]
+		public void AdjustCommand_IntParametersWithinConditionalSelect_ThenParameterIsWrappedByAnIntCastStatement()
+		{
+			using (var cmd = BuildSelectCaseCommand(SqlTypeFactory.Int32))
+			{
+				_driver.AdjustCommand(cmd);
+
+				var expectedCommandTxt =
+					"select (case when col = @p0 then cast(@p1 as INTEGER) else cast(@p2 as INTEGER) end) from table";
+				Assert.That(cmd.CommandText, Is.EqualTo(expectedCommandTxt));
+			}
+		}
+
+		[Test]
+		public void AdjustCommand_ParameterWithinSelectConcat_ParameterIsCasted()
+		{
+			using (var cmd = BuildSelectConcatCommand(SqlTypeFactory.GetString(255)))
+			{
+				_driver.AdjustCommand(cmd);
+
+				var expected = "select col || cast(@p0 as VARCHAR(4000)) || col from table";
+				Assert.That(cmd.CommandText, Is.EqualTo(expected));
+			}
+		}
+
+		[Test]
+		public void AdjustCommand_ParameterWithinSelectAddFunction_ParameterIsCasted()
+		{
+			using (var cmd = BuildSelectAddCommand(SqlTypeFactory.GetString(255)))
+			{
+				_driver.AdjustCommand(cmd);
+
+				var expected = "select col + cast(@p0 as VARCHAR(4000)) from table";
+				Assert.That(cmd.CommandText, Is.EqualTo(expected));
+			}
+		}
+
+		[Test]
+		public void AdjustCommand_InsertWithParamsInSelect_ParameterIsCasted()
+		{
+			using (var cmd = BuildInsertWithParamsInSelectCommand(SqlTypeFactory.Int32))
+			{
+				_driver.AdjustCommand(cmd);
+
+				var expected = "insert into table1 (col1, col2) select col1, cast(@p0 as INTEGER) from table2";
+				Assert.That(cmd.CommandText, Is.EqualTo(expected));
+			}
+		}
+
+		[Test]
+		public void AdjustCommand_InsertWithParamsInSelect_ParameterIsNotCasted_WhenColumnNameContainsSelect()
+		{
+			using (var cmd = BuildInsertWithParamsInSelectCommandWithSelectInColumnName(SqlTypeFactory.Int32))
+			{
+				_driver.AdjustCommand(cmd);
+
+				var expected = "insert into table1 (col1_select_aaa) values(@p0) from table2";
+				Assert.That(cmd.CommandText, Is.EqualTo(expected));
+			}
+		}
+
+		[Test]
+		public void AdjustCommand_InsertWithParamsInSelect_ParameterIsNotCasted_WhenColumnNameContainsWhere()
+		{
+			using (var cmd = BuildInsertWithParamsInSelectCommandWithWhereInColumnName(SqlTypeFactory.Int32))
+			{
+				_driver.AdjustCommand(cmd);
+
+				var expected = "insert into table1 (col1_where_aaa) values(@p0) from table2";
+				Assert.That(cmd.CommandText, Is.EqualTo(expected));
+			}
+		}
+
+		private DbConnection MakeConnection()
+		{
+			var result = _driver.CreateConnection();
+			result.ConnectionString = _connectionString;
+			return result;
+		}
+
+		private void VerifyCountOfEstablishedConnectionsIs(int expectedCount, string step)
+		{
+			var physicalConnections = GetEstablishedConnections();
+			Assert.That(physicalConnections, Is.EqualTo(expectedCount), step);
+		}
+
+		private int GetEstablishedConnections()
+		{
+			using (var conn = _driver.CreateConnection())
+			{
+				conn.ConnectionString = _connectionString;
+				conn.Open();
+				using (var cmd = conn.CreateCommand())
+				{
+					cmd.CommandText = "select count(*) from mon$attachments where mon$attachment_id <> current_connection";
+					return Convert.ToInt32(cmd.ExecuteScalar());
+				}
+			}
+		}
+
+		private DbCommand BuildSelectCaseCommand(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("select (case when col = ")
+				.AddParameter()
+				.Add(" then ")
+				.AddParameter()
+				.Add(" else ")
+				.AddParameter()
+				.Add(" end) from table")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType, paramType, paramType });
+		}
+
+		private DbCommand BuildSelectConcatCommand(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("select col || ")
+				.AddParameter()
+				.Add(" || ")
+				.Add("col ")
+				.Add("from table")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType });
+		}
+
+		private DbCommand BuildSelectAddCommand(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("select col + ")
+				.AddParameter()
+				.Add(" from table")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType });
+		}
+
+		private DbCommand BuildInsertWithParamsInSelectCommand(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("insert into table1 (col1, col2) ")
+				.Add("select col1, ")
+				.AddParameter()
+				.Add(" from table2")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType });
+		}
+
+		private DbCommand BuildInsertWithParamsInSelectCommandWithSelectInColumnName(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("insert into table1 (col1_select_aaa) ")
+				.Add("values(")
+				.AddParameter()
+				.Add(") from table2")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType });
+		}
+
+		private DbCommand BuildInsertWithParamsInSelectCommandWithWhereInColumnName(SqlType paramType)
+		{
+			var sqlString = new SqlStringBuilder()
+				.Add("insert into table1 (col1_where_aaa) ")
+				.Add("values(")
+				.AddParameter()
+				.Add(") from table2")
+				.ToSqlString();
+
+			return _driver.GenerateCommand(CommandType.Text, sqlString, new[] { paramType });
+		}
+	}
+}
diff --git a/src/NHibernate.Test/DriverTest/ObsoleteDriverFixture.cs b/src/NHibernate.Test/DriverTest/ObsoleteDriverFixture.cs
new file mode 100644
index 00000000000..5ef6726ac64
--- /dev/null
+++ b/src/NHibernate.Test/DriverTest/ObsoleteDriverFixture.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections;
+using System.Linq.Dynamic.Core;
+using NHibernate.Cfg;
+using NHibernate.Connection;
+using NHibernate.Dialect;
+using NHibernate.DomainModel;
+using NHibernate.Driver;
+using NHibernate.Util;
+using NUnit.Framework;
+
+namespace NHibernate.Test.DriverTest
+{
+	[TestFixture, Obsolete]
+	public class ObsoleteDriverFixture : TestCase
+	{
+		protected override IList Mappings => new [] {"Simple.hbm.xml"};
+
+		protected override bool AppliesTo(Dialect.Dialect dialect)
+		{
+			switch (dialect)
+			{
+				case FirebirdDialect _:
+				case MsSql2000Dialect _:
+				case MsSqlCeDialect _:
+				case MySQLDialect _:
+				case PostgreSQLDialect _:
+				case SQLiteDialect _:
+					System.Type driverType = ReflectHelper.ClassForName(cfg.GetProperty(Cfg.Environment.ConnectionDriver));
+					return !(driverType.IsOdbcDriver() || driverType.IsOleDbDriver());
+				default:
+					return false;
+			}
+		}
+
+		protected override void Configure(Configuration configuration)
+		{
+			base.Configure(configuration);
+
+			System.Type driverType = ReflectHelper.ClassForName(cfg.GetProperty(Cfg.Environment.ConnectionDriver));
+			if (driverType.IsOdbcDriver() || driverType.IsOleDbDriver())
+			{
+				// ODBC and OLE DB drivers are not obsoleted, do not switch it.
+				return;
+			}
+
+			var dialect = NHibernate.Dialect.Dialect.GetDialect(configuration.Properties);
+			System.Type driver;
+			switch (dialect)
+			{
+				case FirebirdDialect _:
+					driver = typeof(FirebirdClientDriver);
+					break;
+				case MsSql2008Dialect _:
+					driver = typeof(Sql2008ClientDriver);
+					break;
+				case MsSql2000Dialect _:
+					driver = typeof(SqlClientDriver);
+					break;
+				case MsSqlCeDialect _:
+					driver = typeof(SqlServerCeDriver);
+					break;
+				case MySQLDialect _:
+					driver = typeof(MySqlDataDriver);
+					break;
+				case PostgreSQLDialect _:
+					driver = typeof(NpgsqlDriver);
+					break;
+				case SQLiteDialect _:
+					driver = typeof(SQLite20Driver);
+					break;
+				default:
+					return;
+			}
+			configuration.SetProperty(Cfg.Environment.ConnectionDriver, driver.FullName);
+		}
+
+		[Test]
+		public void GenerateObsoleteWarning()
+		{
+			using (var spy = new LogSpy(typeof(ConnectionProvider)))
+			{
+				using (BuildSessionFactory())
+				{
+					Assert.That(spy.GetWholeLog(), Does.Contain("Install the NHibernate.Driver."));
+				}
+			}
+		}
+
+		[Test]
+		public void CanUseObsoleteDriver()
+		{
+			using (var s = OpenSession())
+			using (var t = s.BeginTransaction())
+			{
+				var count = s.Query().Count();
+				Assert.That(count, Is.Zero);
+				t.Commit();
+			}
+		}
+	}
+}
diff --git a/src/NHibernate.Test/DriverTest/OdbcDriverFixture.cs b/src/NHibernate.Test/DriverTest/OdbcDriverFixture.cs
index 086df5ca30b..859b1554435 100644
--- a/src/NHibernate.Test/DriverTest/OdbcDriverFixture.cs
+++ b/src/NHibernate.Test/DriverTest/OdbcDriverFixture.cs
@@ -1,7 +1,5 @@
-using System;
 using System.Collections;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -21,7 +19,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is OdbcDriver;
+			return factory.ConnectionProvider.Driver.IsOdbcDriver();
 		}
 
 		protected override void OnTearDown()
diff --git a/src/NHibernate.Test/DriverTest/OracleDataClientDriverFixture.cs b/src/NHibernate.Test/DriverTest/OracleDataClientDriverFixture.cs
index 808a1b68dea..868b5d59b93 100644
--- a/src/NHibernate.Test/DriverTest/OracleDataClientDriverFixture.cs
+++ b/src/NHibernate.Test/DriverTest/OracleDataClientDriverFixture.cs
@@ -117,7 +117,12 @@ private static OracleDataClientDriverBase GetDriver(bool managed, IDictionary "NHibernate.Test";
 
@@ -40,7 +39,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override void OnTearDown()
diff --git a/src/NHibernate.Test/ExceptionsTest/SQLExceptionConversionTest.cs b/src/NHibernate.Test/ExceptionsTest/SQLExceptionConversionTest.cs
index 179a50a862d..5d7932a93d5 100644
--- a/src/NHibernate.Test/ExceptionsTest/SQLExceptionConversionTest.cs
+++ b/src/NHibernate.Test/ExceptionsTest/SQLExceptionConversionTest.cs
@@ -3,7 +3,6 @@
 using System.Data;
 using System.Data.Common;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Exceptions;
 using NHibernate.Util;
@@ -32,7 +31,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			var driver = factory.ConnectionProvider.Driver;
-			return !(driver is OracleDataClientDriver) && !(driver is OracleManagedDataClientDriver) && !(driver is OracleLiteDataClientDriver) && !(driver is OdbcDriver) && !(driver is OleDbDriver);
+			return !(driver.IsOracleDataClientDriver()) && !(driver.IsOracleManagedDataClientDriver()) && !(driver.IsOracleLiteDataClientDriver()) && !(driver.IsOdbcDriver()) && !(driver.IsOleDbDriver());
 		}
 
 		protected override void Configure(Cfg.Configuration configuration)
diff --git a/src/NHibernate.Test/Futures/FallbackFixture.cs b/src/NHibernate.Test/Futures/FallbackFixture.cs
index 57992b53798..f1255b31005 100644
--- a/src/NHibernate.Test/Futures/FallbackFixture.cs
+++ b/src/NHibernate.Test/Futures/FallbackFixture.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Linq;
 using NHibernate.Cfg;
 using NHibernate.Connection;
@@ -10,13 +11,13 @@
 
 namespace NHibernate.Test.Futures
 {
-	public class TestDriverThatDoesntSupportQueryBatching : SqlClientDriver
+	public class TestDriverThatDoesntSupportQueryBatching : SqlServer2000Driver
 	{
 		public override bool SupportsMultipleQueries => false;
 	}
 
 	/// 
-	/// I'm using a Driver which derives from SqlClientDriver to
+	/// I'm using a Driver which derives from SqlServer2000Driver to
 	/// return false for the SupportsMultipleQueries property. This is purely to test the way NHibernate
 	/// will behave when the driver that's being used does not support multiple queries... so even though
 	/// the test is using MsSql, it's only relevant for databases that don't support multiple queries
@@ -38,7 +39,7 @@ protected override void Configure(Configuration configuration)
 			base.Configure(configuration);
 			using (var cp = ConnectionProviderFactory.NewConnectionProvider(cfg.Properties))
 			{
-				if (cp.Driver is SqlClientDriver)
+				if (cp.Driver.IsSqlClientDriver())
 				{
 					configuration.Properties[Environment.ConnectionDriver] =
 						typeof(TestDriverThatDoesntSupportQueryBatching).AssemblyQualifiedName;
diff --git a/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs b/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs
index 75e6a3f8d81..7f1c9eb1a34 100644
--- a/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs
+++ b/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs
@@ -1,6 +1,5 @@
 using System.Linq;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Hql.Ast.ANTLR;
 using NHibernate.Util;
 using NUnit.Framework;
@@ -14,7 +13,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		{
 			return dialect.SupportsVariableLimit
 				&& !(Dialect is Dialect.MsSql2000Dialect && // don't know why, but these tests don't work on SQL Server using ODBC
-					typeof(OdbcDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)))); 
+					ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)).IsOdbcDriver()); 
 		}
 
 		protected override void OnSetUp()
diff --git a/src/NHibernate.Test/Insertordering/InsertOrderingFixture.cs b/src/NHibernate.Test/Insertordering/InsertOrderingFixture.cs
index 0fa36657138..c9647148b74 100644
--- a/src/NHibernate.Test/Insertordering/InsertOrderingFixture.cs
+++ b/src/NHibernate.Test/Insertordering/InsertOrderingFixture.cs
@@ -8,7 +8,6 @@
 using NHibernate.AdoNet;
 using NHibernate.Cfg;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.SqlCommand;
 using NHibernate.SqlTypes;
@@ -42,7 +41,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// Custom batcher does not support oledb driver.
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override void Configure(Configuration configuration)
diff --git a/src/NHibernate.Test/Linq/ByMethod/GroupByTests.cs b/src/NHibernate.Test/Linq/ByMethod/GroupByTests.cs
index 4601013f556..7c82722826a 100644
--- a/src/NHibernate.Test/Linq/ByMethod/GroupByTests.cs
+++ b/src/NHibernate.Test/Linq/ByMethod/GroupByTests.cs
@@ -5,7 +5,6 @@
 using System.Text.RegularExpressions;
 using NHibernate.Dialect;
 using NHibernate.DomainModel.Northwind.Entities;
-using NHibernate.Driver;
 using NHibernate.Linq;
 using NUnit.Framework;
 
@@ -551,7 +550,7 @@ public void GroupByComputedValue()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.Orders.GroupBy(o => o.Customer.CustomerId == null ? 0 : 1).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -563,7 +562,7 @@ public void GroupByComputedValueInAnonymousType()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.Orders.GroupBy(o => new { Key = o.Customer.CustomerId == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -575,7 +574,7 @@ public void GroupByComputedValueInObjectArray()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.Orders.GroupBy(o => new[] { o.Customer.CustomerId == null ? 0 : 1, }).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -704,7 +703,7 @@ public void GroupByComputedValueWithJoinOnObject()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.OrderLines.GroupBy(o => o.Order.Customer == null ? 0 : 1).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -716,7 +715,7 @@ public void GroupByComputedValueWithJoinOnId()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.OrderLines.GroupBy(o => o.Order.Customer.CustomerId == null ? 0 : 1).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -728,7 +727,7 @@ public void GroupByComputedValueInAnonymousTypeWithJoinOnObject()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.OrderLines.GroupBy(o => new { Key = o.Order.Customer == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -740,7 +739,7 @@ public void GroupByComputedValueInAnonymousTypeWithJoinOnId()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.OrderLines.GroupBy(o => new { Key = o.Order.Customer.CustomerId == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -752,7 +751,7 @@ public void GroupByComputedValueInObjectArrayWithJoinOnObject()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.OrderLines.GroupBy(o => new[] { o.Order.Customer == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -764,7 +763,7 @@ public void GroupByComputedValueInObjectArrayWithJoinOnId()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.OrderLines.GroupBy(o => new[] { o.Order.Customer.CustomerId == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -776,7 +775,7 @@ public void GroupByComputedValueInObjectArrayWithJoinInRightSideOfCase()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.OrderLines.GroupBy(o => new[] { o.Order.Customer.CustomerId == null ? "unknown" : o.Order.Customer.CompanyName }).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -788,7 +787,7 @@ public void GroupByComputedValueFromNestedArraySelect()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.OrderLines.Select(o => new object[] { o }).GroupBy(x => new object[] { ((OrderLine)x[0]).Order.Customer == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
@@ -800,7 +799,7 @@ public void GroupByComputedValueFromNestedObjectSelect()
 		{
 			if (!TestDialect.SupportsComplexExpressionInGroupBy)
 				Assert.Ignore(Dialect.GetType().Name + " does not support complex group by expressions");
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver())
 				Assert.Ignore("SQL Server seems unable to match complex group by and select list arguments when running over ODBC.");
 
 			var orderGroups = db.OrderLines.Select(o => new { OrderLine = (object)o }).GroupBy(x => new object[] { ((OrderLine)x.OrderLine).Order.Customer == null ? 0 : 1 }).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
diff --git a/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffsetFixture.cs b/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffsetFixture.cs
index b4b80b3a979..1abf13fa653 100644
--- a/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffsetFixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffsetFixture.cs
@@ -4,7 +4,6 @@
 using System.IO;
 using System.Runtime.Serialization.Formatters.Binary;
 using System.Xml.Serialization;
-using NHibernate.Driver;
 using NHibernate.Type;
 using NUnit.Framework;
 
@@ -21,7 +20,7 @@ protected override IList Mappings
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
 			// Cannot handle DbType.DateTimeOffset via ODBC.
-			if (factory.ConnectionProvider.Driver is OdbcDriver)
+			if (factory.ConnectionProvider.Driver.IsOdbcDriver())
 				return false;
 
 			return base.AppliesTo(factory);
diff --git a/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffsetQueryFixture.cs b/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffsetQueryFixture.cs
index 5fb7bca6261..18611b1bd21 100644
--- a/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffsetQueryFixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/Dates/DateTimeOffsetQueryFixture.cs
@@ -2,7 +2,6 @@
 using System.Collections;
 using System.Data;
 using System.Linq;
-using NHibernate.Driver;
 using NHibernate.Type;
 using NUnit.Framework;
 using Environment = NHibernate.Cfg.Environment;
@@ -21,7 +20,7 @@ protected override IList Mappings
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
 			// Cannot handle DbType.DateTimeOffset via ODBC.
-			if (factory.ConnectionProvider.Driver is OdbcDriver)
+			if (factory.ConnectionProvider.Driver.IsOdbcDriver())
 				return false;
 
 			return base.AppliesTo(factory);
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1547/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH1547/Fixture.cs
index 5dc6705647b..63b4809752d 100644
--- a/src/NHibernate.Test/NHSpecificTest/GH1547/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/GH1547/Fixture.cs
@@ -153,16 +153,13 @@ public IDisposable SubstituteCommand()
 
 		public void CleanUp()
 		{
-			if (_driverImplementation is FirebirdClientDriver fbDriver)
-			{
-				// Firebird will pool each connection created during the test and will marked as used any table
-				// referenced by queries. It will at best delays those tables drop until connections are actually
-				// closed, or immediately fail dropping them.
-				// This results in other tests failing when they try to create tables with same name.
-				// By clearing the connection pool the tables will get dropped. This is done by the following code.
-				// Moved from NH1908 test case, contributed by Amro El-Fakharany.
-				fbDriver.ClearPool(null);
-			}
+			// Firebird will pool each connection created during the test and will marked as used any table
+			// referenced by queries. It will at best delays those tables drop until connections are actually
+			// closed, or immediately fail dropping them.
+			// This results in other tests failing when they try to create tables with same name.
+			// By clearing the connection pool the tables will get dropped. This is done by the following code.
+			// Moved from NH1908 test case, contributed by Amro El-Fakharany.
+			_driverImplementation.ClearPoolForFirebirdClientDriver();
 		}
 
 		#endregion
diff --git a/src/NHibernate.Test/NHSpecificTest/NH1144/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1144/Fixture.cs
index be3b8d7a7b0..221afacfb3c 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH1144/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH1144/Fixture.cs
@@ -1,7 +1,6 @@
 using log4net.Core;
 using NHibernate.AdoNet;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Util;
 using NUnit.Framework;
 
@@ -26,7 +25,7 @@ protected override void Configure(Configuration configuration)
 		[Test]
 		public void CanSaveInSingleBatch()
 		{
-			if (!typeof(OracleDataClientDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver))))
+			if (!ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)).IsOracleDataClientDriver())
 			{
 				Assert.Ignore("Only applicable for Oracle Data Client driver");
 			}
diff --git a/src/NHibernate.Test/NHSpecificTest/NH1507/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1507/Fixture.cs
index 2c072d90c87..b54bdf9dcac 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH1507/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH1507/Fixture.cs
@@ -1,6 +1,5 @@
 using System;
 using System.Collections;
-using NHibernate.Driver;
 using NUnit.Framework;
 
 namespace NHibernate.Test.NHSpecificTest.NH1507
@@ -10,7 +9,7 @@ public class Fixture : BugTestCase
 	{
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
-			return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+			return !(factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
 		}
 
 		protected override void OnSetUp()
@@ -117,4 +116,4 @@ public void ImplicitJoinFailingTest()
 			}
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs b/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs
index d485cae2227..c119adeff97 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs
@@ -2,7 +2,6 @@
 using System.Data;
 using NHibernate.Cfg;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 using NUnit.Framework.Constraints;
@@ -129,7 +128,7 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// SQLUpdateConflictToStaleStateExceptionConverter is specific to Sql client driver, and does not work
 			// with Odbc (and likeley Oledb).
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		private bool _isSnapshotIsolationAlreadyAllowed;
diff --git a/src/NHibernate.Test/NHSpecificTest/NH1756/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1756/Fixture.cs
index 8098a37ca7a..57fcda1d470 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH1756/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH1756/Fixture.cs
@@ -1,6 +1,5 @@
 using System.Collections.Generic;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -30,7 +29,7 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory)
 			//     N'@P1 nvarchar(18),@P2 int,@P3 datetime2',N'modified test book',1,'2017-08-02 16:37:16.0630000'
 			// Setting the scale to 2 still causes failure for two thirds of tries, due to 3ms/7ms being truncated in such case
 			// with ODBC and SQL Server 2008+ Client, which is rejected by ODBC.
-			return !(factory.ConnectionProvider.Driver is OdbcDriver);
+			return !(factory.ConnectionProvider.Driver.IsOdbcDriver());
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2020/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2020/Fixture.cs
index c1f79a62f32..ab96c5ab2bd 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2020/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH2020/Fixture.cs
@@ -1,6 +1,5 @@
 using NUnit.Framework;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Exceptions;
 using NHibernate.Test.ExceptionsTest;
 using NHibernate.Engine;
@@ -26,7 +25,7 @@ protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// Use a SQL Server Client exception converter, cannot work for ODBC or OleDb
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override void OnTearDown()
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2207/SampleTest.cs b/src/NHibernate.Test/NHSpecificTest/NH2207/SampleTest.cs
index c84162a1e75..40d332899c7 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2207/SampleTest.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH2207/SampleTest.cs
@@ -1,7 +1,6 @@
 using System;
 using System.Data;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -17,7 +16,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is Sql2008ClientDriver;
+			return factory.ConnectionProvider.Driver.IsSql2008ClientDriver();
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2296/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2296/Fixture.cs
index 04ccee45786..c56a9ad5ef4 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2296/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH2296/Fixture.cs
@@ -1,5 +1,4 @@
 using System.Linq;
-using NHibernate.Driver;
 using NUnit.Framework;
 
 namespace NHibernate.Test.NHSpecificTest.NH2296
@@ -9,7 +8,7 @@ public class Fixture : BugTestCase
 	{
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
-			return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+			return !(factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
 		}
 
 		protected override void OnSetUp()
@@ -73,4 +72,4 @@ public void Test()
 			}
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2302/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2302/Fixture.cs
index fb0b651da7b..9ea7437bb9d 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2302/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH2302/Fixture.cs
@@ -1,6 +1,5 @@
 using System.Data;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Mapping;
 using NUnit.Framework;
 
@@ -38,7 +37,7 @@ protected override void OnTearDown()
         [Test]
         public void StringHugeLength()
         {
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver || Dialect is MsSqlCeDialect)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver() || Dialect is MsSqlCeDialect)
 				Assert.Ignore("NH-4065, not fixed for Odbc and MsSqlCe");
 
             int id;
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs
index 1c80edf6de7..38195842ac7 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs
@@ -4,7 +4,6 @@
 using System.Configuration;
 using System.Transactions;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -62,7 +61,7 @@ public void ShouldBeAbleToReleaseSuppliedConnectionAfterDistributedTransaction()
 						new DummyEnlistment(),
 						EnlistmentOptions.None);
 
-					if (Sfi.ConnectionProvider.Driver.GetType() == typeof(OdbcDriver))
+					if (Sfi.ConnectionProvider.Driver.GetType().IsOdbcDriver())
 						connection = new OdbcConnection(connectionString);
 					else
 						connection = new SqlConnection(connectionString);
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs b/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs
index 19e7ae2a6d1..82cb3f662b2 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH2660And2661/Test.cs
@@ -39,7 +39,7 @@ protected override void Configure(Configuration configuration)
 				{
 					// to be sure we are using the new drive
 					base.Configure(configuration);
-					configuration.DataBaseIntegration(x=> x.Driver());
+					configuration.DataBaseIntegration(x=> x.Driver());
 				}
 
 		[Test]
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2846/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2846/Fixture.cs
index f20da6a7aa3..370e06fce5b 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2846/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH2846/Fixture.cs
@@ -1,5 +1,4 @@
 using System.Linq;
-using NHibernate.Driver;
 using NHibernate.Linq;
 using NUnit.Framework;
 
@@ -10,7 +9,7 @@ public class Fixture : BugTestCase
 	{
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
-			return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+			return !(factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
 		}
 
 		protected override void OnSetUp()
diff --git a/src/NHibernate.Test/NHSpecificTest/NH2852/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2852/Fixture.cs
index 9ab184192f2..0646e67d5e9 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH2852/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH2852/Fixture.cs
@@ -1,5 +1,4 @@
 using System.Linq;
-using NHibernate.Driver;
 using NHibernate.Linq;
 using NUnit.Framework;
 
@@ -10,7 +9,7 @@ public class Fixture : BugTestCase
 	{
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
-			return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+			return !(factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
 		}
 
 		protected override void OnSetUp()
@@ -81,4 +80,4 @@ public void AlsoFails()
 			}
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3004/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3004/Fixture.cs
index 706eb379177..8ea465009c0 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3004/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3004/Fixture.cs
@@ -13,7 +13,7 @@ public void RemoveUnusedCommandParametersBug_1()
 			/* UseNamedPrefixInSql       is true 
 			 * UseNamedPrefixInParameter is false
 			 * */
-			var driver = new TestSqlClientDriver(true, false);
+			var driver = new TestSqlServerDriver(true, false);
 
 			RunTest(driver);
 		}
@@ -24,12 +24,12 @@ public void RemoveUnusedCommandParametersBug_2()
 			/* UseNamedPrefixInSql       is true 
 			 * UseNamedPrefixInParameter is true
 			 * */
-			var driver = new TestSqlClientDriver(true, true);
+			var driver = new TestSqlServerDriver(true, true);
 
 			RunTest(driver);
 		}
 
-		private static void RunTest(TestSqlClientDriver driver)
+		private static void RunTest(TestSqlServerDriver driver)
 		{
 			var command = driver.CreateCommand();
 
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3004/FixtureObsolete.cs b/src/NHibernate.Test/NHSpecificTest/NH3004/FixtureObsolete.cs
new file mode 100644
index 00000000000..cb357f3d473
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/NH3004/FixtureObsolete.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections;
+using NHibernate.SqlCommand;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.NH3004
+{
+	[TestFixture]
+	[Obsolete("Uses old driver")]
+	public class FixtureObsolete
+	{
+		[Test]
+		public void RemoveUnusedCommandParametersBug_1()
+		{
+			/* UseNamedPrefixInSql       is true 
+			 * UseNamedPrefixInParameter is false
+			 * */
+			var driver = new TestSqlClientDriver(true, false);
+
+			RunTest(driver);
+		}
+
+		[Test]
+		public void RemoveUnusedCommandParametersBug_2()
+		{
+			/* UseNamedPrefixInSql       is true 
+			 * UseNamedPrefixInParameter is true
+			 * */
+			var driver = new TestSqlClientDriver(true, true);
+
+			RunTest(driver);
+		}
+
+		private static void RunTest(TestSqlClientDriver driver)
+		{
+			var command = driver.CreateCommand();
+
+			var usedParam = command.CreateParameter();
+			usedParam.ParameterName = driver.FormatNameForParameter("p0");
+			command.Parameters.Add(usedParam);
+
+			var unusedParam = command.CreateParameter();
+			unusedParam.ParameterName = driver.FormatNameForParameter("unused");
+			command.Parameters.Add(unusedParam);
+
+			Assert.AreEqual(command.Parameters.Count, 2);
+
+			SqlString sqlString = new SqlStringBuilder()
+				.AddParameter()
+				.ToSqlString();
+
+			driver.RemoveUnusedCommandParameters(command, sqlString);
+
+			Assert.AreEqual(command.Parameters.Count, 1);
+			
+			Assert.AreEqual(command.Parameters[0], usedParam);
+		}
+	}
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3004/TestSqlClientDriver.cs b/src/NHibernate.Test/NHSpecificTest/NH3004/TestSqlClientDriver.cs
index 24297856ff0..52a8b962569 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3004/TestSqlClientDriver.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3004/TestSqlClientDriver.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Data.SqlClient;
 using NHibernate.AdoNet;
 using NHibernate.Dialect;
@@ -11,6 +12,7 @@ namespace NHibernate.Test.NHSpecificTest.NH3004
 	/// 
 	/// A NHibernate Driver for using the SqlClient DataProvider
 	/// 
+	[Obsolete("Uses old driver")]
 	public class TestSqlClientDriver : SqlClientDriver
 	{
 		bool _UseNamedPrefixInSql = true;
@@ -38,4 +40,4 @@ public override bool UseNamedPrefixInParameter
 			get { return _UseNamedPrefixInParameter; }
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3004/TestSqlServerDriver.cs b/src/NHibernate.Test/NHSpecificTest/NH3004/TestSqlServerDriver.cs
new file mode 100644
index 00000000000..961e1a30a79
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/NH3004/TestSqlServerDriver.cs
@@ -0,0 +1,35 @@
+using NHibernate.Driver;
+
+namespace NHibernate.Test.NHSpecificTest.NH3004
+{
+	/// 
+	/// A NHibernate Driver for using the SqlClient DataProvider
+	/// 
+	public class TestSqlServerDriver : SqlServer2000Driver
+	{
+		bool _UseNamedPrefixInSql = true;
+		bool _UseNamedPrefixInParameter = false;
+
+		public TestSqlServerDriver()
+		{
+
+		}
+
+		public TestSqlServerDriver(bool UseNamedPrefixInSql, bool UseNamedPrefixInParameter)
+		{
+			_UseNamedPrefixInSql = UseNamedPrefixInSql;
+			_UseNamedPrefixInParameter = UseNamedPrefixInParameter;
+		}
+
+		public override bool UseNamedPrefixInSql
+		{
+			get { return _UseNamedPrefixInSql; }
+			
+		}
+
+		public override bool UseNamedPrefixInParameter
+		{
+			get { return _UseNamedPrefixInParameter; }
+		}
+	}
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3023/DeadlockConnectionPoolIssueTest.cs b/src/NHibernate.Test/NHSpecificTest/NH3023/DeadlockConnectionPoolIssueTest.cs
index f460546d6ad..e2fa79bec3a 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3023/DeadlockConnectionPoolIssueTest.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3023/DeadlockConnectionPoolIssueTest.cs
@@ -10,7 +10,6 @@
 using log4net.Repository.Hierarchy;
 using NHibernate.Cfg;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -32,7 +31,7 @@ protected override void Configure(Configuration configuration)
 
 		// Uses directly SqlConnection.
 		protected override bool AppliesTo(ISessionFactoryImplementor factory) =>
-			factory.ConnectionProvider.Driver is SqlClientDriver &&
+			factory.ConnectionProvider.Driver.IsSqlClientDriver() &&
 			factory.ConnectionProvider.Driver.SupportsSystemTransactions;
 
 		protected override bool AppliesTo(Dialect.Dialect dialect) =>
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3121/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3121/Fixture.cs
index 353d93e06fb..ccf19f218e0 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3121/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3121/Fixture.cs
@@ -3,7 +3,6 @@
 using System.Linq;
 using System.Reflection;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NUnit.Framework;
 
 namespace NHibernate.Test.NHSpecificTest.NH3121
@@ -24,10 +23,10 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		[Test]
 		public void ShouldThrowWhenByteArrayTooLong()
 		{
-			// For SQL Server only the SqlClientDriver sets parameter lengths
+			// For SQL Server only the SqlServer2000Driver sets parameter lengths
 			// even when there is no length specified in the mapping. The ODBC
 			// driver won't cause the truncation issue and hence not the exception.
-			if (!(Sfi.ConnectionProvider.Driver is SqlClientDriver))
+			if (!(Sfi.ConnectionProvider.Driver.IsSqlClientDriver()))
 				Assert.Ignore("Test limited to drivers that sets parameter length even with no length specified in the mapping.");
 
 			const int reportSize = 17158;
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3142/ChildrenTest.cs b/src/NHibernate.Test/NHSpecificTest/NH3142/ChildrenTest.cs
index cc1b1d1d6d7..b3ed2a39e57 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3142/ChildrenTest.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3142/ChildrenTest.cs
@@ -1,7 +1,6 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
-using NHibernate.Driver;
 using NUnit.Framework;
 
 namespace NHibernate.Test.NHSpecificTest.NH3142
@@ -11,7 +10,7 @@ public class ChildrenTest : BugTestCase
 	{
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
-			return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+			return !(factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
 		}
 
 		protected override void OnSetUp()
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3202/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3202/Fixture.cs
index 8734c483c18..45b3ddd62ff 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3202/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3202/Fixture.cs
@@ -16,7 +16,7 @@ protected override void Configure(Configuration configuration)
 			if (!(Dialect is MsSql2008Dialect))
 				Assert.Ignore("Test is for MS SQL Server dialect only (custom dialect).");
 
-			if (!typeof(SqlClientDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver))))
+			if (!ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)).IsSqlClientDriver())
 				Assert.Ignore("Test is for MS SQL Server driver only (custom driver is used).");
 
 			cfg.SetProperty(Environment.Dialect, typeof(OffsetStartsAtOneTestDialect).AssemblyQualifiedName);
@@ -98,14 +98,8 @@ public void OffsetStartingAtOneSetsParameterToSkipValuePlusOne()
 		}
 	}
 
-	public class OffsetStartsAtOneTestDialect : MsSql2008Dialect
-	{
-		public bool ForceOffsetStartsAtOne { get; set; }
-		public override bool OffsetStartsAtOne { get { return ForceOffsetStartsAtOne; } }
-	}
-
 
-	public class OffsetTestDriver : SqlClientDriver
+	public class OffsetTestDriver : SqlServer2000Driver
 	{
 		public OffsetStartsAtOneTestDialect OffsetStartsAtOneTestDialect;
 		private int _offsetParameterIndex = 1;
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3202/FixtureObsolete.cs b/src/NHibernate.Test/NHSpecificTest/NH3202/FixtureObsolete.cs
new file mode 100644
index 00000000000..0a5cefbe271
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/NH3202/FixtureObsolete.cs
@@ -0,0 +1,125 @@
+using System;
+using System.Data.Common;
+using System.Text.RegularExpressions;
+using NHibernate.Cfg;
+using NHibernate.Dialect;
+using NHibernate.Driver;
+using NHibernate.Util;
+using NUnit.Framework;
+using Environment = NHibernate.Cfg.Environment;
+
+namespace NHibernate.Test.NHSpecificTest.NH3202
+{
+	[TestFixture]
+	[Obsolete("Uses old driver")]
+	public class FixtureObsolete : BugTestCase
+	{
+		protected override void Configure(Configuration configuration)
+		{
+			if (!(Dialect is MsSql2008Dialect))
+				Assert.Ignore("Test is for MS SQL Server dialect only (custom dialect).");
+
+			if (!ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)).IsSqlClientDriver())
+				Assert.Ignore("Test is for MS SQL Server driver only (custom driver is used).");
+
+			cfg.SetProperty(Environment.Dialect, typeof(OffsetStartsAtOneTestDialect).AssemblyQualifiedName);
+			cfg.SetProperty(Environment.ConnectionDriver, typeof(OffsetTestObsoleteDriver).AssemblyQualifiedName);
+		}
+
+		private OffsetStartsAtOneTestDialect OffsetStartsAtOneTestDialect
+		{
+			get { return (OffsetStartsAtOneTestDialect)Sfi.Dialect; }
+		}
+
+		private OffsetTestObsoleteDriver CustomDriver
+		{
+			get { return (OffsetTestObsoleteDriver)Sfi.ConnectionProvider.Driver; }
+		}
+
+		protected override void OnSetUp()
+		{
+			CustomDriver.OffsetStartsAtOneTestDialect = OffsetStartsAtOneTestDialect;
+
+			base.OnSetUp();
+
+			using (var session = OpenSession())
+			using (var transaction = session.BeginTransaction())
+			{
+				session.Save(new SequencedItem(1));
+				session.Save(new SequencedItem(2));
+				session.Save(new SequencedItem(3));
+
+				session.Flush();
+				transaction.Commit();
+			}
+		}
+
+		protected override void OnTearDown()
+		{
+			using (ISession s = OpenSession())
+			using (ITransaction t = s.BeginTransaction())
+			{
+				s.Delete("from SequencedItem");
+				t.Commit();
+			}
+			base.OnTearDown();
+		}
+
+
+		[Test]
+		public void OffsetNotStartingAtOneSetsParameterToSkipValue()
+		{
+			OffsetStartsAtOneTestDialect.ForceOffsetStartsAtOne = false;
+
+			using (var session = OpenSession())
+			{
+				var item2 =
+				session.QueryOver()
+					.OrderBy(i => i.I).Asc
+					.Take(1).Skip(2)
+					.SingleOrDefault();
+
+				Assert.That(CustomDriver.OffsetParameterValueFromCommand, Is.EqualTo(2));
+			}
+		}
+
+		[Test]
+		public void OffsetStartingAtOneSetsParameterToSkipValuePlusOne()
+		{
+			OffsetStartsAtOneTestDialect.ForceOffsetStartsAtOne = true;
+
+			using (var session = OpenSession())
+			{
+				var item2 =
+				session.QueryOver()
+					.OrderBy(i => i.I).Asc
+					.Take(1).Skip(2)
+					.SingleOrDefault();
+
+				Assert.That(CustomDriver.OffsetParameterValueFromCommand, Is.EqualTo(3));
+			}
+		}
+	}
+
+
+	[Obsolete("Uses old driver")]
+	public class OffsetTestObsoleteDriver : SqlClientDriver
+	{
+		public OffsetStartsAtOneTestDialect OffsetStartsAtOneTestDialect;
+		private int _offsetParameterIndex = 1;
+
+		public int? OffsetParameterValueFromCommand { get; private set; }
+
+		protected override void OnBeforePrepare(DbCommand command)
+		{
+			base.OnBeforePrepare(command);
+			OffsetParameterValueFromCommand = null;
+
+			bool hasLimit = new Regex(@"select\s+top").IsMatch(command.CommandText.ToLower());
+			if (!hasLimit)
+				return;
+
+			OffsetParameterValueFromCommand = (int)command.Parameters[_offsetParameterIndex].Value;
+		}
+	}
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3202/OffsetStartsAtOneTestDialect.cs b/src/NHibernate.Test/NHSpecificTest/NH3202/OffsetStartsAtOneTestDialect.cs
new file mode 100644
index 00000000000..adc4a57a6a0
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/NH3202/OffsetStartsAtOneTestDialect.cs
@@ -0,0 +1,10 @@
+using NHibernate.Dialect;
+
+namespace NHibernate.Test.NHSpecificTest.NH3202
+{
+	public class OffsetStartsAtOneTestDialect : MsSql2008Dialect
+	{
+		public bool ForceOffsetStartsAtOne { get; set; }
+		public override bool OffsetStartsAtOne { get { return ForceOffsetStartsAtOne; } }
+	}
+}
\ No newline at end of file
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3252/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3252/Fixture.cs
index 2638158af72..1483a4db734 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3252/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3252/Fixture.cs
@@ -1,6 +1,5 @@
 using System;
 using System.Linq;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Linq;
 using NUnit.Framework;
@@ -12,7 +11,7 @@ public class Fixture : BugTestCase
 	{
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3405/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3405/Fixture.cs
index d687fc1dcb5..9ae781a5fc0 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3405/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3405/Fixture.cs
@@ -4,7 +4,6 @@
 using NHibernate.Cfg;
 using NHibernate.Cfg.MappingSchema;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Linq;
 using NHibernate.Mapping.ByCode;
@@ -34,7 +33,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// No Xml support with Odbc (and likely OleDb too).
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override HbmMapping GetMappings()
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3518/XmlColumnTest.cs b/src/NHibernate.Test/NHSpecificTest/NH3518/XmlColumnTest.cs
index 832f8f30cb4..114bc3debee 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3518/XmlColumnTest.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3518/XmlColumnTest.cs
@@ -1,7 +1,6 @@
 using System.Xml;
 using NHibernate.Cfg;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -27,7 +26,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override void Configure(Configuration configuration)
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3620/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3620/Fixture.cs
index 232c5016cc9..f9b53041236 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3620/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3620/Fixture.cs
@@ -1,12 +1,11 @@
 using System;
-using NHibernate.Driver;
 using NUnit.Framework;
 
 namespace NHibernate.Test.NHSpecificTest.NH3620 {
     [TestFixture]
     public class Fixture : BugTestCase {
         protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) {
-            return (factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
+            return (factory.ConnectionProvider.Driver.IsOracleManagedDataClientDriver());
         }
 
         protected override void OnTearDown() {
@@ -40,4 +39,4 @@ private void CleanupData() {
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3844/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3844/Fixture.cs
index d8cca9fe754..e4a64852bd9 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3844/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3844/Fixture.cs
@@ -1,5 +1,4 @@
 using System.Linq;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Linq;
 using NUnit.Framework;
@@ -17,7 +16,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// SQL Server seems unable to match complex group by and select list arguments when running over ODBC.";
-			return !(factory.ConnectionProvider.Driver is OdbcDriver);
+			return !(factory.ConnectionProvider.Driver.IsOdbcDriver());
 		}
 
 		protected override void OnSetUp()
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3850/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3850/Fixture.cs
index cb3f7d48245..5bae8e45eba 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3850/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3850/Fixture.cs
@@ -5,7 +5,6 @@
 using System.Linq;
 using System.Reflection;
 using System.Text;
-using NHibernate.Driver;
 using NHibernate.Linq;
 using NHibernate.SqlTypes;
 using NHibernate.Util;
@@ -30,7 +29,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
 		{
 			// Cannot handle DbType.DateTimeOffset via ODBC.
-			return !(factory.ConnectionProvider.Driver is OdbcDriver);
+			return !(factory.ConnectionProvider.Driver.IsOdbcDriver());
 		}
 
 		protected override void OnSetUp()
diff --git a/src/NHibernate.Test/NHSpecificTest/NH3912/ReusableBatcherFixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3912/ReusableBatcherFixture.cs
index 396fd38a48a..d803ea9de98 100644
--- a/src/NHibernate.Test/NHSpecificTest/NH3912/ReusableBatcherFixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/NH3912/ReusableBatcherFixture.cs
@@ -3,7 +3,6 @@
 using NHibernate.AdoNet;
 using NHibernate.Cfg;
 using NHibernate.Cfg.MappingSchema;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Linq;
 using NHibernate.Mapping.ByCode;
@@ -17,9 +16,9 @@ public class ReusableBatcherFixture : TestCaseMappingByCode
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			var driver = factory.ConnectionProvider.Driver;
-			return driver is OracleDataClientDriver ||
-			       driver is OracleLiteDataClientDriver ||
-			       driver is OracleManagedDataClientDriver;
+			return driver.IsOracleDataClientDriver() ||
+			       driver.IsOracleLiteDataClientDriver() ||
+			       driver.IsOracleManagedDataClientDriver();
 		}
 
 		protected override HbmMapping GetMappings()
diff --git a/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs
index 5d822391ca9..312495477ff 100644
--- a/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs
@@ -1,5 +1,4 @@
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -21,7 +20,7 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory)
 			// tend to (validly) send InvalidOperationException during prepare phase due to the closed
 			// connection, which get not converted. For testing other case, maybe a failure caused by a
 			// schema mismatch (like done in transaction tests) would be better.
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj
index f6b65d9db1d..5d2c79cfd8e 100644
--- a/src/NHibernate.Test/NHibernate.Test.csproj
+++ b/src/NHibernate.Test/NHibernate.Test.csproj
@@ -53,8 +53,6 @@
     
     
     
-    
-    
   
   
     
@@ -62,37 +60,26 @@
     
     
     
-    
-    
-    
-    
   
   
-    
     
     
     
     
-    
-  
-  
-    
-    
-      %(RecursiveDir)%(Filename)%(Extension)
-      PreserveNewest
-    
-  
-  
-    
-    
-      %(RecursiveDir)%(Filename)%(Extension)
-      PreserveNewest
-    
   
   
     
+    
+    
+    
+    
     
   
+  
+    
+    
+    
+  
   
     
   
diff --git a/src/NHibernate.Test/Pagination/CustomDialectFixture.cs b/src/NHibernate.Test/Pagination/CustomDialectFixture.cs
index 3ff7517e819..05cc45e0bdc 100644
--- a/src/NHibernate.Test/Pagination/CustomDialectFixture.cs
+++ b/src/NHibernate.Test/Pagination/CustomDialectFixture.cs
@@ -3,7 +3,6 @@
 using NHibernate.Cfg;
 using NHibernate.Criterion;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Util;
 using NUnit.Framework;
 using Environment = NHibernate.Cfg.Environment;
@@ -29,7 +28,7 @@ protected override void Configure(Configuration configuration)
 			if (!(Dialect is MsSql2005Dialect))
 				Assert.Ignore("Test is for SQL dialect only");
 			var driverClass = ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver));
-			if (!typeof(SqlClientDriver).IsAssignableFrom(driverClass))
+			if (!driverClass.IsSqlClientDriver())
 				Assert.Ignore("Test is compatible only with Sql Server Client driver connection strings");
 
 			cfg.SetProperty(Environment.Dialect, typeof(CustomMsSqlDialect).AssemblyQualifiedName);
@@ -123,4 +122,4 @@ public void LimitFirstMultiCriteria()
 			}
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Pagination/CustomMsSqlDriver.cs b/src/NHibernate.Test/Pagination/CustomMsSqlDriver.cs
index 3ba118a3d7f..5c1319be06f 100644
--- a/src/NHibernate.Test/Pagination/CustomMsSqlDriver.cs
+++ b/src/NHibernate.Test/Pagination/CustomMsSqlDriver.cs
@@ -1,7 +1,5 @@
 using System.Data.Common;
-using System.Text.RegularExpressions;
 using NHibernate.Driver;
-using NUnit.Framework;
 
 namespace NHibernate.Test.Pagination
 {
@@ -9,7 +7,7 @@ namespace NHibernate.Test.Pagination
 	/// Class to work with CustomMsSqlDialect to allow
 	/// verification of simulated limit parameters
 	/// 
-	public class CustomMsSqlDriver : SqlClientDriver
+	public class CustomMsSqlDriver : SqlServer2000Driver
 	{
 		public CustomMsSqlDialect CustomMsSqlDialect;
 
@@ -33,4 +31,4 @@ protected override void OnBeforePrepare(DbCommand command)
 			base.OnBeforePrepare(command);
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs b/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs
index d30f493cfe8..1db753cc697 100644
--- a/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs
+++ b/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs
@@ -14,7 +14,7 @@ protected override IList Mappings
 
 		protected override bool AppliesTo(NHibernate.Engine.ISessionFactoryImplementor factory)
 		{
-			return factory.ConnectionProvider.Driver is Driver.OracleDataClientDriver;
+			return factory.ConnectionProvider.Driver.IsOracleDataClientDriver();
 		}
 
 		protected override bool AppliesTo(Dialect.Dialect dialect)
@@ -57,4 +57,4 @@ public void RefCursorOutStoredProcedure()
 		}
 
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs b/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs
index ab0abc53a0c..031f69dd0f2 100644
--- a/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs
+++ b/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs
@@ -1,6 +1,5 @@
 using System.Collections;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NUnit.Framework;
 
@@ -17,7 +16,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// Tested resulting SQL depends on driver.
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		protected override string GetExpectedInsertOrgLogStatement(string orgName)
diff --git a/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs b/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs
index 12c4cc12d1d..95a30c0a6cf 100644
--- a/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs
+++ b/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs
@@ -4,9 +4,7 @@
 using System.Threading;
 using System.Transactions;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Engine;
-using NHibernate.Linq;
 using NHibernate.Test.TransactionTest;
 using NUnit.Framework;
 
@@ -179,7 +177,7 @@ public void CanUseSessionWithManyScopes(bool explicitFlush)
 			// ODBC with SQL-Server always causes scopes to go distributed, which causes their transaction completion to run
 			// asynchronously. But ODBC enlistment also check the previous transaction in a way that do not guard against it
 			// being concurrently disposed of. See https://github.com/nhibernate/nhibernate-core/pull/1505 for more details.
-			Assume.That(!(Sfi.ConnectionProvider.Driver is OdbcDriver),
+			Assume.That(!(Sfi.ConnectionProvider.Driver.IsOdbcDriver()),
 			            "ODBC sometimes fails on second scope by checking the previous transaction status, which may yield an object disposed exception");
 
 			using (var s = WithOptions().ConnectionReleaseMode(ConnectionReleaseMode.OnClose).OpenSession())
diff --git a/src/NHibernate.Test/SystemTransactions/SystemTransactionFixtureBase.cs b/src/NHibernate.Test/SystemTransactions/SystemTransactionFixtureBase.cs
index 6a13a609c2a..eb31c95f8c3 100644
--- a/src/NHibernate.Test/SystemTransactions/SystemTransactionFixtureBase.cs
+++ b/src/NHibernate.Test/SystemTransactions/SystemTransactionFixtureBase.cs
@@ -1,7 +1,6 @@
 using System;
 using System.Text.RegularExpressions;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Test.TransactionTest;
 using NHibernate.Util;
@@ -32,7 +31,7 @@ protected void DisableConnectionAutoEnlist(Configuration configuration)
 			var autoEnlistmentKeyword = "Enlist";
 			var autoEnlistmentKeywordPattern = autoEnlistmentKeyword;
 			if (configuration.GetDerivedProperties().TryGetValue(Cfg.Environment.ConnectionDriver, out var driver) &&
-				typeof(MySqlDataDriver).IsAssignableFrom(ReflectHelper.ClassForName(driver)))
+				ReflectHelper.ClassForName(driver).IsMySqlDataDriver())
 			{
 				autoEnlistmentKeyword = "AutoEnlist";
 				autoEnlistmentKeywordPattern = "Auto ?Enlist";
@@ -143,4 +142,4 @@ public override void AfterTransactionCompletion(ITransaction tx)
 			}
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/TestCase.cs b/src/NHibernate.Test/TestCase.cs
index 13f82daf61e..6cdc58ae4f4 100644
--- a/src/NHibernate.Test/TestCase.cs
+++ b/src/NHibernate.Test/TestCase.cs
@@ -15,7 +15,6 @@
 using NUnit.Framework.Interfaces;
 using System.Text;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 
 namespace NHibernate.Test
 {
@@ -296,16 +295,13 @@ protected virtual void DropSchema()
 
 		public static void DropSchema(bool useStdOut, SchemaExport export, ISessionFactoryImplementor sfi)
 		{
-			if (sfi?.ConnectionProvider.Driver is FirebirdClientDriver fbDriver)
-			{
-				// Firebird will pool each connection created during the test and will marked as used any table
-				// referenced by queries. It will at best delays those tables drop until connections are actually
-				// closed, or immediately fail dropping them.
-				// This results in other tests failing when they try to create tables with same name.
-				// By clearing the connection pool the tables will get dropped. This is done by the following code.
-				// Moved from NH1908 test case, contributed by Amro El-Fakharany.
-				fbDriver.ClearPool(null);
-			}
+			// Firebird will pool each connection created during the test and will marked as used any table
+			// referenced by queries. It will at best delays those tables drop until connections are actually
+			// closed, or immediately fail dropping them.
+			// This results in other tests failing when they try to create tables with same name.
+			// By clearing the connection pool the tables will get dropped. This is done by the following code.
+			// Moved from NH1908 test case, contributed by Amro El-Fakharany.
+			sfi?.ConnectionProvider.Driver.ClearPoolForFirebirdClientDriver();
 
 			export.Drop(useStdOut, true);
 		}
diff --git a/src/NHibernate.Test/TestEmbeddedConfig.cfg.xml b/src/NHibernate.Test/TestEmbeddedConfig.cfg.xml
index 25058dae03a..6ba543f0cb3 100644
--- a/src/NHibernate.Test/TestEmbeddedConfig.cfg.xml
+++ b/src/NHibernate.Test/TestEmbeddedConfig.cfg.xml
@@ -3,10 +3,10 @@
 	
 		NHibernate.Test.DebugConnectionProvider, NHibernate.Test
 		NHibernate.Cache.HashtableCacheProvider, NHibernate
-		NHibernate.Driver.SqlClientDriver
+		NHibernate.Driver.SqlServer2000Driver, NHibernate.Driver.SqlServer
 		Server=localhost;initial catalog=nhibernate;User Id=;Password=
 		true 1, false 0, yes 1, no 0
 		NHibernate.Dialect.MsSql2000Dialect
 		NHibernate.Test.CfgTest.ConfigurationFixture+SampleQueryProvider, NHibernate.Test
 	
-
\ No newline at end of file
+
diff --git a/src/NHibernate.Test/TestingExtensions.cs b/src/NHibernate.Test/TestingExtensions.cs
new file mode 100644
index 00000000000..ed93240560b
--- /dev/null
+++ b/src/NHibernate.Test/TestingExtensions.cs
@@ -0,0 +1,136 @@
+using NHibernate.Driver;
+
+namespace NHibernate.Test
+{
+	public static class TestingExtensions
+	{
+		public static bool IsOdbcDriver(this IDriver driver)
+		{
+			if (driver is OdbcDriver) return true;
+			return false;
+		}
+
+		public static bool IsOdbcDriver(this System.Type driverClass)
+		{
+			if (typeof(OdbcDriver).IsAssignableFrom(driverClass)) return true;
+			return false;
+		}
+
+		public static bool IsOleDbDriver(this IDriver driver)
+		{
+			if (driver is OleDbDriver) return true;
+			return false;
+		}
+
+		public static bool IsOleDbDriver(this System.Type driverClass)
+		{
+			if (typeof(OleDbDriver).IsAssignableFrom(driverClass)) return true;
+			return false;
+		}
+
+		/// 
+		/// Matches both SQL Server 2000 and 2008 drivers
+		/// 
+		public static bool IsSqlClientDriver(this IDriver driver)
+		{
+#pragma warning disable 618
+			if (driver is SqlClientDriver) return true;
+#pragma warning restore 618
+			if (driver is SqlServer2000Driver) return true;
+			return false;
+		}
+
+		/// 
+		/// Matches both SQL Server 2000 and 2008 drivers
+		/// 
+		public static bool IsSqlClientDriver(this System.Type driverClass)
+		{
+#pragma warning disable 618
+			if (typeof(SqlClientDriver).IsAssignableFrom(driverClass)) return true;
+#pragma warning restore 618
+			if (typeof(SqlServer2000Driver).IsAssignableFrom(driverClass)) return true;
+			return false;
+		}
+
+		public static bool IsSql2008ClientDriver(this IDriver driver)
+		{
+#pragma warning disable 618
+			if (driver is Sql2008ClientDriver) return true;
+#pragma warning restore 618
+			if (driver is SqlServer2008Driver) return true;
+			return false;
+		}
+
+		public static bool IsMySqlDataDriver(this System.Type driverClass)
+		{
+#pragma warning disable 618
+			if (typeof(MySqlDataDriver).IsAssignableFrom(driverClass)) return true;
+#pragma warning restore 618
+			if (typeof(MySqlDriver).IsAssignableFrom(driverClass)) return true;
+			return false;
+		}
+
+
+		public static bool IsFirebirdClientDriver(this IDriver driver)
+		{
+#pragma warning disable 618
+			if (driver is FirebirdClientDriver) return true;
+#pragma warning restore 618
+			if (driver is FirebirdDriver) return true;
+			return false;
+		}
+
+		/// 
+		/// If driver is Firebird, clear the pool.
+		/// Firebird will pool each connection created during the test and will marked as used any table
+		/// referenced by queries. It will at best delays those tables drop until connections are actually
+		/// closed, or immediately fail dropping them.
+		/// This results in other tests failing when they try to create tables with same name.
+		/// By clearing the connection pool the tables will get dropped. This is done by the following code.
+		/// Moved from NH1908 test case, contributed by Amro El-Fakharany.
+		/// 
+		public static void ClearPoolForFirebirdClientDriver(this IDriver driver)
+		{
+			switch (driver)
+			{
+#pragma warning disable 618
+				case FirebirdClientDriver fbDriver:
+					fbDriver.ClearPool(null);
+					break;
+#pragma warning restore 618
+				case FirebirdDriver fbDriver2:
+					fbDriver2.ClearPool(null);
+					break;
+			}
+		}
+
+		public static bool IsOracleDataClientDriver(this IDriver driver)
+		{
+			if (driver is OracleDataClientDriver) return true;
+			return false;
+		}
+
+		public static bool IsOracleDataClientDriver(this System.Type driverClass)
+		{
+			if (typeof(OracleDataClientDriver).IsAssignableFrom(driverClass)) return true;
+			return false;
+		}
+
+		public static bool IsOracleLiteDataClientDriver(this IDriver driver)
+		{
+			if (driver is OracleLiteDataClientDriver) return true;
+			return false;
+		}
+
+		public static bool IsOracleManagedDataClientDriver(this IDriver driver)
+		{
+#pragma warning disable 618
+			if (driver is OracleManagedDataClientDriver) return true;
+#pragma warning restore 618
+#if NETFX
+			if (driver is OracleManagedDriver) return true;
+#endif
+			return false;
+		}
+	}
+}
diff --git a/src/NHibernate.Test/Tools/hbm2ddl/SchemaMetadataUpdaterTest/SchemaMetadataUpdaterFixture.cs b/src/NHibernate.Test/Tools/hbm2ddl/SchemaMetadataUpdaterTest/SchemaMetadataUpdaterFixture.cs
index 62141b92a21..34884cc9762 100644
--- a/src/NHibernate.Test/Tools/hbm2ddl/SchemaMetadataUpdaterTest/SchemaMetadataUpdaterFixture.cs
+++ b/src/NHibernate.Test/Tools/hbm2ddl/SchemaMetadataUpdaterTest/SchemaMetadataUpdaterFixture.cs
@@ -2,7 +2,6 @@
 using System.Collections.Generic;
 using System.Linq;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Mapping;
 using NHibernate.Tool.hbm2ddl;
@@ -104,7 +103,7 @@ public void EnsureReservedWordsHardCodedInDialect()
 				}
 			}
 
-			if (sf.ConnectionProvider.Driver is OdbcDriver)
+			if (sf.ConnectionProvider.Driver.IsOdbcDriver())
 			{
 				Assert.Inconclusive("ODBC has excess keywords reserved");
 			}
@@ -257,7 +256,7 @@ public void WhenConfiguredOnlyExplicitAutoQuote()
 			var configuration = TestConfigurationHelper.GetDefaultConfiguration();
 			var driverClass = ReflectHelper.ClassForName(configuration.GetProperty(Environment.ConnectionDriver));
 			// Test uses the default dialect driver, which will not accept Odbc or OleDb connection strings.
-			if (typeof(OdbcDriver).IsAssignableFrom(driverClass) || typeof(OleDbDriver).IsAssignableFrom(driverClass))
+			if (driverClass.IsOdbcDriver() || driverClass.IsOleDbDriver())
 				Assert.Ignore("Test is not compatible with OleDb or ODBC driver connection strings");
 			var configuredDialect = Dialect.Dialect.GetDialect();
 			if(!configuredDialect.DefaultProperties.ContainsKey(Environment.ConnectionDriver))
diff --git a/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs b/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs
index 7ccd282a9cb..9e20b80389b 100644
--- a/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs
+++ b/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs
@@ -2,7 +2,6 @@
 using System.IO;
 using System.Reflection;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.Tool.hbm2ddl;
 using NHibernate.Util;
 using NUnit.Framework;
@@ -19,7 +18,7 @@ private void MigrateSchema(string resource1, string resource2)
 			var driverClass = ReflectHelper.ClassForName(v1cfg.GetProperty(Environment.ConnectionDriver));
 			// Odbc is not supported by schema update: System.Data.Odbc.OdbcConnection.GetSchema("ForeignKeys") fails with an ArgumentException: ForeignKeys is undefined.
 			// It seems it would require its own DataBaseSchema, but this is bound to the dialect, not the driver.
-			if (typeof(OdbcDriver).IsAssignableFrom(driverClass))
+			if (driverClass.IsOdbcDriver())
 				Assert.Ignore("Test is not compatible with ODBC");
 
 			using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource1))
@@ -65,4 +64,4 @@ public void SimpleColumnReplace()
 			MigrateSchema(resource1, resource2);
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs b/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs
index ff54e4fab02..9c82e76f58e 100644
--- a/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs
+++ b/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs
@@ -584,16 +584,13 @@ DbParameter IDriver.GenerateParameter(DbCommand command, string name, SqlType sq
 
 		public void CleanUp()
 		{
-			if (_driverImplementation is FirebirdClientDriver fbDriver)
-			{
-				// Firebird will pool each connection created during the test and will marked as used any table
-				// referenced by queries. It will at best delays those tables drop until connections are actually
-				// closed, or immediately fail dropping them.
-				// This results in other tests failing when they try to create tables with same name.
-				// By clearing the connection pool the tables will get dropped. This is done by the following code.
-				// Moved from NH1908 test case, contributed by Amro El-Fakharany.
-				fbDriver.ClearPool(null);
-			}
+			// Firebird will pool each connection created during the test and will marked as used any table
+			// referenced by queries. It will at best delays those tables drop until connections are actually
+			// closed, or immediately fail dropping them.
+			// This results in other tests failing when they try to create tables with same name.
+			// By clearing the connection pool the tables will get dropped. This is done by the following code.
+			// Moved from NH1908 test case, contributed by Amro El-Fakharany.
+			_driverImplementation.ClearPoolForFirebirdClientDriver();
 		}
 
 		#endregion
diff --git a/src/NHibernate.Test/TypesTest/DateTime2TypeFixture.cs b/src/NHibernate.Test/TypesTest/DateTime2TypeFixture.cs
index 5eec555af67..dd703c724a4 100644
--- a/src/NHibernate.Test/TypesTest/DateTime2TypeFixture.cs
+++ b/src/NHibernate.Test/TypesTest/DateTime2TypeFixture.cs
@@ -1,5 +1,4 @@
 using System;
-using NHibernate.Driver;
 using NHibernate.SqlTypes;
 using NHibernate.Type;
 using NUnit.Framework;
@@ -18,7 +17,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) =>
 
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) =>
 			// Cannot handle DbType.DateTime2 via .Net ODBC.
-			!(factory.ConnectionProvider.Driver is OdbcDriver);
+			!(factory.ConnectionProvider.Driver.IsOdbcDriver());
 
 		protected override string TypeName => "DateTime2";
 		protected override AbstractDateTimeType Type => NHibernateUtil.DateTime2;
@@ -45,7 +44,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) =>
 
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) =>
 			// Cannot handle DbType.DateTime2 via .Net ODBC.
-			!(factory.ConnectionProvider.Driver is OdbcDriver);
+			!(factory.ConnectionProvider.Driver.IsOdbcDriver());
 
 		protected override string TypeName => "DateTime2WithScale";
 		protected override AbstractDateTimeType Type => (AbstractDateTimeType)TypeFactory.GetDateTime2Type(3);
diff --git a/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs b/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs
index 0881a08e878..664e1635da4 100644
--- a/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs
+++ b/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs
@@ -2,7 +2,6 @@
 using System.Data;
 using System.Linq;
 using NHibernate.Cfg;
-using NHibernate.Driver;
 using NHibernate.SqlTypes;
 using NHibernate.Tool.hbm2ddl;
 using NHibernate.Type;
@@ -26,7 +25,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) =>
 
 		protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) =>
 			// Cannot handle DbType.DateTimeOffset via .Net ODBC.
-			!(factory.ConnectionProvider.Driver is OdbcDriver);
+			!(factory.ConnectionProvider.Driver.IsOdbcDriver());
 
 		protected override void Configure(Configuration configuration)
 		{
diff --git a/src/NHibernate.Test/TypesTest/StringTypeWithLengthFixture.cs b/src/NHibernate.Test/TypesTest/StringTypeWithLengthFixture.cs
index e3e2367f0ea..688cfcc0a73 100644
--- a/src/NHibernate.Test/TypesTest/StringTypeWithLengthFixture.cs
+++ b/src/NHibernate.Test/TypesTest/StringTypeWithLengthFixture.cs
@@ -3,7 +3,6 @@
 using NHibernate.Cfg.MappingSchema;
 using NHibernate.Criterion;
 using NHibernate.Dialect;
-using NHibernate.Driver;
 using NHibernate.Exceptions;
 using NHibernate.Mapping.ByCode;
 using NUnit.Framework;
@@ -66,7 +65,7 @@ protected override void OnTearDown()
 		public void ShouldPreventInsertionOfVeryLongStringThatWouldBeTruncated()
 		{
 			// This test case is for when the current driver will use a parameter size
-			// that is significantly larger than the mapped column size (e.g. SqlClientDriver currently).
+			// that is significantly larger than the mapped column size (e.g. SqlServer2000Driver currently).
 
 			// Note: This test could possible be written as
 			//   "database must raise an error OR it must store and return the full value"
@@ -119,7 +118,7 @@ public void CanCompareLongValueWithLongString()
 		{
 			var maxStringLength = GetLongStringMappedLength();
 
-			if (Sfi.ConnectionProvider.Driver is OdbcDriver && maxStringLength >= 2000)
+			if (Sfi.ConnectionProvider.Driver.IsOdbcDriver() && maxStringLength >= 2000)
 				Assert.Ignore("Odbc wrecks nvarchar parameter types when they are longer than 2000, it switch them to ntext");
 
 			var longString = new string('x', maxStringLength);
diff --git a/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs b/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs
index 6d256dc556c..1391c472adc 100644
--- a/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs
+++ b/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs
@@ -1,6 +1,5 @@
 using System.Data;
 using System.Xml.Linq;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.SqlTypes;
 using NHibernate.Type;
@@ -24,7 +23,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// No Xml support with Odbc (and likely OleDb too).
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		[Test]
diff --git a/src/NHibernate.Test/TypesTest/XmlDocTypeFixture.cs b/src/NHibernate.Test/TypesTest/XmlDocTypeFixture.cs
index 128e83f63be..ee821c56144 100644
--- a/src/NHibernate.Test/TypesTest/XmlDocTypeFixture.cs
+++ b/src/NHibernate.Test/TypesTest/XmlDocTypeFixture.cs
@@ -1,6 +1,5 @@
 using System.Data;
 using System.Xml;
-using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.SqlTypes;
 using NHibernate.Type;
@@ -24,7 +23,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
 		protected override bool AppliesTo(ISessionFactoryImplementor factory)
 		{
 			// No Xml support with Odbc (and likely OleDb too).
-			return factory.ConnectionProvider.Driver is SqlClientDriver;
+			return factory.ConnectionProvider.Driver.IsSqlClientDriver();
 		}
 
 		[Test]
diff --git a/src/NHibernate.TestDatabaseSetup/App.config b/src/NHibernate.TestDatabaseSetup/App.config
index 1fa471187b0..4ae2d69e5c4 100644
--- a/src/NHibernate.TestDatabaseSetup/App.config
+++ b/src/NHibernate.TestDatabaseSetup/App.config
@@ -1,4 +1,4 @@
-
+
 
   
     
     
-      NHibernate.Driver.Sql2008ClientDriver
+      NHibernate.Driver.SqlServer2008Driver, NHibernate.Driver.SqlServer
       
         Server=.\SQLExpress;initial catalog=master;Integrated Security=SSPI
       
diff --git a/src/NHibernate.TestDatabaseSetup/TestDatabaseSetup.cs b/src/NHibernate.TestDatabaseSetup/TestDatabaseSetup.cs
index 46944c3abf3..2b5eea03013 100644
--- a/src/NHibernate.TestDatabaseSetup/TestDatabaseSetup.cs
+++ b/src/NHibernate.TestDatabaseSetup/TestDatabaseSetup.cs
@@ -20,17 +20,25 @@ public class DatabaseSetup
 		private static readonly IDictionary> SetupMethods = new Dictionary>
 			{
 				{"NHibernate.Driver.SqlClientDriver", SetupSqlServer},
+				{"NHibernate.Driver.SqlServer2000Driver, NHibernate.Driver.SqlServer", SetupSqlServer},
 				{"NHibernate.Driver.Sql2008ClientDriver", SetupSqlServer},
+				{"NHibernate.Driver.SqlServer2008Driver, NHibernate.Driver.SqlServer", SetupSqlServer},
 				{"NHibernate.Driver.FirebirdClientDriver", SetupFirebird},
+				{"NHibernate.Driver.FirebirdDriver, NHibernate.Driver.Firebird", SetupFirebird},
 				{"NHibernate.Driver.NpgsqlDriver", SetupNpgsql},
+				{"NHibernate.Driver.PostgreSqlDriver, NHibernate.Driver.PostgreSql", SetupNpgsql},
 				{"NHibernate.Driver.OracleDataClientDriver", SetupOracle},
 				{"NHibernate.Driver.MySqlDataDriver", SetupMySql},
+				{"NHibernate.Driver.MySqlDriver, NHibernate.Driver.MySql", SetupMySql},
 				{"NHibernate.Driver.OracleClientDriver", SetupOracle},
 				{"NHibernate.Driver.OracleManagedDataClientDriver", SetupOracle},
+				{"NHibernate.Driver.OracleManagedDriver, NHibernate.Driver.Oracle.Managed", SetupOracle},
 				{"NHibernate.Driver.OdbcDriver", SetupSqlServerOdbc},
 #if NETFX
 				{"NHibernate.Driver.SQLite20Driver", SetupSQLite},
-				{"NHibernate.Driver.SqlServerCeDriver", SetupSqlServerCe}
+				{"NHibernate.Driver.SQLiteDriver, NHibernate.Driver.SQLite", SetupSQLite},
+				{"NHibernate.Driver.SqlServerCeDriver", SetupSqlServerCe},
+				{"NHibernate.Driver.SqlServerCompactDriver, NHibernate.Driver.SqlServer.Compact", SetupSqlServerCe},
 #endif
 			};
 
diff --git a/src/NHibernate.sln b/src/NHibernate.sln
index 67d957ed5d6..d425d64e8e3 100644
--- a/src/NHibernate.sln
+++ b/src/NHibernate.sln
@@ -1,6 +1,6 @@
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.26730.12
+VisualStudioVersion = 15.0.27004.2010
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{593DCEA7-C933-46F3-939F-D8172399AB05}"
 	ProjectSection(SolutionItems) = preProject
@@ -24,6 +24,22 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.TestDatabaseSetu
 EndProject
 Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "NHibernate.Test.VisualBasic", "NHibernate.Test.VisualBasic\NHibernate.Test.VisualBasic.vbproj", "{7C2EF610-BCA0-4D1F-898A-DE9908E4970C}"
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Drivers", "Drivers", "{2A64334E-8456-4426-B50A-6172C6C3FDD5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.SqlServer", "NHibernate.Driver.SqlServer\NHibernate.Driver.SqlServer.csproj", "{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.SQLite", "NHibernate.Driver.SQLite\NHibernate.Driver.SQLite.csproj", "{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.PostgreSql", "NHibernate.Driver.PostgreSql\NHibernate.Driver.PostgreSql.csproj", "{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.Oracle.Managed", "NHibernate.Driver.Oracle.Managed\NHibernate.Driver.Oracle.Managed.csproj", "{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.Firebird", "NHibernate.Driver.Firebird\NHibernate.Driver.Firebird.csproj", "{DADD54C1-3679-4672-9774-9362428EB9E0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.SqlServer.Compact", "NHibernate.Driver.SqlServer.Compact\NHibernate.Driver.SqlServer.Compact.csproj", "{11B3C504-D501-4766-AC36-0CF1A813815B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NHibernate.Driver.MySql", "NHibernate.Driver.MySql\NHibernate.Driver.MySql.csproj", "{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -50,10 +66,47 @@ Global
 		{7C2EF610-BCA0-4D1F-898A-DE9908E4970C}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{7C2EF610-BCA0-4D1F-898A-DE9908E4970C}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{7C2EF610-BCA0-4D1F-898A-DE9908E4970C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39}.Release|Any CPU.Build.0 = Release|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DADD54C1-3679-4672-9774-9362428EB9E0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{11B3C504-D501-4766-AC36-0CF1A813815B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{CF9FEEC5-3403-4F3F-9E4F-F0BAFE95DE39} = {2A64334E-8456-4426-B50A-6172C6C3FDD5}
+		{99FE5A5C-F732-40A3-BEE6-ED5ADC393862} = {2A64334E-8456-4426-B50A-6172C6C3FDD5}
+		{C7C835DC-0A59-4227-9C3C-0AF0633CD68C} = {2A64334E-8456-4426-B50A-6172C6C3FDD5}
+		{22409381-1808-4F0A-9C42-9FAA6B3BCFA2} = {2A64334E-8456-4426-B50A-6172C6C3FDD5}
+		{DADD54C1-3679-4672-9774-9362428EB9E0} = {2A64334E-8456-4426-B50A-6172C6C3FDD5}
+		{11B3C504-D501-4766-AC36-0CF1A813815B} = {2A64334E-8456-4426-B50A-6172C6C3FDD5}
+		{4F5F0C13-F302-4CEE-B60E-A55D7C30E3F8} = {2A64334E-8456-4426-B50A-6172C6C3FDD5}
+	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {E2025263-49BD-45D7-B628-8BDD471B546C}
 	EndGlobalSection
diff --git a/src/NHibernate/Async/Dialect/Dialect.cs b/src/NHibernate/Async/Dialect/Dialect.cs
index fd92f72de29..659b23ec832 100644
--- a/src/NHibernate/Async/Dialect/Dialect.cs
+++ b/src/NHibernate/Async/Dialect/Dialect.cs
@@ -10,6 +10,7 @@
 
 using System;
 using System.Collections;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Data;
 using System.Data.Common;
@@ -18,6 +19,7 @@
 using NHibernate.Dialect.Function;
 using NHibernate.Dialect.Lock;
 using NHibernate.Dialect.Schema;
+using NHibernate.Driver;
 using NHibernate.Exceptions;
 using NHibernate.Id;
 using NHibernate.Mapping;
diff --git a/src/NHibernate/Connection/ConnectionProvider.cs b/src/NHibernate/Connection/ConnectionProvider.cs
index 6a1882515b6..5be968a63bf 100644
--- a/src/NHibernate/Connection/ConnectionProvider.cs
+++ b/src/NHibernate/Connection/ConnectionProvider.cs
@@ -112,9 +112,49 @@ protected virtual void ConfigureDriver(IDictionary settings)
 				{
 					throw new HibernateException("Could not create the driver from " + driverClass + ".", e);
 				}
+
+#pragma warning disable 618
+				switch (driver)
+				{
+					case NpgsqlDriver _:
+						LogObsoleteDriver(nameof(NpgsqlDriver), "PostgreSql", "PostgreSqlDriver");
+						break;
+					case MySqlDataDriver _:
+						LogObsoleteDriver(nameof(MySqlDataDriver), "MySql", "MySqlDriver");
+						break;
+					case FirebirdClientDriver _:
+						LogObsoleteDriver(nameof(FirebirdClientDriver), "Firebird", "FirebirdDriver");
+						break;
+					case OracleManagedDataClientDriver _:
+						LogObsoleteDriver(nameof(OracleManagedDataClientDriver), "Oracle.Managed", "OracleManagedDriver");
+						break;
+					case SQLite20Driver _:
+						LogObsoleteDriver(nameof(SQLite20Driver), "SQLite", "SQLiteDriver");
+						break;
+					case Sql2008ClientDriver _:
+						LogObsoleteDriver(nameof(Sql2008ClientDriver), "SqlServer", "SqlServer2008Driver");
+						break;
+					case SqlClientDriver _:
+						LogObsoleteDriver(nameof(SqlClientDriver), "SqlServer", "SqlServer2000Driver");
+						break;
+					case SqlServerCeDriver _:
+						LogObsoleteDriver(nameof(SqlServerCeDriver), "SqlServer.Compact", "SqlServerCompactDriver");
+						break;
+				}
+#pragma warning restore 618
 			}
 		}
 
+		private static void LogObsoleteDriver(string obsoleteDriverName, string nugetName, string newDriverName)
+		{
+			log.Warn(
+				"Using \"{0}\" from main NHibernate package is obsolete." 
+				+ "  Install the NHibernate.Driver.{1} NuGet package and change " + Environment.ConnectionDriver + " setting to \"NHibernate.Driver.{2}, NHibernate.Driver.{1}\".",
+				obsoleteDriverName,
+				nugetName,
+				newDriverName);
+		}
+
 		/// 
 		/// Gets the  for the 
 		/// to connect to the database.
diff --git a/src/NHibernate/Dialect/DB2400Dialect.cs b/src/NHibernate/Dialect/DB2400Dialect.cs
index aa306a0d05a..775864621b1 100644
--- a/src/NHibernate/Dialect/DB2400Dialect.cs
+++ b/src/NHibernate/Dialect/DB2400Dialect.cs
@@ -15,7 +15,7 @@ namespace NHibernate.Dialect
 	///		
 	///		- 
 	///			connection.driver_class
-	///			
+	///			NHibernate.Driver.DB2400Driver
 	///		/// 
 	/// 
@@ -61,4 +61,4 @@ public override bool SupportsVariableLimit
 			get { return false; }
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate/Dialect/DB2Dialect.cs b/src/NHibernate/Dialect/DB2Dialect.cs
index 6186ef6d81c..cc26e73099c 100644
--- a/src/NHibernate/Dialect/DB2Dialect.cs
+++ b/src/NHibernate/Dialect/DB2Dialect.cs
@@ -18,7 +18,7 @@ namespace NHibernate.Dialect
 	///		
 	///
- 
 	///			connection.driver_class
-	///			
+	///			NHibernate.Driver.DB2Driver
 	///		/// 
 	/// 
diff --git a/src/NHibernate/Dialect/Dialect.cs b/src/NHibernate/Dialect/Dialect.cs
index 7cf2a77d7e2..9a2cfa2bd9d 100644
--- a/src/NHibernate/Dialect/Dialect.cs
+++ b/src/NHibernate/Dialect/Dialect.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Collections;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Data;
 using System.Data.Common;
@@ -8,6 +9,7 @@
 using NHibernate.Dialect.Function;
 using NHibernate.Dialect.Lock;
 using NHibernate.Dialect.Schema;
+using NHibernate.Driver;
 using NHibernate.Exceptions;
 using NHibernate.Id;
 using NHibernate.Mapping;
@@ -47,6 +49,7 @@ public abstract partial class Dialect
 		private readonly IDictionary _sqlFunctions;
 
 		private static readonly IDictionary StandardAggregateFunctions = CollectionHelper.CreateCaseInsensitiveHashtable();
+		private static readonly ConcurrentDictionary ExternalDriverExistsCache = new ConcurrentDictionary();
 
 		private static readonly IViolatedConstraintNameExtracter Extracter;
 
@@ -2576,5 +2579,12 @@ public virtual ISQLExceptionConverter BuildSQLExceptionConverter()
 			// may override to return whatever is most appropriate for that vendor.
 			return new SQLStateConverter(ViolatedConstraintNameExtracter);
 		}
+
+		internal static string GetDriverName(string preferredName) where TFallback : IDriver
+		{
+			return ExternalDriverExistsCache.GetOrAdd(preferredName, s => ReflectHelper.ClassForFullNameOrNull(s) == null)
+				? typeof(TFallback).FullName
+				: preferredName;
+		}
 	}
 }
diff --git a/src/NHibernate/Dialect/FirebirdDialect.cs b/src/NHibernate/Dialect/FirebirdDialect.cs
index 5883dfe2344..50e0cc3829a 100644
--- a/src/NHibernate/Dialect/FirebirdDialect.cs
+++ b/src/NHibernate/Dialect/FirebirdDialect.cs
@@ -4,9 +4,11 @@
 using System.Data.Common;
 using NHibernate.Dialect.Function;
 using NHibernate.Dialect.Schema;
+using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.SqlCommand;
 using NHibernate.Type;
+using NHibernate.Util;
 using Environment = NHibernate.Cfg.Environment;
 
 namespace NHibernate.Dialect
@@ -23,7 +25,7 @@ namespace NHibernate.Dialect
 	///		
 	///
- 
 	///			connection.driver_class
-	///			
+	///			NHibernate.Driver.FirebirdDriver, NHibernate.Driver.Firebird
 	///		/// 
 	/// 
@@ -34,7 +36,10 @@ public FirebirdDialect()
 			RegisterKeywords();
 			RegisterColumnTypes();
 			RegisterFunctions();
-			DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.FirebirdClientDriver";
+			DefaultProperties[Environment.ConnectionDriver] =
+#pragma warning disable 618
+				GetDriverName("NHibernate.Driver.FirebirdDriver, NHibernate.Driver.Firebird");
+#pragma warning restore 618
 		}
 
 		public override string AddColumnString
diff --git a/src/NHibernate/Dialect/InformixDialect.cs b/src/NHibernate/Dialect/InformixDialect.cs
index 2fdef648f86..463dd9b8ed6 100644
--- a/src/NHibernate/Dialect/InformixDialect.cs
+++ b/src/NHibernate/Dialect/InformixDialect.cs
@@ -28,7 +28,7 @@ namespace NHibernate.Dialect
 	///		
 	///
- 
 	///			connection.driver_class
-	///			
+	///			NHibernate.Driver.OdbcDriver
 	///		/// 
 	/// 
diff --git a/src/NHibernate/Dialect/InformixDialect0940.cs b/src/NHibernate/Dialect/InformixDialect0940.cs
index 59ef5b7a6e6..7c22a4ac9b5 100644
--- a/src/NHibernate/Dialect/InformixDialect0940.cs
+++ b/src/NHibernate/Dialect/InformixDialect0940.cs
@@ -26,7 +26,7 @@ namespace NHibernate.Dialect
     ///		
     ///
- 
     ///			connection.driver_class
-    ///			
+    ///			NHibernate.Driver.OdbcDriver
     ///		/// 
     /// 
diff --git a/src/NHibernate/Dialect/InformixDialect1000.cs b/src/NHibernate/Dialect/InformixDialect1000.cs
index db4c9781591..1b7d7cf503e 100644
--- a/src/NHibernate/Dialect/InformixDialect1000.cs
+++ b/src/NHibernate/Dialect/InformixDialect1000.cs
@@ -25,7 +25,7 @@ namespace NHibernate.Dialect
     ///		
     ///
- 
     ///			connection.driver_class
-    ///			
+    ///			NHibernate.Driver.OdbcDriver
     ///		/// 
     /// 
diff --git a/src/NHibernate/Dialect/IngresDialect.cs b/src/NHibernate/Dialect/IngresDialect.cs
index f6197f328ae..9d029e92861 100644
--- a/src/NHibernate/Dialect/IngresDialect.cs
+++ b/src/NHibernate/Dialect/IngresDialect.cs
@@ -15,7 +15,7 @@ namespace NHibernate.Dialect
 	///		
 	///
- 
 	///			connection.driver_class
-	///			
+	///			NHibernate.Driver.IngresDriver
 	///		/// 
 	/// 
diff --git a/src/NHibernate/Dialect/MsSql2000Dialect.cs b/src/NHibernate/Dialect/MsSql2000Dialect.cs
index 929fc15ac74..a6004299be0 100644
--- a/src/NHibernate/Dialect/MsSql2000Dialect.cs
+++ b/src/NHibernate/Dialect/MsSql2000Dialect.cs
@@ -5,6 +5,7 @@
 using System.Text.RegularExpressions;
 using NHibernate.Dialect.Function;
 using NHibernate.Dialect.Schema;
+using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.Mapping;
 using NHibernate.SqlCommand;
@@ -27,7 +28,7 @@ namespace NHibernate.Dialect
 	///	
 	///
- 
 	///		connection.driver_class
-	///		
+	///		NHibernate.Driver.SqlServer2000Driver, NHibernate.Driver.SqlServer
 	///	///
- 
 	///		adonet.batch_size
@@ -68,7 +69,10 @@ public MsSql2000Dialect()
 
 		protected virtual void RegisterDefaultProperties()
 		{
-			DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.SqlClientDriver";
+			DefaultProperties[Environment.ConnectionDriver] =
+#pragma warning disable 618
+				GetDriverName("NHibernate.Driver.SqlServer2000Driver, NHibernate.Driver.SqlServer");
+#pragma warning restore 618
 			DefaultProperties[Environment.BatchSize] = "20";
 			DefaultProperties[Environment.QuerySubstitutions] = "true 1, false 0, yes 'Y', no 'N'";
 		}
diff --git a/src/NHibernate/Dialect/MsSql2008Dialect.cs b/src/NHibernate/Dialect/MsSql2008Dialect.cs
index d19bfc7b19c..9b0f338bf56 100644
--- a/src/NHibernate/Dialect/MsSql2008Dialect.cs
+++ b/src/NHibernate/Dialect/MsSql2008Dialect.cs
@@ -69,7 +69,10 @@ protected override void RegisterKeywords()
 		protected override void RegisterDefaultProperties()
 		{
 			base.RegisterDefaultProperties();
-			DefaultProperties[Environment.ConnectionDriver] = typeof(Sql2008ClientDriver).AssemblyQualifiedName;
+			DefaultProperties[Environment.ConnectionDriver] =
+#pragma warning disable 618
+				GetDriverName("NHibernate.Driver.SqlServer2008Driver, NHibernate.Driver.SqlServer");
+#pragma warning restore 618
 		}
 
 		public override string CurrentTimestampSQLFunctionName =>
diff --git a/src/NHibernate/Dialect/MsSqlCeDialect.cs b/src/NHibernate/Dialect/MsSqlCeDialect.cs
index 88c1fa21be1..d4b7c4c97d9 100644
--- a/src/NHibernate/Dialect/MsSqlCeDialect.cs
+++ b/src/NHibernate/Dialect/MsSqlCeDialect.cs
@@ -4,6 +4,7 @@
 using System.Text;
 using NHibernate.Dialect.Function;
 using NHibernate.Dialect.Schema;
+using NHibernate.Driver;
 using NHibernate.Id;
 using NHibernate.SqlCommand;
 using NHibernate.Util;
@@ -203,7 +204,10 @@ protected virtual void RegisterFunctions()
 
 		protected virtual void RegisterDefaultProperties()
 		{
-			DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.SqlServerCeDriver";
+			DefaultProperties[Environment.ConnectionDriver] =
+#pragma warning disable 618
+				GetDriverName("NHibernate.Driver.SqlServerCompactDriver, NHibernate.Driver.SqlServer.Compact");
+#pragma warning restore 618
 			DefaultProperties[Environment.PrepareSql] = "false";
 		}
 
diff --git a/src/NHibernate/Dialect/MySQLDialect.cs b/src/NHibernate/Dialect/MySQLDialect.cs
index 59539395226..e44dc09750c 100644
--- a/src/NHibernate/Dialect/MySQLDialect.cs
+++ b/src/NHibernate/Dialect/MySQLDialect.cs
@@ -4,6 +4,7 @@
 using System.Text;
 using NHibernate.Dialect.Function;
 using NHibernate.Dialect.Schema;
+using NHibernate.Driver;
 using NHibernate.SqlCommand;
 using NHibernate.SqlTypes;
 using NHibernate.Util;
@@ -23,7 +24,7 @@ namespace NHibernate.Dialect
 	///		
 	///		- 
 	///			connection.driver_class
-	///			
+	///			NHibernate.Driver.MySqlDriver, NHibernate.Driver.MySql
 	///		/// 
 	/// 
@@ -114,7 +115,10 @@ public MySQLDialect()
 			//functions:
 			RegisterFunctions();
 
-			DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.MySqlDataDriver";
+			DefaultProperties[Environment.ConnectionDriver] =
+#pragma warning disable 618
+				GetDriverName("NHibernate.Driver.MySqlDriver, NHibernate.Driver.MySql");
+#pragma warning restore 618
 		}
 
 		#region private static readonly string[] DialectKeywords = { ... }
diff --git a/src/NHibernate/Dialect/OracleLiteDialect.cs b/src/NHibernate/Dialect/OracleLiteDialect.cs
index cf5e33914a5..90a78438690 100644
--- a/src/NHibernate/Dialect/OracleLiteDialect.cs
+++ b/src/NHibernate/Dialect/OracleLiteDialect.cs
@@ -17,7 +17,7 @@ namespace NHibernate.Dialect
 	///		
 	///
- 
 	///			connection.driver_class
-	///			
+	///			NHibernate.Driver.OracleLiteDataClientDriver
 	///		/// 
 	/// 
diff --git a/src/NHibernate/Dialect/PostgreSQLDialect.cs b/src/NHibernate/Dialect/PostgreSQLDialect.cs
index c1653a36a6f..bddaff50002 100644
--- a/src/NHibernate/Dialect/PostgreSQLDialect.cs
+++ b/src/NHibernate/Dialect/PostgreSQLDialect.cs
@@ -4,6 +4,7 @@
 using System.Data.Common;
 using NHibernate.Dialect.Function;
 using NHibernate.Dialect.Schema;
+using NHibernate.Driver;
 using NHibernate.Engine;
 using NHibernate.SqlCommand;
 using NHibernate.SqlTypes;
@@ -24,7 +25,7 @@ namespace NHibernate.Dialect
 	///	
 	///
- 
 	///		connection.driver_class
-	///		
+	///		NHibernate.Driver.PostgreSqlDriver, NHibernate.Driver.PostgreSql
 	///	/// 
 	/// 
@@ -32,7 +33,10 @@ public class PostgreSQLDialect : Dialect
 	{
 		public PostgreSQLDialect()
 		{
-			DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.NpgsqlDriver";
+			DefaultProperties[Environment.ConnectionDriver] =
+#pragma warning disable 618
+				GetDriverName("NHibernate.Driver.PostgreSqlDriver, NHibernate.Driver.PostgreSql");
+#pragma warning restore 618
 
 			RegisterDateTimeTypeMappings();
 			RegisterColumnType(DbType.AnsiStringFixedLength, "char(255)");
diff --git a/src/NHibernate/Dialect/SQLiteDialect.cs b/src/NHibernate/Dialect/SQLiteDialect.cs
index 4a0bb5390ff..dabd41b4a1a 100644
--- a/src/NHibernate/Dialect/SQLiteDialect.cs
+++ b/src/NHibernate/Dialect/SQLiteDialect.cs
@@ -3,6 +3,7 @@
 using System.Data.Common;
 using System.Text;
 using NHibernate.Dialect.Function;
+using NHibernate.Driver;
 using NHibernate.SqlCommand;
 using NHibernate.Util;
 
@@ -180,7 +181,10 @@ protected virtual void RegisterKeywords()
 
 		protected virtual void RegisterDefaultProperties()
 		{
-			DefaultProperties[Cfg.Environment.ConnectionDriver] = "NHibernate.Driver.SQLite20Driver";
+			DefaultProperties[Cfg.Environment.ConnectionDriver] =
+#pragma warning disable 618
+				GetDriverName("NHibernate.Driver.SQLiteDriver, NHibernate.Driver.SQLite");
+#pragma warning restore 618
 			DefaultProperties[Cfg.Environment.QuerySubstitutions] = "true 1, false 0, yes 'Y', no 'N'";
 		}
 
diff --git a/src/NHibernate/Dialect/SybaseASA9Dialect.cs b/src/NHibernate/Dialect/SybaseASA9Dialect.cs
index 12ad1e3c088..81ec5fa8f00 100644
--- a/src/NHibernate/Dialect/SybaseASA9Dialect.cs
+++ b/src/NHibernate/Dialect/SybaseASA9Dialect.cs
@@ -24,7 +24,7 @@ namespace NHibernate.Dialect
 	///	
 	///
- 
 	///		connection.driver_class
-	///		
+	///		NHibernate.Driver.SybaseAsaClientDriver
 	///	///
- 
 	///		prepare_sql
diff --git a/src/NHibernate/Dialect/SybaseASE15Dialect.cs b/src/NHibernate/Dialect/SybaseASE15Dialect.cs
index 5ccceff3176..757469fe40c 100644
--- a/src/NHibernate/Dialect/SybaseASE15Dialect.cs
+++ b/src/NHibernate/Dialect/SybaseASE15Dialect.cs
@@ -21,7 +21,7 @@ namespace NHibernate.Dialect
 	///	
 	///	- 
 	///		connection.driver_class
-	///		
+	///		NHibernate.Driver.SybaseAseClientDriver
 	///	/// 
 	/// 
diff --git a/src/NHibernate/Dialect/SybaseSQLAnywhere10Dialect.cs b/src/NHibernate/Dialect/SybaseSQLAnywhere10Dialect.cs
index bd07ff22c2e..519efcc3c5e 100644
--- a/src/NHibernate/Dialect/SybaseSQLAnywhere10Dialect.cs
+++ b/src/NHibernate/Dialect/SybaseSQLAnywhere10Dialect.cs
@@ -38,7 +38,7 @@ namespace NHibernate.Dialect
 	///	
 	///
- 
 	///		connection.driver_class
-	///		
+	///		NHibernate.Driver.SybaseSQLAnywhereDriver
 	///	///
- 
 	///		prepare_sql
diff --git a/src/NHibernate/Dialect/SybaseSQLAnywhere11Dialect.cs b/src/NHibernate/Dialect/SybaseSQLAnywhere11Dialect.cs
index d28f67cdffe..b05d89a29b2 100644
--- a/src/NHibernate/Dialect/SybaseSQLAnywhere11Dialect.cs
+++ b/src/NHibernate/Dialect/SybaseSQLAnywhere11Dialect.cs
@@ -32,7 +32,7 @@ namespace NHibernate.Dialect
 	///	
 	///	- 
 	///		connection.driver_class
-	///		
+	///		NHibernate.Driver.SybaseSQLAnywhereDriver
 	///	///
- 
 	///		prepare_sql
diff --git a/src/NHibernate/Dialect/SybaseSQLAnywhere12Dialect.cs b/src/NHibernate/Dialect/SybaseSQLAnywhere12Dialect.cs
index e99a40a3b26..adf55c5c395 100644
--- a/src/NHibernate/Dialect/SybaseSQLAnywhere12Dialect.cs
+++ b/src/NHibernate/Dialect/SybaseSQLAnywhere12Dialect.cs
@@ -43,7 +43,7 @@ namespace NHibernate.Dialect
 	///	
 	///	- 
 	///		connection.driver_class
-	///		
+	///		NHibernate.Driver.SybaseSQLAnywhereDotNet4Driver
 	///	///
- 
 	///		prepare_sql
@@ -127,4 +127,4 @@ public override IDataBaseSchema GetDataBaseSchema(DbConnection connection)
 			return new SybaseAnywhereDataBaseMetaData(connection);
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate/Driver/FirebirdClientDriver.cs b/src/NHibernate/Driver/FirebirdClientDriver.cs
index 065e8b6c2d9..c604796ac22 100644
--- a/src/NHibernate/Driver/FirebirdClientDriver.cs
+++ b/src/NHibernate/Driver/FirebirdClientDriver.cs
@@ -10,13 +10,23 @@
 using NHibernate.SqlTypes;
 using NHibernate.Util;
 
+#if DRIVER_PACKAGE
+using FirebirdSql.Data.FirebirdClient;
+#endif
+
 namespace NHibernate.Driver
 {
 	/// 
 	/// A NHibernate Driver for using the Firebird data provider located in
 	/// FirebirdSql.Data.FirebirdClient assembly.
 	/// 
+#if DRIVER_PACKAGE
+	public class FirebirdDriver : DriverBase
+#else
+	[Obsolete("Use NHibernate.Driver.Firebird NuGet package and FirebirdDriver."
+			  + "  There are also Loquacious configuration points: .Connection.ByFirebirdDriver() and .DataBaseIntegration(x => x.FirebirdDriver()).")]
 	public class FirebirdClientDriver : ReflectionBasedDriver
+#endif
 	{
 		private const string SELECT_CLAUSE_EXP = @"(?<=\bselect|\bwhere).*";
 		private const string CAST_PARAMS_EXP = @"(?]\s?|first\s?|skip\s?|between\s|between\s@\bp\w+\b\sand\s)@\bp\w+\b(?!\s?[=<>])";
@@ -24,6 +34,7 @@ public class FirebirdClientDriver : ReflectionBasedDriver
 		private static readonly Regex _castCandidateRegEx = new Regex(CAST_PARAMS_EXP, RegexOptions.IgnoreCase);
 		private readonly FirebirdDialect _fbDialect = new FirebirdDialect();
 
+#if !DRIVER_PACKAGE
 		/// 
 		/// Initializes a new instance of the  class.
 		/// 
@@ -38,6 +49,19 @@ public FirebirdClientDriver()
 				"FirebirdSql.Data.FirebirdClient.FbCommand")
 		{
 		}
+#endif
+
+#if DRIVER_PACKAGE
+		public override DbConnection CreateConnection()
+		{
+			return new FbConnection();
+		}
+
+		public override DbCommand CreateCommand()
+		{
+			return new FbCommand();
+		}
+#endif
 
 		public override void Configure(IDictionary settings)
 		{
@@ -118,8 +142,10 @@ private string GetFbTypeForParam(SqlType sqlType)
 			return _fbDialect.GetCastTypeName(sqlType);
 		}
 
+#if !DRIVER_PACKAGE
 		private static volatile MethodInfo _clearPool;
 		private static volatile MethodInfo _clearAllPools;
+#endif
 
 		/// 
 		/// Clears the connection pool.
@@ -128,6 +154,19 @@ private string GetFbTypeForParam(SqlType sqlType)
 		/// null for clearing them all.
 		public void ClearPool(string connectionString)
 		{
+#if DRIVER_PACKAGE
+			if (connectionString != null)
+			{
+				using (var clearConnection = CreateConnection())
+				{
+					clearConnection.ConnectionString = connectionString;
+					FbConnection.ClearPool((FbConnection)clearConnection);
+				}
+				return;
+			}
+
+			FbConnection.ClearAllPools();
+#else
 			// In case of concurrent threads, may initialize many times. We do not care.
 			// Members are volatile for avoiding it gets used while its constructor is not yet ended.
 			if (_clearPool == null || _clearAllPools == null)
@@ -151,10 +190,11 @@ public void ClearPool(string connectionString)
 			}
 
 			_clearAllPools.Invoke(null, Array.Empty
/// 
+#if DRIVER_PACKAGE
+	public class MySqlDriver : DriverBase, IEmbeddedBatcherFactoryProvider
+#else
+	[Obsolete("Use NHibernate.Driver.MySql NuGet package and MySqlDriver."
+			  + "  There are also Loquacious configuration points: .Connection.ByMySqlDriver() and .DataBaseIntegration(x => x.MySqlDriver()).")]
 	public class MySqlDataDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider
+#endif
 	{
+#if !DRIVER_PACKAGE
 		/// 
 		/// Initializes a new instance of the  class.
 		/// 
@@ -32,6 +40,19 @@ public MySqlDataDriver() : base(
 			"MySql.Data.MySqlClient.MySqlCommand")
 		{
 		}
+#endif
+
+#if DRIVER_PACKAGE
+		public override DbConnection CreateConnection()
+		{
+			return new MySql.Data.MySqlClient.MySqlConnection();
+		}
+
+		public override DbCommand CreateCommand()
+		{
+			return new MySql.Data.MySqlClient.MySqlCommand();
+		}
+#endif
 
 		/// 
 		/// MySql.Data uses named parameters in the sql.
diff --git a/src/NHibernate/Driver/NpgsqlDriver.cs b/src/NHibernate/Driver/NpgsqlDriver.cs
index ccfd2dc1be2..d9507f26886 100644
--- a/src/NHibernate/Driver/NpgsqlDriver.cs
+++ b/src/NHibernate/Driver/NpgsqlDriver.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Data;
 using System.Data.Common;
 using NHibernate.AdoNet;
@@ -25,8 +26,23 @@ namespace NHibernate.Driver
 	/// http://pgfoundry.org/projects/npgsql. 
 	///
 	/// 
+#if DRIVER_PACKAGE
+	public class PostgreSqlDriver : DriverBase, IEmbeddedBatcherFactoryProvider
+#else
+	[Obsolete("Use NHibernate.Driver.PostgreSql NuGet package and PostgreSqlDriver."
+			  + "  There are also Loquacious configuration points: .Connection.ByPostgreSqlDriver() and .DataBaseIntegration(x => x.PostgreSqlDriver()).")]
 	public class NpgsqlDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider
+#endif
 	{
+#if DRIVER_PACKAGE
+		/// 
+		/// Initializes a new instance of the  class.
+		/// 
+		public PostgreSqlDriver()
+		{
+			DriverVersion = typeof(Npgsql.NpgsqlCommand).Assembly.GetName().Version;
+		}
+#else
 		/// 
 		/// Initializes a new instance of the  class.
 		/// 
@@ -40,6 +56,24 @@ public NpgsqlDriver() : base(
 			"Npgsql.NpgsqlCommand")
 		{
 		}
+#endif
+
+#if DRIVER_PACKAGE
+		/// 
+		/// The driver assembly version.
+		/// 
+		protected Version DriverVersion { get; }
+
+		public override DbConnection CreateConnection()
+		{
+			return new Npgsql.NpgsqlConnection();
+		}
+
+		public override DbCommand CreateCommand()
+		{
+			return new Npgsql.NpgsqlCommand();
+		}
+#endif
 
 		public override bool UseNamedPrefixInSql => true;
 
diff --git a/src/NHibernate/Driver/OracleManagedDataClientDriver.cs b/src/NHibernate/Driver/OracleManagedDataClientDriver.cs
index 247a84dfaff..de606ef29a4 100644
--- a/src/NHibernate/Driver/OracleManagedDataClientDriver.cs
+++ b/src/NHibernate/Driver/OracleManagedDataClientDriver.cs
@@ -1,8 +1,12 @@
+using System;
+
 namespace NHibernate.Driver
 {
 	/// 
 	/// A NHibernate Driver for using the Oracle.ManagedDataAccess DataProvider
 	/// 
+	[Obsolete("Use NHibernate.Driver.Oracle.Managed NuGet package and OracleManagedDriver."
+	          + "  There are also Loquacious configuration points: .Connection.ByOracleManagedDriver() and .DataBaseIntegration(x => x.OracleManagedDriver()).")]
 	public class OracleManagedDataClientDriver : OracleDataClientDriverBase
 	{
 		/// 
diff --git a/src/NHibernate/Driver/SQLite20Driver.cs b/src/NHibernate/Driver/SQLite20Driver.cs
index 8f84a216869..a472d98b0d0 100644
--- a/src/NHibernate/Driver/SQLite20Driver.cs
+++ b/src/NHibernate/Driver/SQLite20Driver.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Data;
 using System.Data.Common;
 
@@ -19,28 +20,54 @@ namespace NHibernate.Driver
 	/// Please check https://www.sqlite.org/ for more information regarding SQLite.
 	/// 
 	/// 
+#if DRIVER_PACKAGE
+	public class SQLiteDriver : DriverBase
+#else
+	[Obsolete("Use NHibernate.Driver.SQlLite NuGet package and SQLiteDriver."
+		+ "  There are also Loquacious configuration points: .Connection.BySQLiteDriver() and .DataBaseIntegration(x => x.SQLiteDriver()).")]
 	public class SQLite20Driver : ReflectionBasedDriver
+#endif
 	{
+#if DRIVER_PACKAGE
+		public SQLiteDriver()
+		{}
+#else
 		/// 
 		/// Initializes a new instance of .
 		/// 
 		/// 
 		/// Thrown when the SQLite.NET assembly can not be loaded.
 		/// 
-		public SQLite20Driver() : base(
-			"System.Data.SQLite",
-			"System.Data.SQLite",
-			"System.Data.SQLite.SQLiteConnection",
-			"System.Data.SQLite.SQLiteCommand")
+		public SQLite20Driver() 
+			: base(
+				"System.Data.SQLite",
+				"System.Data.SQLite",
+				"System.Data.SQLite.SQLiteConnection",
+				"System.Data.SQLite.SQLiteCommand")
 		{
 		}
+#endif
 
+#if DRIVER_PACKAGE
+		public override DbConnection CreateConnection()
+		{
+			var connection = new System.Data.SQLite.SQLiteConnection();
+			connection.StateChange += Connection_StateChange;
+			return connection;
+		}
+
+		public override DbCommand CreateCommand()
+		{
+			return new System.Data.SQLite.SQLiteCommand();
+		}
+#else
 		public override DbConnection CreateConnection()
 		{
 			var connection = base.CreateConnection();
 			connection.StateChange += Connection_StateChange;
 			return connection;
 		}
+#endif
 
 		private static void Connection_StateChange(object sender, StateChangeEventArgs e)
 		{
diff --git a/src/NHibernate/Driver/Sql2008ClientDriver.cs b/src/NHibernate/Driver/Sql2008ClientDriver.cs
index 0068832139f..a43a8fb9b1b 100644
--- a/src/NHibernate/Driver/Sql2008ClientDriver.cs
+++ b/src/NHibernate/Driver/Sql2008ClientDriver.cs
@@ -5,11 +5,17 @@
 
 namespace NHibernate.Driver
 {
+#if DRIVER_PACKAGE
+	public class SqlServer2008Driver : SqlServer2000Driver
+#else
+	[Obsolete("Use NHibernate.Driver.SqlServer NuGet package and SqlServer2008Driver."
+		+ "  There are also Loquacious configuration points: .Connection.BySqlServer2008Driver() and .DataBaseIntegration(x => x.SqlServer2008Driver()).")]
 	public class Sql2008ClientDriver : SqlClientDriver
+#endif
 	{
 		const byte MaxTime = 5;
 
-		#if NETFX
+		#if NETFX || DRIVER_PACKAGE
 		private static readonly Action