diff --git a/src/NHibernate.Test/Async/NHSpecificTest/ManyToManyWithFilter/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/ManyToManyWithFilter/Fixture.cs
new file mode 100644
index 0000000000..de1ef49a60
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/ManyToManyWithFilter/Fixture.cs
@@ -0,0 +1,104 @@
+//------------------------------------------------------------------------------
+//
+// 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 NUnit.Framework;
+using System.Linq;
+
+namespace NHibernate.Test.NHSpecificTest.ManyToManyWithFilter
+{
+ 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/ManyToManyWithFilter/BaseClass.cs b/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/BaseClass.cs
new file mode 100644
index 0000000000..1e50eedc56
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/BaseClass.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace NHibernate.Test.NHSpecificTest.ManyToManyWithFilter
+{
+ public class BaseClass
+ {
+ public virtual Guid Id { get; set; }
+
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/Department.cs b/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/Department.cs
new file mode 100644
index 0000000000..4cb4139b9f
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/Department.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.ManyToManyWithFilter
+{
+ 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/ManyToManyWithFilter/Employee.cs b/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/Employee.cs
new file mode 100644
index 0000000000..a1425662a4
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/Employee.cs
@@ -0,0 +1,9 @@
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.ManyToManyWithFilter
+{
+ public class Employee : BaseClass
+ {
+ public virtual ISet Departments { get; set; } = new HashSet();
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/Fixture.cs
new file mode 100644
index 0000000000..5cd988c197
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/Fixture.cs
@@ -0,0 +1,93 @@
+using System;
+using NUnit.Framework;
+using System.Linq;
+
+namespace NHibernate.Test.NHSpecificTest.ManyToManyWithFilter
+{
+ [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/ManyToManyWithFilter/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/Mappings.hbm.xml
new file mode 100644
index 0000000000..513787efcb
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/ManyToManyWithFilter/Mappings.hbm.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+