diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index fd63ee124d6d3e563ae496f08fc31c57f4b21312..4dac25bc4b1ab18137fcda671b7e030faf2365c8 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -25,6 +25,8 @@ Fixed
 
 * The system tried to send notifications for done background tasks
   in addition to tasks started in the foreground.
+* Invitations for existing short name did not work.
+* Invitations for persons without pre-defined e-mail address did not behave correctly
 
 Removed
 ~~~~~~~
diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py
index 136c6d38f1bf7b143ecf631077f48b75c2149957..2f469606c95086ce26993129ba5840071465bb6b 100644
--- a/aleksis/core/forms.py
+++ b/aleksis/core/forms.py
@@ -611,6 +611,7 @@ class AccountRegisterForm(SignupForm, ExtensibleForm):
         request = kwargs.pop("request", None)
         super(AccountRegisterForm, self).__init__(*args, **kwargs)
 
+        person = None
         if request.session.get("account_verified_email"):
             email = request.session["account_verified_email"]
 
@@ -619,16 +620,27 @@ class AccountRegisterForm(SignupForm, ExtensibleForm):
             except (Person.DoesNotExist, Person.MultipleObjectsReturned):
                 raise SuspiciousOperation()
 
-            self.fields["email"].disabled = True
-            self.fields["email2"].disabled = True
+        elif request.session.get("invitation_code"):
+            try:
+                invitation = PersonInvitation.objects.get(
+                    key=request.session.get("invitation_code")
+                )
+            except PersonInvitation.DoesNotExist:
+                raise SuspiciousOperation()
 
-            if person:
-                available_fields = [field.name for field in Person._meta.get_fields()]
+            person = invitation.person
+
+        if person:
+            self.instance = person
+            available_fields = [field.name for field in Person._meta.get_fields()]
+            if person.email:
+                self.fields["email"].disabled = True
+                self.fields["email2"].disabled = True
                 self.fields["email2"].initial = person.email
-                for field in self.fields:
-                    if field in available_fields and getattr(person, field):
-                        self.fields[field].disabled = True
-                        self.fields[field].initial = getattr(person, field)
+            for field in self.fields:
+                if field in available_fields and getattr(person, field):
+                    self.fields[field].disabled = True
+                    self.fields[field].initial = getattr(person, field)
 
     def save(self, request):
         adapter = get_adapter(request)
@@ -639,11 +651,14 @@ class AccountRegisterForm(SignupForm, ExtensibleForm):
         for field in Person._meta.get_fields():
             if field.name in self.cleaned_data:
                 data[field.name] = self.cleaned_data[field.name]
-        person_qs = Person.objects.filter(email=data["email"])
-        if not person_qs.exists():
-            if get_site_preferences()["account__auto_create_person"]:
-                Person.objects.create(user=user, **data)
+        if self.instance:
+            person_qs = Person.objects.filter(pk=self.instance.pk)
         else:
+            person_qs = Person.objects.filter(email=data["email"])
+            if not person_qs.exists():
+                if get_site_preferences()["account__auto_create_person"]:
+                    Person.objects.create(user=user, **data)
+        if person_qs.exists():
             person_qs.update(user=user, **data)
         self.custom_signup(request, user)
         setup_user_email(request, user, [])
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index e55a58b9c88e62ba3c9716300e8416e86e6d6eec..6f01d8e53b4ccad0cf9bccbce8fc4bc2b2b65008 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -51,7 +51,7 @@ from haystack.inputs import AutoQuery
 from haystack.query import SearchQuerySet
 from haystack.utils.loading import UnifiedIndex
 from health_check.views import MainView
-from invitations.views import SendInvite, accept_invitation
+from invitations.views import SendInvite
 from oauth2_provider.exceptions import OAuthToolkitError
 from oauth2_provider.models import get_application_model
 from oauth2_provider.views import AuthorizationView
@@ -1104,12 +1104,7 @@ class EnterInvitationCode(FormView):
             and not PersonInvitation.objects.get(key=code).accepted
             and not PersonInvitation.objects.get(key=code).key_expired()
         ):
-            invitation = PersonInvitation.objects.get(key=code)
-            # Mark invitation as accepted and redirect to signup
-            accept_invitation(
-                invitation=invitation, request=self.request, signal_sender=self.request.user
-            )
-            self.request.session["invitation_code_entered"] = True
+            self.request.session["invitation_code"] = code
             return redirect("account_signup")
         return redirect("invitations:accept-invite", code)
 
@@ -1432,7 +1427,7 @@ class AccountRegisterView(SignupView):
         if (
             not request.user.has_perm("core.can_register")
             and not request.session.get("account_verified_email")
-            and not request.session.get("invitation_code_entered")
+            and not request.session.get("invitation_code")
         ):
             raise PermissionDenied()
         return super(AccountRegisterView, self).dispatch(request, *args, **kwargs)