diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 5b2b3f504bd1dbff4444dc7e4650cd39800fddd3..6806ee00f1201fc4bb40e5a845d9925c79fd91e2 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -14,6 +14,7 @@ Fixed
 
 * Fix order of submit buttons in login form and restructure login template
   to make 2FA work correctly.
+* Fix page title bug on the impersonate page.
 * Provide `style.css` and icon files without any authentication to avoid caching issues.
 
 `2.0rc7`_ - 2021-10-18
@@ -41,6 +42,7 @@ Added
 * OpenID Connect scope and accompanying claim ``groups``
 * Support config files in JSON format
 * Allow apps to dynamically generate OAuth scopes
+* Provide an ``ExtensiblePolymorphicModel`` to support the features of extensible models for polymorphic models and vice-versa.
 
 Changed
 ~~~~~~~
diff --git a/aleksis/core/managers.py b/aleksis/core/managers.py
index ade623230aff2b8663e976ae4c133c3e24b979b4..aed4cab72d4b0cd53d3544b20f0180a7087dfd2c 100644
--- a/aleksis/core/managers.py
+++ b/aleksis/core/managers.py
@@ -120,3 +120,7 @@ class InstalledWidgetsDashboardWidgetOrderManager(Manager):
 
         # [obj["id"] for obj in list(Person.objects.all().values("id"))]
         return super().get_queryset().filter(widget_id__in=dashboard_widget_pks)
+
+
+class PolymorphicCurrentSiteManager(_CurrentSiteManager, PolymorphicManager):
+    """Default manager for extensible, polymorphic models."""
diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py
index fa6c4fa29a67ec2904e42dba173ce72575c0e6ba..1e4fd42168f66d4ca986dca670f277ead0cbf3e7 100644
--- a/aleksis/core/mixins.py
+++ b/aleksis/core/mixins.py
@@ -24,9 +24,16 @@ from guardian.admin import GuardedModelAdmin
 from guardian.core import ObjectPermissionChecker
 from jsonstore.fields import IntegerField, JSONFieldMixin
 from material.base import Layout, LayoutNode
+from polymorphic.base import PolymorphicModelBase
+from polymorphic.managers import PolymorphicManager
+from polymorphic.models import PolymorphicModel
 from rules.contrib.admin import ObjectPermissionsModelAdmin
 
-from aleksis.core.managers import CurrentSiteManagerWithoutMigrations, SchoolTermRelatedQuerySet
+from aleksis.core.managers import (
+    CurrentSiteManagerWithoutMigrations,
+    PolymorphicCurrentSiteManager,
+    SchoolTermRelatedQuerySet,
+)
 
 
 class _ExtensibleModelBase(models.base.ModelBase):
@@ -351,6 +358,22 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
         abstract = True
 
 
+class _ExtensiblePolymorphicModelBase(_ExtensibleModelBase, PolymorphicModelBase):
+    """Base class for extensible, polymorphic models."""
+
+
+class ExtensiblePolymorphicModel(
+    ExtensibleModel, PolymorphicModel, metaclass=_ExtensiblePolymorphicModelBase
+):
+    """Model class for extensible, polymorphic models."""
+
+    objects = PolymorphicCurrentSiteManager()
+    objects_all_sites = PolymorphicManager()
+
+    class Meta:
+        abstract = True
+
+
 class PureDjangoModel(object):
     """No-op mixin to mark a model as deliberately not using ExtensibleModel."""
 
diff --git a/aleksis/core/templates/impersonate/list_users.html b/aleksis/core/templates/impersonate/list_users.html
index aff2f8660ac374cebb1bbeff646bc038aee9e5f1..fd273ca60902e5defbc41e567a9205cfe99fb349 100644
--- a/aleksis/core/templates/impersonate/list_users.html
+++ b/aleksis/core/templates/impersonate/list_users.html
@@ -4,9 +4,8 @@
 {% extends "core/base.html" %}
 {% load i18n %}
 
-{% block page_title %}
-  {% blocktrans %}Impersonate user{% endblocktrans %}
-{% endblock %}
+{% block browser_title %}{% trans "Impersonate" %}{% endblock %}
+{% block page_title %}{% trans "Impersonate" %}{% endblock %}
 
 {% block content %}
   {% if page.object_list %}