diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 13cec1bfba..7d01391d4f 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -157,6 +157,8 @@ class Field(object):
         obj = copy.copy(self)
         if self.rel:
             obj.rel = copy.copy(self.rel)
+            if hasattr(self.rel, 'field') and self.rel.field is self:
+                obj.rel.field = obj
         memodict[id(self)] = obj
         return obj
 
diff --git a/tests/generic_relations_regress/models.py b/tests/generic_relations_regress/models.py
index 2795471f7f..206dbe02b0 100644
--- a/tests/generic_relations_regress/models.py
+++ b/tests/generic_relations_regress/models.py
@@ -122,3 +122,12 @@ class Tag(models.Model):
 
 class Board(models.Model):
     name = models.CharField(primary_key=True, max_length=15)
+
+class HasLinks(models.Model):
+    links = generic.GenericRelation(Link)
+
+    class Meta:
+        abstract = True
+
+class HasLinkThing(HasLinks):
+    pass
diff --git a/tests/generic_relations_regress/tests.py b/tests/generic_relations_regress/tests.py
index 474113584a..519ca203a9 100644
--- a/tests/generic_relations_regress/tests.py
+++ b/tests/generic_relations_regress/tests.py
@@ -4,7 +4,7 @@ from django.test import TestCase, skipIfDBFeature
 
 from .models import (Address, Place, Restaurant, Link, CharLink, TextLink,
     Person, Contact, Note, Organization, OddRelation1, OddRelation2, Company,
-    Developer, Team, Guild, Tag, Board)
+    Developer, Team, Guild, Tag, Board, HasLinkThing)
 
 
 class GenericRelationTests(TestCase):
@@ -135,3 +135,21 @@ class GenericRelationTests(TestCase):
         b1 = Board.objects.create(name='')
         tag = Tag(label='VP', content_object=b1)
         tag.save()
+
+    def test_ticket_20378(self):
+        hs1 = HasLinkThing.objects.create()
+        hs2 = HasLinkThing.objects.create()
+        l1 = Link.objects.create(content_object=hs1)
+        l2 = Link.objects.create(content_object=hs2)
+        self.assertQuerysetEqual(
+            HasLinkThing.objects.filter(links=l1),
+            [hs1], lambda x: x)
+        self.assertQuerysetEqual(
+            HasLinkThing.objects.filter(links=l2),
+            [hs2], lambda x: x)
+        self.assertQuerysetEqual(
+            HasLinkThing.objects.exclude(links=l2),
+            [hs1], lambda x: x)
+        self.assertQuerysetEqual(
+            HasLinkThing.objects.exclude(links=l1),
+            [hs2], lambda x: x)