diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH2028/TempReattachedChildFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH2028/TempReattachedChildFixture.cs
new file mode 100644
index 0000000000..4d469b7fba
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/GH2028/TempReattachedChildFixture.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// 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.Collections.Generic;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH2028
+{
+ using System.Threading.Tasks;
+ [TestFixture]
+ public class TempReattachedChildFixtureAsync : BugTestCase
+ {
+ protected override void OnTearDown()
+ {
+ using (ISession session = OpenSession())
+ using (ITransaction transaction = session.BeginTransaction())
+ {
+ session.Delete("from System.Object");
+
+ session.Flush();
+ transaction.Commit();
+ }
+ }
+
+ [Test]
+ public async Task WhenRemoveTempChild_ChildShouldNotInsertAsync()
+ {
+ Book book = null;
+ Word word = null;
+ using (var s = OpenSession())
+ using (var tr = s.BeginTransaction())
+ {
+ book = new Book { Id = 1 };
+ book.Words = new List { new Word { Id = 1, Parent = book } };
+ await (s.SaveAsync(book));
+ await (tr.CommitAsync());
+ }
+
+ word = new Word { Id = 2, Parent = book };
+ book.Words.Add(word);
+
+ using (var s = OpenSession())
+ using (var tr = s.BeginTransaction())
+ {
+ await (s.UpdateAsync(book));
+ book.Words.Remove(word);
+ using (var sl = new SqlLogSpy())
+ {
+ await (tr.CommitAsync());
+ var logs = sl.GetWholeLog();
+ Assert.That(logs, Does.Not.Contain("INSERT \n INTO\n Word").IgnoreCase, "Сollection record should not be inserted");
+ }
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2028/Book.cs b/src/NHibernate.Test/NHSpecificTest/GH2028/Book.cs
new file mode 100644
index 0000000000..4d5f192876
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2028/Book.cs
@@ -0,0 +1,11 @@
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.GH2028
+{
+ public class Book
+ {
+ public virtual int Id { get; set; }
+ public virtual string Name { get; set; }
+ public virtual IList Words { get; set; }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2028/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH2028/Mappings.hbm.xml
new file mode 100644
index 0000000000..0ac20daa16
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2028/Mappings.hbm.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2028/TempReattachedChildFixture.cs b/src/NHibernate.Test/NHSpecificTest/GH2028/TempReattachedChildFixture.cs
new file mode 100644
index 0000000000..039cf6c693
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2028/TempReattachedChildFixture.cs
@@ -0,0 +1,52 @@
+using System.Collections.Generic;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH2028
+{
+ [TestFixture]
+ public class TempReattachedChildFixture : BugTestCase
+ {
+ protected override void OnTearDown()
+ {
+ using (ISession session = OpenSession())
+ using (ITransaction transaction = session.BeginTransaction())
+ {
+ session.Delete("from System.Object");
+
+ session.Flush();
+ transaction.Commit();
+ }
+ }
+
+ [Test]
+ public void WhenRemoveTempChild_ChildShouldNotInsert()
+ {
+ Book book = null;
+ Word word = null;
+ using (var s = OpenSession())
+ using (var tr = s.BeginTransaction())
+ {
+ book = new Book { Id = 1 };
+ book.Words = new List { new Word { Id = 1, Parent = book } };
+ s.Save(book);
+ tr.Commit();
+ }
+
+ word = new Word { Id = 2, Parent = book };
+ book.Words.Add(word);
+
+ using (var s = OpenSession())
+ using (var tr = s.BeginTransaction())
+ {
+ s.Update(book);
+ book.Words.Remove(word);
+ using (var sl = new SqlLogSpy())
+ {
+ tr.Commit();
+ var logs = sl.GetWholeLog();
+ Assert.That(logs, Does.Not.Contain("INSERT \n INTO\n Word").IgnoreCase, "Сollection record should not be inserted");
+ }
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2028/Word.cs b/src/NHibernate.Test/NHSpecificTest/GH2028/Word.cs
new file mode 100644
index 0000000000..90bb79d300
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2028/Word.cs
@@ -0,0 +1,9 @@
+namespace NHibernate.Test.NHSpecificTest.GH2028
+{
+ public class Word
+ {
+ public virtual int Id { get; set; }
+ public virtual byte[] Content { get; set; }
+ public virtual Book Parent { get; set; }
+ }
+}