diff --git a/aleksis/apps/paweljong/menus.py b/aleksis/apps/paweljong/menus.py
index 149cd54a637869ca14489f308f5caaf87ec7c370..446d6b95f7a2dc0b17f768e131806341b1b9998a 100644
--- a/aleksis/apps/paweljong/menus.py
+++ b/aleksis/apps/paweljong/menus.py
@@ -18,7 +18,7 @@ MENUS = {
             "validators": [
                 (
                     "aleksis.core.util.predicates.permission_validator",
-                    "paweljong.change_events_rule",
+                    "paweljong.view_menu",
                 )
             ],
             "submenu": [
@@ -95,7 +95,7 @@ MENUS = {
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
-                            "paweljong.view_registrations_rule",
+                            "paweljong.manage_registrations",
                         )
                     ],
                 },
diff --git a/aleksis/apps/paweljong/predicates.py b/aleksis/apps/paweljong/predicates.py
index 7288954a4858f7508debda30ea30e331a44fa86a..1816f377c6605fc719dec4d98408e1120445bbc9 100644
--- a/aleksis/apps/paweljong/predicates.py
+++ b/aleksis/apps/paweljong/predicates.py
@@ -11,28 +11,23 @@ User = get_user_model()
 
 
 @predicate
-def see_group_by_grouptype(user: User, group: Group) -> bool:
-    """Predicate which checks if the user is allowed to see the groups GroupType."""
-    grouptype = group.group_type
-
-    return check_object_permission(user, "core.view_grouptype", grouptype)
+def is_own_voucher(user: User, obj: Voucher) -> bool:
+    """Predicate which checks if the voucher belongs to the user."""
+    return obj.person == user.person
 
 
 @predicate
-def see_owned_groups_members(user: User, person: Person) -> bool:
-    """Owners of groups can see their members."""
-    groups_list = user.person.owner_of.all().values_list("id", flat=True)
-
-    return Person.member_of.filter(id__in=groups_list).exists()
+def is_own_registration(user: User, registration: EventRegistration) -> bool:
+    """Predicate which checks if the registration belongs to the user."""
+    return obj.person == user.person
 
 
 @predicate
-def is_own_voucher(user: User, voucher: Voucher) -> bool:
-    """Predicate which checks if the voucher belongs to the user."""
-    return voucher.person == user.person
-
+def is_organiser(user: User, obj: EventRegistration) -> bool:
+    """Predicate which checks if the user is an organiser."""
+    return user.person in obj.event.linked_group.owners.all()
 
 @predicate
-def is_own_registration(user: User, registration: EventRegistration) -> bool:
-    """Predicate which checks if the registration belongs to the user."""
-    return registration.person == user.person
+def is_event_published(obj: EventRegistration) -> bool:
+    """Predicate which checks if the event is published."""
+    return obj.published
diff --git a/aleksis/apps/paweljong/rules.py b/aleksis/apps/paweljong/rules.py
index 056af3de4f17ea5c2fed2fce93b168a7c5fd8f74..f6e1a80f459749abd236bcbd4db5f19c121ac218 100644
--- a/aleksis/apps/paweljong/rules.py
+++ b/aleksis/apps/paweljong/rules.py
@@ -9,34 +9,41 @@ from aleksis.core.util.predicates import (
     is_group_member,
 )
 
-from .models import Event, EventRegistration, Terms, Voucher
+from .models import Event, EventRegistration, Terms, Voucher, RegistrationState, InfoMailing
 from .predicates import (
     is_own_registration,
     is_own_voucher,
-    see_group_by_grouptype,
-    see_owned_groups_members,
+    is_organiser,
+    is_event_published,
 )
 
+## Vouchers
+
 # View vouchers
 view_vouchers_predicate = has_person & (
     has_global_perm("paweljong.view_voucher") | has_any_object("paweljong.view_voucher", Voucher)
 )
 rules.add_perm("paweljong.view_vouchers_rule", view_vouchers_predicate)
 
-# Edit vouchers
-change_vouchers_predicate = has_person & (
-    has_global_perm("paweljong.change_voucher")
-    | has_any_object("paweljong.change_voucher", Voucher)
+# View voucher
+view_voucher_predicate = has_person & (
+    is_own_voucher | has_global_perm("paweljong.view_voucher") | has_object_perm("paweljong.view_voucher")
 )
-rules.add_perm("paweljong.change_vouchers_rule", change_vouchers_predicate)
+rules.add_perm("paweljong.view_voucher_rule", view_voucher_predicate)
 
+# Edit voucher
+change_voucher_predicate = has_person & (
+    has_global_perm("paweljong.change_voucher")
+    | has_object_perm("paweljong.change_voucher")
+)
+rules.add_perm("paweljong.change_voucher_rule", change_voucher_predicate)
 
-# Delete vouchers
-delete_vouchers_predicate = has_person & (
+# Delete voucher
+delete_voucher_predicate = has_person & (
     has_global_perm("paweljong.delete_voucher")
-    | has_any_object("paweljong.delete_voucher", Voucher)
+    | has_object_perm("paweljong.delete_voucher")
 )
-rules.add_perm("paweljong.delete_vouchers_rule", delete_vouchers_predicate)
+rules.add_perm("paweljong.delete_voucher_rule", delete_voucher_predicate)
 
 # Create vouchers
 create_vouchers_predicate = has_person & (
@@ -45,18 +52,29 @@ create_vouchers_predicate = has_person & (
 )
 rules.add_perm("paweljong.create_vouchers_rule", create_vouchers_predicate)
 
-# Edit events
-change_events_predicate = has_person & (
-    has_global_perm("paweljong.change_event") | has_any_object("paweljong.change_event", Event)
+## Events
+
+# View events
+view_events_predicate = has_person & (
+    has_global_perm("paweljong.view_event") | has_any_object("paweljong.view_event", Event)
+)
+rules.add_perm("paweljong.view_events_rule", view_events_predicate)
+
+# Edit event
+change_event_predicate = has_person & (
+    has_global_perm("paweljong.change_event") | has_object_perm("paweljong.change_event")
 )
-rules.add_perm("paweljong.change_events_rule", change_events_predicate)
+rules.add_perm("paweljong.change_event_rule", change_event_predicate)
 
+# View event
+view_event_predicate = (is_event_published | (has_person & is_organiser) | has_object_perm("paweljong.view_event"))
+rules.add_perm("paweljong.view_event_rule", view_event_predicate)
 
-# Delete events
-delete_events_predicate = has_person & (
-    has_global_perm("paweljong.delete_event") | has_any_object("paweljong.delete_event", Event)
+# Delete event
+delete_event_predicate = has_person & (
+    has_global_perm("paweljong.delete_event") | has_object_perm("paweljong.delete_event")
 )
-rules.add_perm("paweljong.delete_events_rule", delete_events_predicate)
+rules.add_perm("paweljong.delete_event_rule", delete_event_predicate)
 
 # Create events
 create_events_predicate = has_person & (
@@ -64,45 +82,39 @@ create_events_predicate = has_person & (
 )
 rules.add_perm("paweljong.create_events_rule", create_events_predicate)
 
-# Allowed to see group
-may_see_group_predicate = has_person & (
-    is_group_member | has_any_object("core.view_group", Group) | see_group_by_grouptype
-)
-rules.add_perm("paweljong.may_see_group_rule", may_see_group_predicate)
+## Registrations
 
-may_see_person_predicate = has_person & (
-    see_owned_groups_members | has_object_perm("core.view_person")
+# View registration
+view_registration_predicate = has_person & (
+    has_global_perm("paweljong.view_eventregistration")
+    | has_object_perm("paweljong.view_eventregistration")
+    | is_organiser
+    | is_own_registration
 )
-rules.add_perm("paweljong.see_person_rule", may_see_person_predicate)
+rules.add_perm("paweljong.view_registration_rule", view_registration_predicate)
 
 # View registrations
 view_registrations_predicate = has_person & (
     has_global_perm("paweljong.view_eventregistration")
-    | has_any_object("paweljong.view_eventregistration", EventRegistration)
+    | has_any_object("paweljong.view_registration_rule", EventRegistration)
 )
 rules.add_perm("paweljong.view_registrations_rule", view_registrations_predicate)
 
-
-# Manage registrations
-manage_registrations_predicate = has_person & (
-    has_global_perm("paweljong.manage_registration")
-    | is_own_registration
-    | has_any_object("paweljong.manage_registration", EventRegistration)
-)
-rules.add_perm("paweljong.manage_registrations_rule", manage_registrations_predicate)
-
-# Delete registrations
-delete_registrations_predicate = has_person & (
+# Delete registration
+delete_registration_predicate = has_person & (
     has_global_perm("paweljong.delete_eventregistration")
-    | has_any_object("paweljong.delete_eventregistration", EventRegistration)
+    | has_object_perm("paweljong.delete_eventregistration")
 )
-rules.add_perm("paweljong.delete_registrations_rule", delete_registrations_predicate)
-
+rules.add_perm("paweljong.delete_registration_rule", delete_registration_predicate)
 
-# Is own voucher?
-is_own_voucher_predicate = has_person & (is_own_voucher)
-rules.add_perm("paweljong.is_own_voucher_rule", is_own_voucher_predicate)
+# Change registration
+change_registration_predicate = has_person & (
+    has_global_perm("paweljong.change_eventregistration")
+    | has_object_perm("paweljong.change_eventregistration")
+)
+rules.add_perm("paweljong.change_registration_rule", change_registration_predicate)
 
+## Terms
 
 # View terms
 view_terms_predicate = has_person & (
@@ -110,6 +122,33 @@ view_terms_predicate = has_person & (
 )
 rules.add_perm("paweljong.view_terms_rule", view_terms_predicate)
 
+# View term
+view_term_predicate = has_person & (
+    has_global_perm("paweljong.view_term") | has_object_perm("paweljong.view_term")
+)
+rules.add_perm("paweljong.view_term_rule", view_term_predicate)
+
+# Delete term
+delete_term_predicate = has_person & (
+    has_global_perm("paweljong.delete_eventterm")
+    | has_object_perm("paweljong.delete_eventterm")
+)
+rules.add_perm("paweljong.delete_term_rule", delete_term_predicate)
+
+# Change term
+change_term_predicate = has_person & (
+    has_global_perm("paweljong.change_eventterm")
+    | has_object_perm("paweljong.change_eventterm")
+)
+rules.add_perm("paweljong.change_term_rule", change_term_predicate)
+
+# Create terms
+create_terms_predicate = has_person & (
+    has_global_perm("paweljong.create_term") | has_any_object("paweljong.create_term", Event)
+)
+rules.add_perm("paweljong.create_terms_rule", create_terms_predicate)
+
+## Info mailings
 
 # View info_mailings
 view_info_mailings_predicate = has_person & (
@@ -117,3 +156,75 @@ view_info_mailings_predicate = has_person & (
     | has_any_object("paweljong.view_info_mailing", Terms)
 )
 rules.add_perm("paweljong.view_info_mailings_rule", view_info_mailings_predicate)
+
+# View info_mailing
+view_info_mailing_predicate = has_person & (
+    has_global_perm("paweljong.view_info_mailing") | has_object_perm("paweljong.view_info_mailing")
+)
+rules.add_perm("paweljong.view_info_mailing_rule", view_info_mailing_predicate)
+
+# Delete info_mailing
+delete_info_mailing_predicate = has_person & (
+    has_global_perm("paweljong.delete_eventinfo_mailing")
+    | has_object_perm("paweljong.delete_eventinfo_mailing")
+)
+rules.add_perm("paweljong.delete_info_mailing_rule", delete_info_mailing_predicate)
+
+# Change info_mailing
+change_info_mailing_predicate = has_person & (
+    has_global_perm("paweljong.change_eventinfo_mailing")
+    | has_object_perm("paweljong.change_eventinfo_mailing")
+)
+rules.add_perm("paweljong.change_info_mailing_rule", change_info_mailing_predicate)
+
+# Create info_mailings
+create_info_mailings_predicate = has_person & (
+    has_global_perm("paweljong.create_info_mailing") | has_any_object("paweljong.create_info_mailing", Event)
+)
+rules.add_perm("paweljong.create_info_mailings_rule", create_info_mailings_predicate)
+
+## Registration states
+
+# View registration_states
+view_registration_states_predicate = has_person & (
+    has_global_perm("paweljong.view_registration_state")
+    | has_any_object("paweljong.view_registration_state", Terms)
+)
+rules.add_perm("paweljong.view_registration_states_rule", view_registration_states_predicate)
+
+# View registration_state
+view_registration_state_predicate = has_person & (
+    has_global_perm("paweljong.view_registration_state") | has_object_perm("paweljong.view_registration_state")
+)
+rules.add_perm("paweljong.view_registration_state_rule", view_registration_state_predicate)
+
+# Delete registration_state
+delete_registration_state_predicate = has_person & (
+    has_global_perm("paweljong.delete_eventregistration_state")
+    | has_object_perm("paweljong.delete_eventregistration_state")
+)
+rules.add_perm("paweljong.delete_registration_state_rule", delete_registration_state_predicate)
+
+# Change registration_state
+change_registration_state_predicate = has_person & (
+    has_global_perm("paweljong.change_eventregistration_state")
+    | has_object_perm("paweljong.change_eventregistration_state")
+)
+rules.add_perm("paweljong.change_registration_state_rule", change_registration_state_predicate)
+
+# Create registration_states
+create_registration_states_predicate = has_person & (
+    has_global_perm("paweljong.create_registration_state") | has_any_object("paweljong.create_registration_state", Event)
+)
+rules.add_perm("paweljong.create_registration_states_rule", create_registration_states_predicate)
+
+# View menu
+can_view_menu_predicate = has_person & (
+    view_registrations_predicate
+    | view_info_mailings_predicate
+    | view_terms_predicate
+    | view_vouchers_predicate
+    | view_events_predicate
+    | view_events_registration_states_predicate
+)
+rules.add_perm("paweljong.view_menu", can_view_menu_predicate)
diff --git a/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html b/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html
index 4c7931f704b9a5d3c93f087da7751e7b99c935c5..c7b30e4fd4f4ab331f78b7501e1bafaecf4756ef 100644
--- a/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html
+++ b/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html
@@ -51,8 +51,7 @@
   <h5>{% blocktrans %}Contact details{% endblocktrans %}</h5>
   <div class="row">
     <div class="col s12 m4">
-      {% has_perm 'core.view_photo' user registration.person as can_view_photo %}
-      {% if registration.person.photo and can_view_photo %}
+      {% if registration.person.photo %}
         <img class="person-img" src="{{ registration.person.photo.url }}"
              alt="{{ registration.person.first_name }} {{ registration.person.last_name }}"/>
       {% else %}
@@ -64,7 +63,6 @@
       <table class="responsive-table highlight">
         <tr>
           <td rowspan="6">
-
           </td>
           <td>
             <i class="material-icons small">person</i>
@@ -89,31 +87,25 @@
             <td colspan="2">{{ registration.person.postal_code }} {{ registration.person.place }}</td>
           </tr>
         {% endif %}
-        {% has_perm 'core.view_contact_details' user registration.person as can_view_contact_details %}
-        {% if can_view_contact_details %}
-          <tr>
-            <td>
-              <i class="material-icons small">phone</i>
-            </td>
-            <td>{{ registration.person.phone_number }}</td>
-            <td>{{ registration.person.mobile_number }}</td>
-          </tr>
-          <tr>
-            <td>
-              <i class="material-icons small">email</i>
-            </td>
-            <td colspan="3">{{ registration.person.email }}</td>
-          </tr>
-        {% endif %}
-        {% has_perm 'core.view_personal_details' user registration.person as can_view_personal_details %}
-        {% if can_view_personal_details %}
-          <tr>
-            <td>
-              <i class="material-icons small">cake</i>
-            </td>
-            <td colspan="3">{{ registration.person.date_of_birth|date }}</td>
-          </tr>
-        {% endif %}
+        <tr>
+          <td>
+            <i class="material-icons small">phone</i>
+          </td>
+          <td>{{ registration.person.phone_number }}</td>
+          <td>{{ registration.person.mobile_number }}</td>
+        </tr>
+        <tr>
+          <td>
+            <i class="material-icons small">email</i>
+          </td>
+          <td colspan="3">{{ registration.person.email }}</td>
+        </tr>
+        <tr>
+          <td>
+            <i class="material-icons small">cake</i>
+          </td>
+          <td colspan="3">{{ registration.person.date_of_birth|date }}</td>
+        </tr>
         <tr>
           <td></td>
           <td>
@@ -164,7 +156,6 @@
             </tr>
           {% endfor %}
         {% endif %}
-
         <tr>
           <tr>
             <td>
@@ -189,7 +180,7 @@
     </div>
   </div>
 
-  {% if registration.person.guardians.all and can_view_personal_details %}
+  {% if registration.person.guardians.all %}
   <h5>{% trans "Guardians / Parents "%}</h5>
   {% for person in registration.person.guardians.all %}
     <div class="col s12 m8">
@@ -221,22 +212,19 @@
             <td colspan="2">{{ person.postal_code }} {{ person.place }}</td>
           </tr>
         {% endif %}
-        {% has_perm 'core.view_contact_details' user person as can_view_contact_details %}
-        {% if can_view_contact_details %}
-          <tr>
-            <td>
-              <i class="material-icons small">phone</i>
-            </td>
-            <td>{{ person.phone_number }}</td>
-            <td>{{ person.mobile_number }}</td>
-          </tr>
-          <tr>
-            <td>
-              <i class="material-icons small">email</i>
-            </td>
-            <td colspan="3">{{ person.email }}</td>
-          </tr>
-        {% endif %}
+        <tr>
+          <td>
+            <i class="material-icons small">phone</i>
+          </td>
+          <td>{{ person.phone_number }}</td>
+          <td>{{ person.mobile_number }}</td>
+        </tr>
+        <tr>
+          <td>
+            <i class="material-icons small">email</i>
+          </td>
+          <td colspan="3">{{ person.email }}</td>
+        </tr>
         {% has_perm 'core.view_personal_details' user person as can_view_personal_details %}
         {% if can_view_personal_details %}
           <tr>
diff --git a/aleksis/apps/paweljong/views.py b/aleksis/apps/paweljong/views.py
index 6a7bd98bfcaf9ad92efeae4f7880ae3faadb4578..da4a03860bf84c58d3639f01578b54f3bf533473 100644
--- a/aleksis/apps/paweljong/views.py
+++ b/aleksis/apps/paweljong/views.py
@@ -26,6 +26,7 @@ from aleksis.apps.postbuero.models import MailAddress
 from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView
 from aleksis.core.models import Activity, Person
 from aleksis.core.util import messages
+from aleksis.core.util.predicates import queryset_rules_filter
 from aleksis.core.util.core_helpers import get_site_preferences, objectgetter_optional
 
 from .filters import EventFilter, EventRegistrationFilter, VoucherFilter
@@ -56,7 +57,7 @@ User = get_user_model()
 class CreateEventView(PermissionRequiredMixin, AdvancedCreateView):
     form_class = EditEventForm
     model = Event
-    permission_required = "paweljong.change_event"
+    permission_required = "paweljong.create_events_rule"
     template_name = "paweljong/event/create.html"
     success_url = reverse_lazy("manage_events")
     success_message = _("The event has been saved.")
@@ -67,14 +68,14 @@ class EditEventView(PermissionRequiredMixin, RevisionMixin, AdvancedEditView):
     form_class = EditEventForm
     model = Event
     slug_field = "slug"
-    permission_required = "paweljong.change_event"
+    permission_required = "paweljong.change_event_rule"
     context_object_name = "manage_events"
     template_name = "paweljong/event/edit.html"
     success_url = reverse_lazy("manage_events")
     success_message = _("The event has been saved.")
 
 
-@permission_required("paweljong.change_events")
+@permission_required("paweljong.view_events_rule")
 def manage_events(request: HttpRequest) -> HttpResponse:
     """List view listing all registrations."""
     context = {}
@@ -95,7 +96,7 @@ def manage_events(request: HttpRequest) -> HttpResponse:
     return render(request, "paweljong/event/manage.html", context)
 
 
-@permission_required("paweljong.view_vouchers")
+@permission_required("paweljong.view_vouchers_rule")
 def vouchers(request):
     context = {}
 
@@ -114,7 +115,7 @@ def vouchers(request):
     return render(request, "paweljong/voucher/list.html", context)
 
 
-@permission_required("paweljong.generate_lists")
+@permission_required("paweljong.generate_lists_rule")
 def generate_lists(request: HttpRequest) -> HttpResponse:
     context = {}
 
@@ -134,13 +135,13 @@ def generate_lists(request: HttpRequest) -> HttpResponse:
     return render(request, "paweljong/print/manage.html", context)
 
 
-@permission_required("paweljong.view_registrations")
+@permission_required("paweljong.view_registrations_rule")
 def registrations(request: HttpRequest) -> HttpResponse:
     """List view listing all registrations."""
     context = {}
 
     # Get all registrations
-    registrations = EventRegistration.objects.all()
+    registrations = queryset_rules_filter(request.user, EventRegistration.objects.all(), "paweljong.manage_registrations_rule")
 
     # Get filter
     registrations_filter = EventRegistrationFilter(request.GET, queryset=registrations)
@@ -160,7 +161,7 @@ class EventRegistrationCreateView(PermissionRequiredMixin, AdvancedCreateView):
 
     model = EventRegistration
     form_class = EditEventRegistrationForm
-    permission_required = "paweljong.manage_registration"
+    permission_required = "paweljong.create_eventregistration_rule"
     template_name = "paweljong/event_registration/create.html"
     success_url = reverse_lazy("registrations")
     success_message = _("The event registration has been created.")
@@ -172,14 +173,14 @@ class EventRegistrationEditView(PermissionRequiredMixin, AdvancedEditView):
 
     model = EventRegistration
     form_class = EditEventRegistrationForm
-    permission_required = "paweljong.manage_eventregistration"
+    permission_required = "paweljong.change_eventregistration_rule"
     template_name = "paweljong/event_registration/edit.html"
     success_url = reverse_lazy("registrations")
     success_message = _("The event registration has been saved.")
 
 
 @permission_required(
-    "paweljong.manage_registrations",
+    "paweljong.change_eventregistration_rule",
     fn=objectgetter_optional(EventRegistration, None, False),
 )
 def edit_registration(request: HttpRequest, pk) -> HttpResponse:
@@ -205,7 +206,7 @@ def edit_registration(request: HttpRequest, pk) -> HttpResponse:
     return render(request, "paweljong/event_registration/edit.html", context)
 
 
-@permission_required("paweljong.is_own_voucher", fn=objectgetter_optional(Voucher, None, False))
+@permission_required("paweljong.view_voucher_rule", fn=objectgetter_optional(Voucher, None, False))
 def print_voucher(request: HttpRequest, pk) -> HttpResponse:
     context = {}
 
@@ -219,7 +220,7 @@ class EventRegistrationDetailView(PermissionRequiredMixin, DetailView):
     """Detail view for an application instance."""
 
     context_object_name = "registration"
-    permission_required = "paweljong.view_registration"
+    permission_required = "paweljong.view_registration_rule"
     template_name = "paweljong/event_registration/full.html"
 
     def get_queryset(self):
@@ -230,7 +231,7 @@ class EventRegistrationDeleteView(PermissionRequiredMixin, AdvancedDeleteView):
     """Delete view for registrations."""
 
     model = EventRegistration
-    permission_required = "paweljong.delete_eventregistration"
+    permission_required = "paweljong.delete_eventregistration_rule"
     template_name = "core/pages/delete.html"
     success_url = reverse_lazy("registrations")
     success_message = _("The registration has been deleted.")
@@ -242,7 +243,7 @@ class VoucherCreateView(PermissionRequiredMixin, AdvancedCreateView):
 
     model = Voucher
     form_class = EditVoucherForm
-    permission_required = "paweljong.add_voucher"
+    permission_required = "paweljong.create_voucher_rule"
     template_name = "paweljong/voucher/create.html"
     success_url = reverse_lazy("vouchers")
     success_message = _("The voucher has been created.")
@@ -254,7 +255,7 @@ class VoucherEditView(PermissionRequiredMixin, AdvancedEditView):
 
     model = Voucher
     form_class = EditVoucherForm
-    permission_required = "paweljong.edit_voucher"
+    permission_required = "paweljong.change_voucher_rule"
     template_name = "paweljong/voucher/edit.html"
     success_url = reverse_lazy("vouchers")
     success_message = _("The voucher has been saved.")
@@ -264,7 +265,7 @@ class VoucherDeleteView(PermissionRequiredMixin, AdvancedDeleteView):
     """Delete view for vouchers."""
 
     model = Voucher
-    permission_required = "paweljong.delete_voucher"
+    permission_required = "paweljong.delete_voucher_rule"
     template_name = "core/pages/delete.html"
     success_url = reverse_lazy("vouchers")
     success_message = _("The voucher has been deleted.")
@@ -686,12 +687,13 @@ class RegisterEventWizardView(SessionWizardView):
         return redirect("do_payment", registration.get_invoice().token)
 
 
-class EventFullView(DetailView):
+class EventFullView(PermissionRequiredMixin, DetailView):
 
     model = Event
     slug_field = "slug"
     template_name = "paweljong/event/full.html"
     object_context_name = "event"
+    permission_required = "paweljong.view_event_rule"
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
@@ -701,12 +703,13 @@ class EventFullView(DetailView):
         return context
 
 
-class RegisterEventStart(DetailView):
+class RegisterEventStart(PermissionRequiredMixin, DetailView):
 
     model = Event
     slug_field = "slug"
     template_name = "paweljong/event/register_start.html"
     object_context_name = "event"
+    permission_required = "paweljong.view_event_rule"
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
@@ -720,7 +723,7 @@ class TermListView(PermissionRequiredMixin, SingleTableView):
 
     model = Terms
     table_class = TermsTable
-    permission_required = "paweljong.view_terms"
+    permission_required = "paweljong.view_terms_rule"
     template_name = "paweljong/term/list.html"
 
 
@@ -730,7 +733,7 @@ class TermCreateView(PermissionRequiredMixin, AdvancedCreateView):
 
     model = Terms
     form_class = EditTermForm
-    permission_required = "paweljong.add_terms"
+    permission_required = "paweljong.create_terms_rule"
     template_name = "paweljong/term/create.html"
     success_url = reverse_lazy("terms")
     success_message = _("The term has been created.")
@@ -742,7 +745,7 @@ class TermEditView(PermissionRequiredMixin, AdvancedEditView):
 
     model = Terms
     form_class = EditTermForm
-    permission_required = "paweljong.edit_terms"
+    permission_required = "paweljong.change_terms_rule"
     template_name = "paweljong/term/edit.html"
     success_url = reverse_lazy("terms")
     success_message = _("The term has been saved.")
@@ -789,7 +792,7 @@ class InfoMailingListView(PermissionRequiredMixin, SingleTableView):
 
     model = InfoMailing
     table_class = InfoMailingsTable
-    permission_required = "paweljong.view_info_mailing"
+    permission_required = "paweljong.view_info_mailings_rule"
     template_name = "paweljong/info_mailing/list.html"
 
 
@@ -799,7 +802,7 @@ class InfoMailingCreateView(PermissionRequiredMixin, AdvancedCreateView):
 
     model = InfoMailing
     form_class = EditInfoMailingForm
-    permission_required = "paweljong.add_info_mailing"
+    permission_required = "paweljong.create_info_mailing_rule"
     template_name = "paweljong/info_mailing/create.html"
     success_url = reverse_lazy("info_mailings")
     success_message = _("The info mailing has been created.")
@@ -811,7 +814,7 @@ class InfoMailingEditView(PermissionRequiredMixin, AdvancedEditView):
 
     model = InfoMailing
     form_class = EditInfoMailingForm
-    permission_required = "paweljong.edit_info_mailing"
+    permission_required = "paweljong.change_info_mailing_rule"
     template_name = "paweljong/info_mailing/edit.html"
     success_url = reverse_lazy("info_mailings")
     success_message = _("The info mailing has been saved.")
@@ -821,7 +824,7 @@ class InfoMailingDeleteView(PermissionRequiredMixin, AdvancedDeleteView):
     """Delete view for info mailings."""
 
     model = InfoMailing
-    permission_required = "paweljong.delete_info_mailing"
+    permission_required = "paweljong.delete_info_mailing_rule"
     template_name = "core/pages/delete.html"
     success_url = reverse_lazy("info_mailings")
     success_message = _("The info mailing has been deleted.")
@@ -830,7 +833,7 @@ class InfoMailingDeleteView(PermissionRequiredMixin, AdvancedDeleteView):
 class SendMailFromRegistration(PermissionRequiredMixin, FormView):
 
     template_name = "paweljong/event_registration/notification.html"
-    permission_required = "paweljong.send_notification_mail"
+    permission_required = "paweljong.send_notification_mail_rule"
     form_class = RegistrationNotificationForm
     success_url = reverse_lazy("registrations")
 
@@ -871,7 +874,7 @@ class RegistrationStateListView(PermissionRequiredMixin, SingleTableView):
 
     model = RegistrationState
     table_class = RegistrationStatesTable
-    permission_required = "paweljong.view_registration_states"
+    permission_required = "paweljong.view_registration_states_rule"
     template_name = "paweljong/registration_state/list.html"
 
 
@@ -881,7 +884,7 @@ class RegistrationStateCreateView(PermissionRequiredMixin, AdvancedCreateView):
 
     model = RegistrationState
     form_class = RegistrationStatesForm
-    permission_required = "paweljong.add_registration_states"
+    permission_required = "paweljong.create_registration_states_rule"
     template_name = "paweljong/registration_state/create.html"
     success_url = reverse_lazy("registration_states")
     success_message = _("The term has been created.")
@@ -893,7 +896,7 @@ class RegistrationStateEditView(PermissionRequiredMixin, AdvancedEditView):
 
     model = RegistrationState
     form_class = RegistrationStatesForm
-    permission_required = "paweljong.edit_registration_states"
+    permission_required = "paweljong.change_registration_states_rule"
     template_name = "paweljong/registration_state/edit.html"
     success_url = reverse_lazy("registration_states")
     success_message = _("The term has been saved.")