diff --git a/aleksis/apps/stoelindeling/forms.py b/aleksis/apps/stoelindeling/forms.py
index 8bae61c861976e8840d3f2d10d8f3be84c3ddb2d..e5f8c0edc2e0be6d8d7f6b43ec26f2669c409ebd 100644
--- a/aleksis/apps/stoelindeling/forms.py
+++ b/aleksis/apps/stoelindeling/forms.py
@@ -4,6 +4,7 @@ from django_select2.forms import ModelSelect2Widget
 from material import Layout, Row
 
 from aleksis.core.mixins import ExtensibleForm
+from aleksis.core.models import Group
 
 from .models import Seat, SeatingPlan
 
@@ -17,6 +18,16 @@ class SeatingPlanCreateForm(forms.ModelForm):
         )
     )
 
+    def __init__(self, *args, **kwargs):
+        self.request = kwargs.pop("request")
+        super().__init__(*args, **kwargs)
+
+        qs = Group.objects.all()
+        if not self.request.user.has_perm("stoelindeling.view_seatingplan"):
+            qs = qs.filter(owners=self.request.user.person)
+
+        self.fields["group"].queryset = qs
+
     class Meta:
         model = SeatingPlan
         fields = ["group", "subject", "room"]
diff --git a/aleksis/apps/stoelindeling/managers.py b/aleksis/apps/stoelindeling/managers.py
index 4854d491c2ea7eda3c9619e0f298df9ef4f72875..e43aa64adab86551fbe4ff75e2c2c7249b39df3e 100644
--- a/aleksis/apps/stoelindeling/managers.py
+++ b/aleksis/apps/stoelindeling/managers.py
@@ -20,8 +20,8 @@ class SeatQuerySet(QuerySet):
         start_y = aggr["y__min"] or 0
         end_x = aggr["x__max"] or 0
         end_y = aggr["y__max"] or 0
-        width = max(10, end_x - start_x)
-        height = max(10, end_y - start_y)
+        width = max(3, end_x - start_x)
+        height = max(3, end_y - start_y)
 
         end_x = start_x + width
         end_y = start_y + height
diff --git a/aleksis/apps/stoelindeling/models.py b/aleksis/apps/stoelindeling/models.py
index 6726b3b8a711a39804e3591ec7427ab13c48e55c..e87c2e1f8b5ca2ed7cfb02a2b37e4cd555815ae0 100644
--- a/aleksis/apps/stoelindeling/models.py
+++ b/aleksis/apps/stoelindeling/models.py
@@ -11,7 +11,9 @@ class SeatingPlan(ExtensibleModel):
     """Seating plan model."""
 
     group = models.ForeignKey(Group, on_delete=models.CASCADE, verbose_name=_("Group"))
-    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, verbose_name=_("Subject"))
+    subject = models.ForeignKey(
+        Subject, on_delete=models.CASCADE, verbose_name=_("Subject"), blank=True, null=True
+    )
     room = models.ForeignKey(Room, on_delete=models.CASCADE, verbose_name=_("Room"))
 
     def get_all_seats(self) -> SeatQuerySet:
diff --git a/aleksis/apps/stoelindeling/templates/stoelindeling/seating_plan/view.html b/aleksis/apps/stoelindeling/templates/stoelindeling/seating_plan/view.html
index 7baef788fa963bdac84a8073c2213e9b7a9b0391..f0c8b9ac5a817481131c9bfe363b23368ae1a5c8 100644
--- a/aleksis/apps/stoelindeling/templates/stoelindeling/seating_plan/view.html
+++ b/aleksis/apps/stoelindeling/templates/stoelindeling/seating_plan/view.html
@@ -1,7 +1,7 @@
 {# -*- engine:django -*- #}
 
 {% extends "core/base.html" %}
-{% load i18n static %}
+{% load i18n static rules %}
 
 {% block browser_title %}{% blocktrans %}Seating plan{% endblocktrans %}{% endblock %}
 
diff --git a/aleksis/apps/stoelindeling/util/perms.py b/aleksis/apps/stoelindeling/util/perms.py
index eb0ed1213028ec44cb259e8da1132a30f7380ee6..c55d09bf904f2dc618c9adcefbe982aba1fa516b 100644
--- a/aleksis/apps/stoelindeling/util/perms.py
+++ b/aleksis/apps/stoelindeling/util/perms.py
@@ -21,7 +21,7 @@ def get_allowed_seating_plans(user):
                     user, "stoelindeling.view_seatingplan", SeatingPlan
                 ).values_list("pk", flat=True)
             )
-            | Q(owner=user.person)
+            | Q(group__owners=user.person)
         )
         return qs
 
diff --git a/aleksis/apps/stoelindeling/views.py b/aleksis/apps/stoelindeling/views.py
index 48391321b2df19a2769888d06c4e2e4c1d0163f6..51b718935d482f2861e1dc57e52f4d5549c761a7 100644
--- a/aleksis/apps/stoelindeling/views.py
+++ b/aleksis/apps/stoelindeling/views.py
@@ -49,6 +49,11 @@ class SeatingPlanCreateView(PermissionRequiredMixin, AdvancedCreateView):
     success_url = reverse_lazy("seating_plans")
     success_message = _("The seating plan has been created.")
 
+    def get_form_kwargs(self):
+        kwargs = super().get_form_kwargs()
+        kwargs["request"] = self.request
+        return kwargs
+
 
 @method_decorator(never_cache, name="dispatch")
 class SeatingPlanEditView(PermissionRequiredMixin, AdvancedEditView):
@@ -58,7 +63,6 @@ class SeatingPlanEditView(PermissionRequiredMixin, AdvancedEditView):
     form_class = SeatingPlanForm
     permission_required = "stoelindeling.edit_seatingplan_rule"
     template_name = "stoelindeling/seating_plan/edit.html"
-    success_url = reverse_lazy("seating_plans")
     success_message = _("The seating plan has been saved.")
 
     def get_context_data(self, **kwargs):
@@ -108,7 +112,7 @@ class SeatingPlanEditView(PermissionRequiredMixin, AdvancedEditView):
             Seat.objects.bulk_update(objects_to_update, ["x", "y", "seated"])
 
             messages.success(self.request, _("The seating plan has been updated."))
-            return redirect("edit_seating_plan", self.object.pk)
+            return redirect("seating_plan", self.object.pk)
 
         return super().form_invalid(form)