diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH1645/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH1645/Fixture.cs
new file mode 100644
index 00000000000..017658be42a
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/GH1645/Fixture.cs
@@ -0,0 +1,66 @@
+//------------------------------------------------------------------------------
+//
+// 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;
+
+namespace NHibernate.Test.NHSpecificTest.GH1645
+{
+ using System.Threading.Tasks;
+ [TestFixture]
+ public class FixtureAsync : BugTestCase
+ {
+ private Guid _superParentId;
+ private Guid _parentId;
+
+ protected override void OnSetUp()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ var p = new Parent();
+ session.Save(p);
+ _parentId = p.Id;
+
+ _superParentId = (Guid) session.Save(new SuperParent { Parent = p });
+
+ transaction.Commit();
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ // The HQL delete does all the job inside the database without loading the entities, but it does
+ // not handle delete order for avoiding violating constraints if any. Use
+ // session.Delete("from System.Object");
+ // instead if in need of having NHbernate ordering the deletes, but this will cause
+ // loading the entities in the session.
+ session.CreateQuery("delete from System.Object").ExecuteUpdate();
+
+ transaction.Commit();
+ }
+ }
+
+ [Test]
+ public async Task SOEOnLoadAsync()
+ {
+ using (var session = OpenSession())
+ using (session.BeginTransaction())
+ {
+ var superParent = await (session.LoadAsync(_superParentId));
+ Assert.That(() => NHibernateUtil.InitializeAsync(superParent), Throws.Nothing);
+ Assert.That(() => NHibernateUtil.InitializeAsync(superParent.Parent), Throws.Nothing);
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1645/EntityBase.cs b/src/NHibernate.Test/NHSpecificTest/GH1645/EntityBase.cs
new file mode 100644
index 00000000000..a855e6b58de
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1645/EntityBase.cs
@@ -0,0 +1,67 @@
+using System;
+
+namespace NHibernate.Test.NHSpecificTest.GH1645
+{
+ public abstract class EntityBase
+ {
+ public virtual Guid Id { get; protected set; }
+
+ public static bool operator ==(EntityBase left, EntityBase right)
+ {
+ return Equals(left, right);
+ }
+
+ public static bool operator !=(EntityBase left, EntityBase right)
+ {
+ return !Equals(left, right);
+ }
+
+ public override bool Equals(object obj)
+ {
+ return Equals(obj as EntityBase);
+ }
+
+ public virtual bool Equals(EntityBase other)
+ {
+ if (other == null)
+ {
+ return false;
+ }
+
+ if (ReferenceEquals(this, other))
+ {
+ return true;
+ }
+
+ if (!IsTransient(this) && !IsTransient(other) && Equals(Id, other.Id))
+ {
+ var otherType = other.GetUnproxiedType();
+ var thisType = GetUnproxiedType();
+ return thisType.IsAssignableFrom(otherType) ||
+ otherType.IsAssignableFrom(thisType);
+ }
+
+ return false;
+ }
+
+ public override int GetHashCode()
+ {
+ if (Equals(Id, default(Guid)))
+ {
+ return base.GetHashCode();
+ }
+
+ return Id.GetHashCode();
+ }
+
+ private static bool IsTransient(EntityBase obj)
+ {
+ return obj != null && Equals(obj.Id, default(Guid));
+ }
+
+ private System.Type GetUnproxiedType()
+ {
+ return GetType();
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1645/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH1645/Fixture.cs
new file mode 100644
index 00000000000..64a27ef63d6
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1645/Fixture.cs
@@ -0,0 +1,55 @@
+using System;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH1645
+{
+ [TestFixture]
+ public class Fixture : BugTestCase
+ {
+ private Guid _superParentId;
+ private Guid _parentId;
+
+ protected override void OnSetUp()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ var p = new Parent();
+ session.Save(p);
+ _parentId = p.Id;
+
+ _superParentId = (Guid) session.Save(new SuperParent { Parent = p });
+
+ transaction.Commit();
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ // The HQL delete does all the job inside the database without loading the entities, but it does
+ // not handle delete order for avoiding violating constraints if any. Use
+ // session.Delete("from System.Object");
+ // instead if in need of having NHbernate ordering the deletes, but this will cause
+ // loading the entities in the session.
+ session.CreateQuery("delete from System.Object").ExecuteUpdate();
+
+ transaction.Commit();
+ }
+ }
+
+ [Test]
+ public void SOEOnLoad()
+ {
+ using (var session = OpenSession())
+ using (session.BeginTransaction())
+ {
+ var superParent = session.Load(_superParentId);
+ Assert.That(() => NHibernateUtil.Initialize(superParent), Throws.Nothing);
+ Assert.That(() => NHibernateUtil.Initialize(superParent.Parent), Throws.Nothing);
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1645/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH1645/Mappings.hbm.xml
new file mode 100644
index 00000000000..83fc1ab6f10
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1645/Mappings.hbm.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1645/Parent.cs b/src/NHibernate.Test/NHSpecificTest/GH1645/Parent.cs
new file mode 100644
index 00000000000..c9dc2342d28
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1645/Parent.cs
@@ -0,0 +1,7 @@
+namespace NHibernate.Test.NHSpecificTest.GH1645
+{
+ public class Parent : EntityBase
+ {
+ public virtual SuperParent SuperParent { get; set; }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1645/SuperParent.cs b/src/NHibernate.Test/NHSpecificTest/GH1645/SuperParent.cs
new file mode 100644
index 00000000000..ceeb4651785
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1645/SuperParent.cs
@@ -0,0 +1,7 @@
+namespace NHibernate.Test.NHSpecificTest.GH1645
+{
+ public class SuperParent : EntityBase
+ {
+ public virtual Parent Parent { get; set; }
+ }
+}
diff --git a/src/NHibernate/Async/Type/EntityType.cs b/src/NHibernate/Async/Type/EntityType.cs
index 6e0e345b1bc..adef950ecdd 100644
--- a/src/NHibernate/Async/Type/EntityType.cs
+++ b/src/NHibernate/Async/Type/EntityType.cs
@@ -218,12 +218,19 @@ public async Task