diff --git a/aleksis/apps/abi/forms.py b/aleksis/apps/abi/forms.py
index 4627f03fa8627087749ec6584c0c09a3cf55306b..36a853bf1b4380cdb868b0f6ea6e1d22f33b823b 100644
--- a/aleksis/apps/abi/forms.py
+++ b/aleksis/apps/abi/forms.py
@@ -43,7 +43,12 @@ class AbiGroupForm(forms.ModelForm):
 
 class RankingCategoryForm(forms.ModelForm):
     layout = Layout(
-        "name", "instruction_text", "group", "number_of_persons", "number_of_persons_per_weight"
+        "name",
+        "instruction_text",
+        "voter_groups",
+        "group",
+        "number_of_persons",
+        "number_of_persons_per_weight",
     )
 
     class Meta:
@@ -51,6 +56,7 @@ class RankingCategoryForm(forms.ModelForm):
         fields = [
             "name",
             "instruction_text",
+            "voter_groups",
             "group",
             "number_of_persons",
             "number_of_persons_per_weight",
@@ -184,6 +190,12 @@ def ranking_form_factory(request: HttpRequest) -> forms.Form:
     rankings_by_user = Ranking.objects.filter(ranked_by=request.user.person.abi_person)
 
     for category in RankingCategory.objects.all():
+        if (
+            category.voter_groups.count() > 0
+            and not category.voter_groups.filter(members=request.user.person.abi_person).exists()
+        ):
+            continue
+
         field_layout.setdefault(category, [])
 
         instruction_field = forms.CharField(widget=PlainTextWidget(), required=False)
diff --git a/aleksis/apps/abi/migrations/0017_rankingcategory_voter_groups.py b/aleksis/apps/abi/migrations/0017_rankingcategory_voter_groups.py
new file mode 100644
index 0000000000000000000000000000000000000000..c98fad32671f26721335ff16a69db5b97442379f
--- /dev/null
+++ b/aleksis/apps/abi/migrations/0017_rankingcategory_voter_groups.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.16 on 2023-01-14 14:14
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('abi', '0016_rename_field_profilefieldvalue_profile_field'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='rankingcategory',
+            name='voter_groups',
+            field=models.ManyToManyField(blank=True, help_text='Only persons in these groups will be able to vote. Leave empty to allow all groups.', null=True, related_name='ranking_categories_voters', to='abi.AbiGroup', verbose_name='Voter Groups'),
+        ),
+    ]
diff --git a/aleksis/apps/abi/models.py b/aleksis/apps/abi/models.py
index 4aabfcb87f66f921269e3b15e328ea9b3185dea3..fcf37576ecba3b3d2cf3269273c50146e9271f73 100644
--- a/aleksis/apps/abi/models.py
+++ b/aleksis/apps/abi/models.py
@@ -213,6 +213,16 @@ class RankingCategory(ExtensibleModel):
         blank=True,
         help_text=_("This will be shown under the ranking's name on the ranking page."),
     )
+    voter_groups = models.ManyToManyField(
+        to=AbiGroup,
+        verbose_name=_("Voter Groups"),
+        help_text=_(
+            "Only persons in these groups will be able to vote. Leave empty to allow all groups."
+        ),
+        related_name="ranking_categories_voters",
+        blank=True,
+        null=True,
+    )
     group = models.ForeignKey(
         to=AbiGroup,
         on_delete=models.CASCADE,