diff --git a/district/forms.py b/district/forms.py
index 830224afde0cf46166c6a52a9da173d2bb13c527..8ec53632a8f20d1e3c7837f3345c94cdf7c6dedb 100644
--- a/district/forms.py
+++ b/district/forms.py
@@ -2,6 +2,8 @@ import os
 import tempfile
 
 from shared.forms import JekyllImportForm as SharedJekyllImportForm
+from wagtail.admin.forms import WagtailAdminPageForm
+from wagtail.models.media import Collection
 
 from .tasks import import_jekyll_articles
 from .tasks import import_people_from_group
@@ -25,4 +27,24 @@ class JekyllImportForm(SharedJekyllImportForm):
             url=self.cleaned_data["jekyll_repo_url"],
             dry_run=self.cleaned_data["dry_run"],
             use_git=True,
-        )
\ No newline at end of file
+        )
+
+
+class DistrictPeoplePageForm(WagtailAdminPageForm):
+    def save(self, *args, **kwargs):
+        # If anything inside the content field has changed,
+        # sync Octopus profiles just in case.
+        if "content" in self.changed_data:
+            collection_id = self.instance.root_page.image_collection_id
+
+            if collection_id is None:
+                collection_id = Collection.objects.first().id
+
+            for shortcut in self.instance.get_syncable_octopus_groups():
+                import_people_from_group.delay(
+                    self.instance.id,
+                    collection_id,
+                    shortcut,
+                )
+
+        return super().save(*args, **kwargs)
\ No newline at end of file
diff --git a/district/models.py b/district/models.py
index c87bab1d0a2fa6af3fa10a21944bf62f46534265..21e60d2884a1c76e2b6bd901e7a7815b530d6953 100644
--- a/district/models.py
+++ b/district/models.py
@@ -71,7 +71,7 @@ from shared.utils import (
 )
 
 from . import blocks
-from .forms import JekyllImportForm
+from .forms import JekyllImportForm, DistrictPeoplePageForm
 
 CONTENT_BLOCKS = DEFAULT_CONTENT_BLOCKS + [
     ("chart", ChartBlock()),
@@ -575,6 +575,8 @@ class DistrictPersonPage(MainPersonPageMixin):
 
 
 class DistrictPeoplePage(MainPeoplePageMixin):
+    base_form_class = DistrictPeoplePageForm
+
     ### FIELDS
 
     content = StreamField(
@@ -614,7 +616,8 @@ class DistrictPeoplePage(MainPeoplePageMixin):
             if block.block_type == "octopus_group":
                 group_shortcuts.append(block.value["group_shortcut"])
 
-        return group_shortcuts
+        # Don't duplicate groups needlessly
+        return list(set(group_shortcuts))
 
 
 class DistrictCalendarPage(SubpageMixin, MetadataPageMixin, CalendarMixin, Page):
diff --git a/shared/people_import.py b/shared/people_import.py
index 26894a590724dc8e07c6f00230af04915abaf6a7..8c0fc83f5df012dcc17d4351dac81e2dcb84d6f8 100644
--- a/shared/people_import.py
+++ b/shared/people_import.py
@@ -291,6 +291,14 @@ class PeopleGroupImporter:
                 person_page = self.person_page_model.objects.filter(person=person_instance).descendant_of(self.people_parent_page).first()
 
                 if person_page is None:
+                    if not isinstance(person_instance.display_name, str):
+                        logger.warning(
+                            "Skipping page creation for user %s, they have no display name",
+                            person_instance.username
+                        )
+                        
+                        continue
+
                     person_page = self.person_page_model(
                         person=person_instance,
                         is_automatically_created=True,
diff --git a/shared/templatetags/people_filters.py b/shared/templatetags/people_filters.py
index 2a172bbcd7cabe3a8c613eea00abbd3a9d1ce6e6..3d9e822a84dfa8d39ba158cc07abff2f378f2315 100644
--- a/shared/templatetags/people_filters.py
+++ b/shared/templatetags/people_filters.py
@@ -8,7 +8,7 @@ def is_first_people_type(content, forloop):
     first_people_type_position = None
 
     for position, item in enumerate(content):
-        if item.block_type in ("people_group", "team_group"):
+        if item.block_type in ("octopus_group", "people_group", "team_group"):
             if first_people_type_position is None:
                 first_people_type_position = position
                 break