diff --git a/biscuit/core/forms.py b/biscuit/core/forms.py
index d3f327c8d8b0710e0f3c4a446dd7171b394b6011..e0af144a35065539b9cac0cc512ae8a6cf940b65 100644
--- a/biscuit/core/forms.py
+++ b/biscuit/core/forms.py
@@ -3,6 +3,7 @@ from django.contrib.auth import get_user_model
 from django.utils.translation import ugettext_lazy as _
 
 from .models import Person
+from .utils import
 
 
 class PersonAccountForm(forms.ModelForm):
@@ -36,3 +37,29 @@ class PersonAccountForm(forms.ModelForm):
 
 PersonsAccountsFormSet = forms.modelformset_factory(
     Person, form=PersonAccountForm, max_num=0, extra=0)
+
+class EditPersonForm(forms.ModelForm)
+    class Meta:
+        model = Person
+        fields = ['user', 'is_active', 'first_name', 'last_name', 'additional_name', 'short_name', 'street', 'housenumber', 'postal_code', 'place', 'phone_number', 'mobile_number', 'email', 'date_of_birth', 'sex', 'photo']
+
+    new_user = forms.CharField(
+        required=False,
+        label=_('New user'),
+        help_text=_('Create a new account'),
+
+    def clean(self) -> None:
+        User = get_user_model()
+
+        if self.cleaned_data.get('new_user', None):
+            if self.cleaned_data.get('user', None):
+                self.add_error('new_user', _('You cannot set a new username when also selecting an existing user.'))
+            elif User.objects.filter(username=self.cleaned_data['new_user']).exists():
+                self.add_error('new_user', _('This username is already in use.'))
+            else:
+                new_user_obj = User.objects.create_user(self.cleaned_data['new_user'],
+                                                        self.instance.email,
+                                                        first_name=self.instance.first_name,
+                                                         last_name=self.instance.last_name)
+
+                self.cleaned_data['user'] = new_user_obj
diff --git a/biscuit/core/locale/de_DE/LC_MESSAGES/django.po b/biscuit/core/locale/de_DE/LC_MESSAGES/django.po
index f2dcb63c21c43f3426bd7f0456207fe7ec2d7bf9..621ff7240af21a392292a6c95d752b155661d15a 100644
--- a/biscuit/core/locale/de_DE/LC_MESSAGES/django.po
+++ b/biscuit/core/locale/de_DE/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: BiscuIT - School Information System (SIS)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-08-26 00:46+0200\n"
-"PO-Revision-Date: 2019-08-26 00:56+0200\n"
+"POT-Creation-Date: 2019-08-26 19:58+0200\n"
+"PO-Revision-Date: 2019-08-26 19:59+0200\n"
 "Last-Translator: Tom Teichler <tom.teichler@teckids.org>\n"
 "Language-Team: \n"
 "Language: de\n"
@@ -22,16 +22,24 @@ msgstr ""
 msgid "BiscuIT - The Free School Information System"
 msgstr "BiscuIT - Das freie Schulinformationssystem"
 
-#: forms.py:25
+#: forms.py:25 forms.py:55
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 "Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen "
 "existierenden Benutzer auswählen."
 
-#: forms.py:27
+#: forms.py:27 forms.py:57
 msgid "This username is already in use."
 msgstr "Dieser Benutzername wird bereits genutzt."
 
+#: forms.py:47
+msgid "New user"
+msgstr "Neuer Benutzer"
+
+#: forms.py:48
+msgid "Create a new account"
+msgstr "Neues Benutzerkonto erstellen"
+
 #: menus.py:6
 msgid "Login"
 msgstr "Anmelden"
@@ -293,3 +301,7 @@ msgstr "Interner Serverfehler"
 #: views.py:32
 msgid "An unexpected error has occurred."
 msgstr "Ein Fehler ist aufgetreten."
+
+#: views.py:157
+msgid "The person has been saved."
+msgstr "Die Person wurde gespeichert."
diff --git a/biscuit/core/templates/core/person_full.html b/biscuit/core/templates/core/person_full.html
index 75a283798d20a558811ab77ab3dec15548d45bc1..2c34c774faccefedd0bc1b635d887b78a55f83bc 100644
--- a/biscuit/core/templates/core/person_full.html
+++ b/biscuit/core/templates/core/person_full.html
@@ -7,7 +7,7 @@
  {% if person %}
   <h2>{{ person.first_name }} {{ person.last_name }}</h2>
   <p>
-   <a href="{{ '#' }}">
+   <a href="{% url 'edit_person_by_id' person.id %}">
     {% blocktrans %}Edit person{% endblocktrans %}
    </a>
   </p>
diff --git a/biscuit/core/urls.py b/biscuit/core/urls.py
index d3415193064e86b361bbef2d4b99314f509b73af..93b96080c2f4ab87351da1e3e25201da650287fb 100644
--- a/biscuit/core/urls.py
+++ b/biscuit/core/urls.py
@@ -11,11 +11,12 @@ urlpatterns = [
     path('accounts/', include('django.contrib.auth.urls')),
     path('persons', views.persons, name='persons'),
     path('persons/accounts', views.persons_accounts, name='persons_accounts'),
-    path('person', views.person, name='person'),
+    pat('person', views.person, name='person'),
     path('person/<int:id_>', views.person,
          {'template': 'full'}, name='person_by_id'),
     path('person/<int:id_>/card', views.person,
          {'template': 'card'}, name='person_by_id_card'),
+    path('person/<int:id_>/edit', views.edit_person, name='edit_person_by_id'),
     path('groups', views.groups, name='groups'),
     path('group/<int:id_>', views.group,
          {'template': 'full'}, name='group_by_id'),
diff --git a/biscuit/core/views.py b/biscuit/core/views.py
index bce4001ee2df5c87901feb037a31f0def3abc44e..398ad6f8c2dc32dbbdb58791f1ef6421b723d99b 100644
--- a/biscuit/core/views.py
+++ b/biscuit/core/views.py
@@ -8,7 +8,7 @@ from django_tables2 import RequestConfig
 from django.utils.translation import ugettext_lazy as _
 
 from .decorators import admin_required
-from .forms import PersonsAccountsFormSet
+from .forms import PersonsAccountsFormSet, EditPersonForm
 from .models import Person, Group
 from .tables import PersonsTable, GroupsTable
 
@@ -139,3 +139,24 @@ def persons_accounts(request: HttpRequest) -> HttpResponse:
     context['persons_accounts_formset'] = persons_accounts_formset
 
     return render(request, 'core/persons_accounts.html', context)
+
+@admin_required
+def edit_person(request: HttpRequest, id_: int) -> HttpResponse:
+    context = {}
+
+    person = get_object_or_404(Person, id=id_)
+
+    edit_person_form = EditPersonForm(request.POST or None, request.FILES or None, instance=person)
+
+    context['person'] = person
+
+    if request.method == 'POST':
+        if edit_person_form.is_valid():
+            edit_person_form.save(commit=True)
+
+            messages.success(request, _('The person has been saved.'))
+            return render(request, 'core/person_full.html', context)
+
+    context['edit_person_form'] = edit_person_form
+
+    return render(request, 'core/edit_person.html', context)