diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3652/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3652/Fixture.cs
new file mode 100644
index 0000000000..91db60684d
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3652/Fixture.cs
@@ -0,0 +1,99 @@
+//------------------------------------------------------------------------------
+//
+// 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.Linq;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH3652;
+using System.Threading.Tasks;
+
+[TestFixture]
+public class FixtureAsync : BugTestCase
+{
+ private Department _department1;
+ private Department _department2;
+ private Employee _employee1;
+ private Employee _employee2;
+
+ protected override void OnSetUp()
+ {
+ using var session = OpenSession();
+ using var tx = session.BeginTransaction();
+ _department1 = new Department();
+ _department2 = new Department();
+
+ _employee1 = new Employee();
+ _employee2 = new Employee();
+
+ _employee1.Departments.Add(_department1);
+ _employee2.Departments.Add(_department1);
+ _employee2.Departments.Add(_department2);
+
+ session.Save(_department1);
+ session.Save(_department2);
+ session.Save(_employee1);
+ session.Save(_employee2);
+
+ tx.Commit();
+ }
+
+ protected override void OnTearDown()
+ {
+ using var session = OpenSession();
+ using var tx = session.BeginTransaction();
+ session.Delete(_employee1);
+ session.Delete(_employee2);
+ session.Delete(_department1);
+ session.Delete(_department2);
+
+ tx.Commit();
+ }
+
+ [Theory]
+ public async Task Querying_Employees_Departments_ManyToMany_With_FilterAsync(bool enableFilter)
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ _department1.DeletedAt = DateTime.UtcNow;
+ _department2.DeletedAt = DateTime.UtcNow;
+
+ await (session.UpdateAsync(_department1));
+ await (session.UpdateAsync(_department2));
+
+ await (tx.CommitAsync());
+ }
+
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ if (enableFilter)
+ session.EnableFilter("NotDeletedFilter");
+
+ var departments = session.Query();
+ var employee2 = await (session.GetAsync(_employee2.Id));
+
+ if (enableFilter)
+ {
+ Assert.That(departments, Is.Empty);
+ Assert.That(employee2.Departments, Is.Empty);
+ }
+ else
+ {
+ Assert.That(departments.Count, Is.EqualTo(2));
+ Assert.That(employee2.Departments, Has.Count.EqualTo(2));
+ }
+
+
+ await (tx.CommitAsync());
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH3652/BaseClass.cs b/src/NHibernate.Test/NHSpecificTest/GH3652/BaseClass.cs
new file mode 100644
index 0000000000..5657e8e155
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH3652/BaseClass.cs
@@ -0,0 +1,8 @@
+using System;
+
+namespace NHibernate.Test.NHSpecificTest.GH3652;
+
+public class BaseClass
+{
+ public virtual Guid Id { get; set; }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH3652/Department.cs b/src/NHibernate.Test/NHSpecificTest/GH3652/Department.cs
new file mode 100644
index 0000000000..c8e368918e
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH3652/Department.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.GH3652;
+
+public class Department : BaseClass
+{
+ public virtual ISet Employees { get; set; } = new HashSet();
+
+ public virtual DateTime? DeletedAt { get; set; }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH3652/Employee.cs b/src/NHibernate.Test/NHSpecificTest/GH3652/Employee.cs
new file mode 100644
index 0000000000..8e0c39cd66
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH3652/Employee.cs
@@ -0,0 +1,8 @@
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.GH3652;
+
+public class Employee : BaseClass
+{
+ public virtual ISet Departments { get; set; } = new HashSet();
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH3652/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH3652/Fixture.cs
new file mode 100644
index 0000000000..c3dd39fb28
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH3652/Fixture.cs
@@ -0,0 +1,88 @@
+using System;
+using System.Linq;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH3652;
+
+[TestFixture]
+public class Fixture : BugTestCase
+{
+ private Department _department1;
+ private Department _department2;
+ private Employee _employee1;
+ private Employee _employee2;
+
+ protected override void OnSetUp()
+ {
+ using var session = OpenSession();
+ using var tx = session.BeginTransaction();
+ _department1 = new Department();
+ _department2 = new Department();
+
+ _employee1 = new Employee();
+ _employee2 = new Employee();
+
+ _employee1.Departments.Add(_department1);
+ _employee2.Departments.Add(_department1);
+ _employee2.Departments.Add(_department2);
+
+ session.Save(_department1);
+ session.Save(_department2);
+ session.Save(_employee1);
+ session.Save(_employee2);
+
+ tx.Commit();
+ }
+
+ protected override void OnTearDown()
+ {
+ using var session = OpenSession();
+ using var tx = session.BeginTransaction();
+ session.Delete(_employee1);
+ session.Delete(_employee2);
+ session.Delete(_department1);
+ session.Delete(_department2);
+
+ tx.Commit();
+ }
+
+ [Theory]
+ public void Querying_Employees_Departments_ManyToMany_With_Filter(bool enableFilter)
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ _department1.DeletedAt = DateTime.UtcNow;
+ _department2.DeletedAt = DateTime.UtcNow;
+
+ session.Update(_department1);
+ session.Update(_department2);
+
+ tx.Commit();
+ }
+
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ if (enableFilter)
+ session.EnableFilter("NotDeletedFilter");
+
+ var departments = session.Query();
+ var employee2 = session.Get(_employee2.Id);
+
+ if (enableFilter)
+ {
+ Assert.That(departments, Is.Empty);
+ Assert.That(employee2.Departments, Is.Empty);
+ }
+ else
+ {
+ Assert.That(departments.Count, Is.EqualTo(2));
+ Assert.That(employee2.Departments, Has.Count.EqualTo(2));
+ }
+
+
+ tx.Commit();
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH3652/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH3652/Mappings.hbm.xml
new file mode 100644
index 0000000000..cfdc1b332e
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH3652/Mappings.hbm.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+