diff --git a/src/core/fixtures/.gitignore b/src/core/fixtures/.gitignore
index 267d38517c98e1dfa6c06b0252b1248c2c63d232..445270a60b5e95ecf5ea791a678e6f725227ae09 100644
--- a/src/core/fixtures/.gitignore
+++ b/src/core/fixtures/.gitignore
@@ -1,2 +1,3 @@
 *.json
 !anhalter.json
+!bootstrap_*.json
diff --git a/src/core/fixtures/bootstrap_auth_groups.json b/src/core/fixtures/bootstrap_auth_groups.json
new file mode 100644
index 0000000000000000000000000000000000000000..364f79683d75958393f5fe0d62058a51167b8396
--- /dev/null
+++ b/src/core/fixtures/bootstrap_auth_groups.json
@@ -0,0 +1,125 @@
+[
+    {
+        "model": "auth.group",
+        "fields": {
+            "name": "Assembly-Team",
+            "permissions": [
+                [
+                    "assembly_team",
+                    "core",
+                    "conferencemember"
+                ]
+            ]
+        }
+    },
+    {
+        "model": "auth.group",
+        "fields": {
+            "name": "Karten-Verwaltung",
+            "permissions": [
+                [
+                    "map_edit",
+                    "core",
+                    "conferencemember"
+                ]
+            ]
+        }
+    },
+    {
+        "model": "auth.group",
+        "fields": {
+            "name": "Schedule Supervisor",
+            "permissions": [
+                [
+                    "scheduleadmin",
+                    "core",
+                    "conferencemember"
+                ],
+                [
+                    "add_schedulesource",
+                    "core",
+                    "schedulesource"
+                ],
+                [
+                    "change_schedulesource",
+                    "core",
+                    "schedulesource"
+                ],
+                [
+                    "delete_schedulesource",
+                    "core",
+                    "schedulesource"
+                ],
+                [
+                    "view_schedulesource",
+                    "core",
+                    "schedulesource"
+                ],
+                [
+                    "view_schedulesourceimport",
+                    "core",
+                    "schedulesourceimport"
+                ],
+                [
+                    "add_schedulesourcemapping",
+                    "core",
+                    "schedulesourcemapping"
+                ],
+                [
+                    "change_schedulesourcemapping",
+                    "core",
+                    "schedulesourcemapping"
+                ],
+                [
+                    "delete_schedulesourcemapping",
+                    "core",
+                    "schedulesourcemapping"
+                ],
+                [
+                    "view_schedulesourcemapping",
+                    "core",
+                    "schedulesourcemapping"
+                ]
+            ]
+        }
+    },
+    {
+        "model": "auth.group",
+        "fields": {
+            "name": "PL",
+            "permissions": [
+                [
+                    "static_pages",
+                    "core",
+                    "conferencemember"
+                ]
+            ]
+        }
+    },
+    {
+        "model": "auth.group",
+        "fields": {
+            "name": "Wiki Team",
+            "permissions": [
+                [
+                    "static_pages",
+                    "core",
+                    "conferencemember"
+                ]
+            ]
+        }
+    },
+    {
+        "model": "auth.group",
+        "fields": {
+            "name": "Moderation",
+            "permissions": [
+                [
+                    "moderation",
+                    "core",
+                    "conferencemember"
+                ]
+            ]
+        }
+    }
+]
diff --git a/src/core/tests/assemblies.py b/src/core/tests/assemblies.py
index c8d4b5b6b33f45720ea66daa76dd0f0b98a4b905..be70aabad8f3ac39e86666e1e272694b3a65aaa6 100644
--- a/src/core/tests/assemblies.py
+++ b/src/core/tests/assemblies.py
@@ -1,12 +1,13 @@
+from django.contrib.auth.models import Group, Permission
 from django.core import mail
 from django.test import TestCase, override_settings
 
-from ..models.assemblies import Assembly
+from ..models.assemblies import Assembly, AssemblyMember
 from ..models.conference import Conference, ConferenceMember
 from ..models.users import PlatformUser, UserCommunicationChannel
 
 
-class AssembliesTests(TestCase):
+class AssembliesTestsMixin(TestCase):
     def setUp(self):
         self.conference = Conference(slug='foo', name='Foo Conference', mail_footer='This is serious business w/ legal stuff.')
         self.conference.save()
@@ -27,6 +28,7 @@ class AssembliesTests(TestCase):
         )
         self.user_mgmt2 = PlatformUser(username='manager2')
         self.user_mgmt2.save()
+        self.user_mgmt2.user_permissions.add(Permission.objects.get(codename='assembly_team'))
         self.user_mgmt2.communication_channels.create(
             channel=UserCommunicationChannel.Channel.MAIL,
             address='notifications2@unittest.local',
@@ -49,6 +51,7 @@ class AssembliesTests(TestCase):
             is_verified=True,
             use_for_notifications=False,
         )
+        self.user_anon = PlatformUser.get_anonymous_user()
         ConferenceMember(conference=self.conference, user=self.user_mgmt).save()
         ConferenceMember(conference=self.conference, user=self.user_mgmt2).save()
         ConferenceMember(conference=self.conference, user=self.user_participant).save()
@@ -57,11 +60,13 @@ class AssembliesTests(TestCase):
         self.assembly1 = Assembly(conference=self.conference, slug='fnord', name='Fnord Assembly')
         self.assembly1.save()
         self.assembly1.members.create(member=self.user_mgmt, can_manage_assembly=True)
-        self.assembly1.members.create(member=self.user_participant, can_manage_assembly=False)
+        self.assembly1.members.create(member=self.user_participant, can_manage_assembly=False, show_public=True)
         self.assembly2 = Assembly(conference=self.conference, slug='foo', name='Foo Bar')
         self.assembly2.members.create(member=self.user_mgmt2, can_manage_assembly=True)
         self.assembly2.save()
 
+
+class AssembliesTests(AssembliesTestsMixin):
     @override_settings(SUPPORT_HTML_MAILS=True)
     def test_mail_plainhtml(self):
         self.assembly2.send_mail_to_managers(
@@ -105,3 +110,63 @@ class AssembliesTests(TestCase):
         self.assertIn('https://events.ccc.de/', the_mail.body)
         self.assertIn(self.assembly1.slug, the_mail.alternatives[0][0])
         self.assertIn('https://events.ccc.de/', the_mail.alternatives[0][0])
+
+
+class AssembliesObjectManagerTests(AssembliesTestsMixin):
+    fixtures = [
+        'bootstrap_auth_groups',
+    ]
+
+    def setUp(self):
+        super().setUp()
+
+        self.conference2 = Conference(slug='bar', name='Bar Conference')
+        self.conference2.save()
+        self.assembly3 = Assembly(conference=self.conference2, slug='fnord', name='Fnord Assembly')
+        self.assembly3.save()
+        self.user_a3_mgmt = PlatformUser(username='manager3')
+        self.user_a3_mgmt.save()
+        ConferenceMember(conference=self.conference2, user=self.user_a3_mgmt).save()
+        self.assembly3.members.create(member=self.user_a3_mgmt, can_manage_assembly=True, show_public=True)
+        self.user_a3_part = PlatformUser(username='participant3')
+        self.user_a3_part.save()
+        ConferenceMember(conference=self.conference2, user=self.user_a3_part).save()
+        self.assembly3.members.create(member=self.user_a3_part, can_manage_assembly=False, show_public=True)
+
+        self.assembly_group = Group.objects.get(name='Assembly-Team')
+
+        self.user_conf_staff = PlatformUser(username='conf_staff')
+        self.user_conf_staff.save()
+        self.cm_conf_staff = ConferenceMember(
+            conference=self.conference,
+            user=self.user_conf_staff,
+            is_staff=True,
+        )
+        self.cm_conf_staff.save()
+        self.cm_conf_staff.permission_groups.add(self.assembly_group)
+
+        self.public_members = list(AssemblyMember.objects.filter(show_public=True))
+
+    def test_associated_with_user(self):
+        self.assertListEqual(
+            list(AssemblyMember.objects.associated_with_user(user=self.user_conf_staff, conference=self.conference)),
+            list(AssemblyMember.objects.filter(assembly__conference=self.conference)),
+        )
+        self.assertListEqual(
+            list(AssemblyMember.objects.associated_with_user(user=self.user_conf_staff, conference=self.conference, staff_can_see=False)),
+            [],
+        )
+        self.assertListEqual(
+            list(AssemblyMember.objects.associated_with_user(user=self.user_visitor, conference=self.conference)),
+            [],
+        )
+
+    def test_conference_accessible(self):
+        self.assertListEqual(
+            list(AssemblyMember.objects.conference_accessible(conference=self.conference)),
+            list(AssemblyMember.objects.filter(assembly__conference=self.conference, show_public=True)),
+        )
+        self.assertListEqual(
+            list(AssemblyMember.objects.conference_accessible(conference=self.conference)),
+            list(AssemblyMember.objects.filter(assembly__conference=self.conference, show_public=True)),
+        )