diff --git a/aleksis/apps/ticdesk/forms.py b/aleksis/apps/ticdesk/forms.py
index 4258080d31fa422c68064a4de115c00f1eb85f40..e5f87a1a7270f6d39f1dac80fa4481bb9e3241d8 100644
--- a/aleksis/apps/ticdesk/forms.py
+++ b/aleksis/apps/ticdesk/forms.py
@@ -197,12 +197,13 @@ class EditEventForm(forms.ModelForm):
 
     layout = Layout(
         Fieldset(_("Base data"), Row("group", "description", Row("place"), "published"),
-        Fieldset(_("Date data"), Row("date_event", "date_registration", "date_retraction"),
-        Fieldset(_("Feedback aspects"), "feedback_aspects"),
+        Fieldset(_("Date data"), Row("date_event", "date_registration", "date_retraction")),
+        Fieldset(_("Feedback aspects"), "feedback_aspects")),
     )
 
     class Meta:
         model = TeckidsEvent
+        exclude = []
 
 
 class EditVoucherForm(forms.ModelForm):
diff --git a/aleksis/apps/ticdesk/menus.py b/aleksis/apps/ticdesk/menus.py
index 14a51f27393ba5708a70f0223387813c5c4f544e..59582839da9fb93af4a796e28821a39a32c6a76e 100644
--- a/aleksis/apps/ticdesk/menus.py
+++ b/aleksis/apps/ticdesk/menus.py
@@ -3,24 +3,6 @@ from django.utils.translation import gettext_lazy as _
 MENUS = {
     "NAV_MENU_CORE": [
         {"name": _("Events"), "url": "events", "icon": "event",},
-        {
-            "name": _("Keys and mail"),
-            "url": "#",
-            "icon": "vpn_key",
-            "root": True,
-            "validators": [
-                ("aleksis.core.util.predicates.permission_validator", "core.has_person")
-            ],
-            "submenu": [
-                {"name": _("Mail addresses"), "url": "manage_mail", "icon": "email",},
-                {"name": _("SSH keys"), "url": "manage_ssh_keys", "icon": "vpn_key",},
-                {
-                    "name": _("PGP keys"),
-                    "url": "manage_pgp_keys",
-                    "icon": "enhanced_encryption",
-                },
-            ],
-        },
         {
             "name": _("Vouchers"),
             "url": "#",
diff --git a/aleksis/apps/ticdesk/migrations/0019_auto_20200926_2018.py b/aleksis/apps/ticdesk/migrations/0019_auto_20200926_2018.py
new file mode 100644
index 0000000000000000000000000000000000000000..371bc7f84eec92e4231893393a7ddb0a4f6e42aa
--- /dev/null
+++ b/aleksis/apps/ticdesk/migrations/0019_auto_20200926_2018.py
@@ -0,0 +1,137 @@
+# Generated by Django 3.1.1 on 2020-09-26 20:18
+
+import django.contrib.postgres.fields.jsonb
+import django.contrib.sites.managers
+from django.db import migrations, models
+import django.db.models.deletion
+import django_iban.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0004_auto_20200728_1145'),
+        ('sites', '0002_alter_domain_unique'),
+        ('ticdesk', '0018_auto_20200802_1646'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='TeckidsEvent',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('extended_data', django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False)),
+                ('description', models.CharField(max_length=500, verbose_name='Description')),
+                ('published', models.BooleanField(default=False, verbose_name='Publish')),
+                ('place', models.CharField(max_length=50, verbose_name='Place')),
+                ('date_event', models.DateTimeField(verbose_name='Date of event')),
+                ('date_registration', models.DateTimeField(verbose_name='Registration deadline')),
+                ('date_retraction', models.DateTimeField(verbose_name='Retraction deadline')),
+                ('cost', models.IntegerField(verbose_name='Cost in €')),
+                ('max_participants', models.IntegerField(verbose_name='Max participants')),
+                ('feedback_aspects', models.ManyToManyField(related_name='event', to='ticdesk.FeedbackAspect', verbose_name='Feedback aspects')),
+                ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='event', to='core.group', verbose_name='Group')),
+                ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
+            ],
+            options={
+                'verbose_name': 'Teckids event',
+                'verbose_name_plural': 'Teckids events',
+                'ordering': ('date_event',),
+            },
+            managers=[
+                ('objects', django.contrib.sites.managers.CurrentSiteManager()),
+            ],
+        ),
+        migrations.RemoveField(
+            model_name='pgpkey',
+            name='person',
+        ),
+        migrations.RemoveField(
+            model_name='pgpkey',
+            name='site',
+        ),
+        migrations.AlterUniqueTogether(
+            name='registrationfield',
+            unique_together=None,
+        ),
+        migrations.RemoveField(
+            model_name='registrationfield',
+            name='person',
+        ),
+        migrations.RemoveField(
+            model_name='registrationfield',
+            name='project',
+        ),
+        migrations.RemoveField(
+            model_name='registrationfield',
+            name='site',
+        ),
+        migrations.RemoveField(
+            model_name='sshkey',
+            name='person',
+        ),
+        migrations.RemoveField(
+            model_name='sshkey',
+            name='site',
+        ),
+        migrations.RemoveField(
+            model_name='teckidsproject',
+            name='feedback_aspects',
+        ),
+        migrations.RemoveField(
+            model_name='teckidsproject',
+            name='members',
+        ),
+        migrations.RemoveField(
+            model_name='teckidsproject',
+            name='owners',
+        ),
+        migrations.RemoveField(
+            model_name='teckidsproject',
+            name='site',
+        ),
+        migrations.RemoveField(
+            model_name='voucher',
+            name='project',
+        ),
+        migrations.AlterField(
+            model_name='eventregistration',
+            name='channel',
+            field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Channel'),
+        ),
+        migrations.AlterField(
+            model_name='eventregistration',
+            name='iban',
+            field=django_iban.fields.IBANField(enforce_database_constraint=True, max_length=34, null=True, verbose_name='IBAN (for SEPA direct debit)'),
+        ),
+        migrations.AlterField(
+            model_name='voucher',
+            name='used_person_uid',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='used_vouchers', to='core.person', verbose_name='Used by'),
+        ),
+        migrations.DeleteModel(
+            name='MailAddress',
+        ),
+        migrations.DeleteModel(
+            name='PGPKey',
+        ),
+        migrations.DeleteModel(
+            name='RegistrationField',
+        ),
+        migrations.DeleteModel(
+            name='SSHKey',
+        ),
+        migrations.AddField(
+            model_name='voucher',
+            name='event',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vouchers', to='ticdesk.teckidsevent', verbose_name='Event'),
+        ),
+        migrations.AlterField(
+            model_name='eventregistration',
+            name='event',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ticdesk.teckidsevent', verbose_name='Event'),
+        ),
+        migrations.DeleteModel(
+            name='TeckidsProject',
+        ),
+    ]
diff --git a/aleksis/apps/ticdesk/models.py b/aleksis/apps/ticdesk/models.py
index b54c4c0c15c656869149e772405d31710675b671..e2f10aa27f7319789f7ce80f5dcc2bacf2472dc7 100644
--- a/aleksis/apps/ticdesk/models.py
+++ b/aleksis/apps/ticdesk/models.py
@@ -5,7 +5,7 @@ from django.utils.translation import gettext_lazy as _
 from django_iban.fields import IBANField
 
 from aleksis.core.mixins import ExtensibleModel, PureDjangoModel
-from aleksis.core.models import Person
+from aleksis.core.models import Person, Group
 
 
 class TeckidsMember(ExtensibleModel):
@@ -122,8 +122,9 @@ class Voucher(ExtensibleModel):
     event = models.ForeignKey(
         TeckidsEvent,
         related_name="vouchers",
-        verbose_name=_("Project"),
+        verbose_name=_("Event"),
         on_delete=models.CASCADE,
+        null=True,
     )
     person = models.ForeignKey(
         Person,
@@ -134,7 +135,7 @@ class Voucher(ExtensibleModel):
     discount = models.IntegerField(default=100)
 
     used = models.BooleanField(default=False)
-    used_person_uid = models.ForeignKey(core.Person, on_delete=models.CASCADE, verbose_name=_("Used by"), related_name="used_vouchers")
+    used_person_uid = models.ForeignKey(Person, on_delete=models.CASCADE, verbose_name=_("Used by"), related_name="used_vouchers", null=True)
     deleted = models.BooleanField(default=False)
 
     def __str__(self) -> str:
@@ -194,9 +195,10 @@ class EventRegistration(ExtensibleModel):
     )
 
     accept_sepa = models.BooleanField(verbose_name=_("SEPA direct debit"))
-    iban = models.IBANField(
+    iban = IBANField(
         verbose_name=_("IBAN (for SEPA direct debit)"),
         enforce_database_constraint=True,
+        null=True,
     )
 
     accept_terms = models.BooleanField(
diff --git a/aleksis/apps/ticdesk/predicates.py b/aleksis/apps/ticdesk/predicates.py
index a837e64b4c1860390fc89333b0f4a458cecdfff1..2619055afef34cf4786486d966fd819c574c6623 100644
--- a/aleksis/apps/ticdesk/predicates.py
+++ b/aleksis/apps/ticdesk/predicates.py
@@ -5,7 +5,7 @@ from rules import predicate
 from aleksis.core.models import Group, Person
 from aleksis.core.util.predicates import check_object_permission
 
-from .models import Voucher
+from .models import Voucher, EventRegistration
 
 User = get_user_model()
 
@@ -34,7 +34,7 @@ def is_own_voucher(user: User, voucher: Voucher) -> bool:
 
 
 @predicate
-def is_own_registration(user: User, registration: Registration) -> bool:
-    """Predicate which checks if the registration belongs to the user.""""
+def is_own_registration(user: User, registration: EventRegistration) -> bool:
+    """Predicate which checks if the registration belongs to the user."""
 
     return registration.person == user.person
diff --git a/aleksis/apps/ticdesk/rules.py b/aleksis/apps/ticdesk/rules.py
index 7a7bc50e7a27a07d6f692e76f9ad14019a3c42af..102ca794f77a119618dba596ba7ec51a66c0a855 100644
--- a/aleksis/apps/ticdesk/rules.py
+++ b/aleksis/apps/ticdesk/rules.py
@@ -118,18 +118,11 @@ manage_teckids_members_predicate = has_person & (
 )
 add_perm("ticdesk.manage_teckids_members", manage_teckids_members_predicate)
 
+
 # Is own voucher?
 is_own_voucher_predicate = has_person & (is_own_voucher)
 add_perm("ticdesk.is_own_voucher", is_own_voucher_predicate)
 
-# Is own ssh key?
-is_own_ssh_key_predicate = has_person & (is_own_ssh_key)
-add_perm("ticdesk.is_own_ssh_key", is_own_ssh_key_predicate)
-
-# Is own pgp key?
-is_own_pgp_key_predicate = has_person & (is_own_pgp_key)
-add_perm("ticdesk.is_own_pgp_key", is_own_pgp_key_predicate)
-
 
 # View feedback aspects
 view_feedback_aspects_predicate = has_person & (
diff --git a/aleksis/apps/ticdesk/urls.py b/aleksis/apps/ticdesk/urls.py
index ec5744fda6305464c6dfdcf87136818eec90c7ac..b8181e9acdd5050e2a8c28df7686f3d01ea0ea70 100644
--- a/aleksis/apps/ticdesk/urls.py
+++ b/aleksis/apps/ticdesk/urls.py
@@ -3,11 +3,6 @@ from django.urls import path
 from . import views
 
 urlpatterns = [
-    path(
-        "event/<int:id_>/additional",
-        views.register_event_additional,
-        name="register_event_additional_by_id",
-    ),
     path("event/<int:id_>/edit", views.edit_event, name="edit_event_by_id"),
     path("event/<int:id_>/feedback", views.feedback_event, name="feedback_event_by_id"),
     path("event/<int:id_>/register", views.register_event, name="register_event_by_id"),
@@ -21,19 +16,6 @@ urlpatterns = [
     path("vouchers/<int:id_>/edit", views.edit_voucher, name="edit_voucher_by_id"),
     path("vouchers/<int:id_>/print", views.print_voucher, name="print_voucher_by_id"),
     path("vouchers/", views.vouchers, name="vouchers"),
-    path("manage/mails", views.manage_mail, name="manage_mail"),
-    path("manage/ssh_keys", views.manage_ssh_keys, name="manage_ssh_keys"),
-    path("manage/pgp_keys", views.manage_pgp_keys, name="manage_pgp_keys"),
-    path(
-        "manage/ssh_keys/<int:id_>/delete",
-        views.delete_sshkey,
-        name="delete_sshkey_by_id",
-    ),
-    path(
-        "manage/pgp_keys/<int:id_>/delete",
-        views.delete_pgpkey,
-        name="delete_pgpkey_by_id",
-    ),
     path("event/lists/generate", views.generate_lists, name="generate_lists"),
     path("event/registrations/list", views.registrations, name="registrations"),
     path(
diff --git a/aleksis/apps/ticdesk/views.py b/aleksis/apps/ticdesk/views.py
index 84d918ef7ef6d96489e2bdacd67abc16737477f5..c2bce51b74ed80b08876d07e186f3e47171b6d78 100644
--- a/aleksis/apps/ticdesk/views.py
+++ b/aleksis/apps/ticdesk/views.py
@@ -11,9 +11,10 @@ from django.utils.translation import ugettext as _
 
 import pytz
 import reversion
+from reversion.views import create_revision
 from django_tables2 import RequestConfig
 from rules.contrib.views import permission_required
-from templated_email import send_templated_email
+from templated_email import send_templated_mail
 
 from aleksis.core.models import Activity, Person
 from aleksis.core.util import messages
@@ -39,9 +40,8 @@ from .forms import (
 from .models import (
     EventRegistration,
     FeedbackAspect,
-    RegistrationField,
     TeckidsMember,
-    event,
+    TeckidsEvent,
     Voucher,
 )
 from .tables import (
@@ -61,7 +61,7 @@ def events(request):
 
     # Get all upcoming events
     now = timezone.datetime.today()
-    events = event.objects.filter(date_event__gte=now, published=True)
+    events = TeckidsEvent.objects.filter(date_event__gte=now, published=True)
 
     # Build table
     events_table = EventsTable(events)
@@ -71,7 +71,7 @@ def events(request):
     if request.user.is_authenticated:
         # Get all events the person participated in.
         current_person = Person.objects.get(user__username=request.user.username)
-        participated_events = event.objects.filter(members=current_person)
+        participated_events = TeckidsEvent.objects.filter(members=current_person)
 
         # Build table
         participated_events_table = ParticipatedEventsTable(participated_events)
@@ -80,13 +80,13 @@ def events(request):
 
     return render(request, "ticdesk/teckids_event/list.html", context)
 
-@reversion.register()
-@person_required
+@create_revision
+@login_required
 def register_event(request, id_):
     context = {}
 
     # Get current person and event
-    event = event.objects.get(id=id_)
+    event = TeckidsEvent.objects.get(id=id_)
     context["event"] = event
 
     initial = {
@@ -173,10 +173,10 @@ def register_event(request, id_):
             ):
                 guardian = Person.objects.get_or_create(
                     defaults={
-                        first_name=register_form.cleaned_data["guardian_first_name"],
-                        last_name=register_form.cleaned_data["guardian_last_name"],
-                        mobile_number=register_form.cleaned_data["guardian_mobile_number"],
-                    }
+                        "first_name": register_form.cleaned_data["guardian_first_name"],
+                        "last_name": register_form.cleaned_data["guardian_last_name"],
+                        "mobile_number": register_form.cleaned_data["guardian_mobile_number"],
+                    },
                     email=register_form.cleaned_data["guardian_email"],
                 )
 
@@ -242,7 +242,7 @@ def feedback_event(request, id_):
 
     # Get current person and event
     current_person = Person.objects.get(user__username=request.user.username)
-    event = event.objects.get(id=id_)
+    event = TeckidsEvent.objects.get(id=id_)
     context["event"] = event
 
     # Prepare the form
@@ -311,13 +311,13 @@ def feedback_event(request, id_):
 
 
 @permission_required(
-    "ticdesk.edit_event", fn=objectgetter_optional(event, None, False)
+    "ticdesk.edit_event", fn=objectgetter_optional(TeckidsEvent, None, False)
 )
 def edit_event(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
     """View to edit or create an event."""
     context = {}
 
-    event = objectgetter_optional(event, None, False)(request, id_)
+    event = objectgetter_optional(TeckidsEvent, None, False)(request, id_)
     context["event"] = event
 
     if id_:
@@ -358,7 +358,7 @@ def manage_events(request):
 
     # Get all upcoming events
     now = timezone.datetime.today()
-    events = event.objects.filter(date_event__gte=now)
+    events = TeckidsEvent.objects.filter(date_event__gte=now)
 
     # Build table
     manage_events_table = ManageEventsTable(events)