diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py
index 208cbff93f76b7d44451550b73d3b5659ba4aa59..e1c0be7ef4f28e609c93f3b58208aa0ea4d58b3a 100644
--- a/aleksis/core/forms.py
+++ b/aleksis/core/forms.py
@@ -80,10 +80,7 @@ class EditPersonForm(ExtensibleForm):
         Fieldset(_("Address"), Row("street", "housenumber"), Row("postal_code", "place")),
         Fieldset(_("Contact data"), "email", Row("phone_number", "mobile_number")),
         Fieldset(
-            _("Advanced personal data"),
-            Row("sex", "date_of_birth"),
-            Row("photo", "photo_cropping"),
-            "guardians",
+            _("Advanced personal data"), Row("sex", "date_of_birth"), Row("photo"), "guardians",
         ),
     )
 
@@ -106,11 +103,12 @@ class EditPersonForm(ExtensibleForm):
             "date_of_birth",
             "sex",
             "photo",
-            "photo_cropping",
             "guardians",
             "primary_group",
         ]
-        widgets = {"user": Select2Widget}
+        widgets = {
+            "user": Select2Widget,
+        }
 
     new_user = forms.CharField(
         required=False, label=_("New user"), help_text=_("Create a new account")
diff --git a/aleksis/core/migrations/0003_drop_image_cropping.py b/aleksis/core/migrations/0003_drop_image_cropping.py
new file mode 100644
index 0000000000000000000000000000000000000000..1fecda4aeed0c9c0c0075bc8972f648a8ec981a0
--- /dev/null
+++ b/aleksis/core/migrations/0003_drop_image_cropping.py
@@ -0,0 +1,22 @@
+# Generated by Django 3.0.7 on 2020-06-28 11:37
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0002_school_term'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='person',
+            name='photo_cropping',
+        ),
+        migrations.AlterField(
+            model_name='person',
+            name='photo',
+            field=models.ImageField(blank=True, null=True, upload_to='', verbose_name='Photo'),
+        ),
+    ]
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index fa24519076a2cb1951aabe01e973d9f1380c1588..e4fd8b5514223c5b4a6542f1664e2ad320f382f0 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -20,7 +20,6 @@ from django.utils.translation import gettext_lazy as _
 
 import jsonstore
 from dynamic_preferences.models import PerInstancePreferenceModel
-from image_cropping import ImageCropField, ImageRatioField
 from phonenumber_field.modelfields import PhoneNumberField
 from polymorphic.models import PolymorphicModel
 
@@ -149,8 +148,7 @@ class Person(ExtensibleModel):
     date_of_birth = models.DateField(verbose_name=_("Date of birth"), blank=True, null=True)
     sex = models.CharField(verbose_name=_("Sex"), max_length=1, choices=SEX_CHOICES, blank=True)
 
-    photo = ImageCropField(verbose_name=_("Photo"), blank=True, null=True)
-    photo_cropping = ImageRatioField("photo", "600x800", size_warning=True)
+    photo = models.ImageField(verbose_name=_("Photo"), blank=True, null=True)
 
     guardians = models.ManyToManyField(
         "self",
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index ad5d7077eba8bccb0981f70b2ea7fffce7c9474c..e6de512b3be12e211fbc7f91453848f326e17da3 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -70,7 +70,6 @@ INSTALLED_APPS = [
     "django_yarnpkg",
     "django_tables2",
     "easy_thumbnails",
-    "image_cropping",
     "maintenance_mode",
     "menu_generator",
     "reversion",
@@ -157,12 +156,7 @@ TEMPLATES = [
     },
 ]
 
-THUMBNAIL_PROCESSORS = (
-    "image_cropping.thumbnail_processors.crop_corners",
-) + thumbnail_settings.THUMBNAIL_PROCESSORS
-
-# Already included by base template / Bootstrap
-IMAGE_CROPPING_JQUERY_URL = None
+THUMBNAIL_PROCESSORS = () + thumbnail_settings.THUMBNAIL_PROCESSORS
 
 WSGI_APPLICATION = "aleksis.core.wsgi.application"
 
diff --git a/aleksis/core/templates/core/person/edit.html b/aleksis/core/templates/core/person/edit.html
index 8f854610e3424b9da47f142cef41b71c9e0fb097..261249f6867a4370745f66d3bd0abc05891442cf 100644
--- a/aleksis/core/templates/core/person/edit.html
+++ b/aleksis/core/templates/core/person/edit.html
@@ -4,6 +4,9 @@
 
 {% load material_form i18n %}
 
+{% block extra_head %}
+  {{ edit_person_form.media }}
+{% endblock %}
 
 {% block browser_title %}{% blocktrans %}Edit person{% endblocktrans %}{% endblock %}
 {% block page_title %}{% blocktrans %}Edit person{% endblocktrans %}{% endblock %}
diff --git a/aleksis/core/templates/core/person/full.html b/aleksis/core/templates/core/person/full.html
index 73d2a4cf663999b2648e497e25559e83df69bb24..01dccc43e3b580eeef858dfe0d4602bae97b793e 100644
--- a/aleksis/core/templates/core/person/full.html
+++ b/aleksis/core/templates/core/person/full.html
@@ -2,7 +2,7 @@
 
 {% extends "core/base.html" %}
 
-{% load i18n static cropping rules %}
+{% load i18n static rules %}
 {% load render_table from django_tables2 %}
 
 {% block browser_title %}{{ person.first_name }} {{ person.last_name }}{% endblock %}
@@ -44,7 +44,7 @@
     <div class="col s12 m4">
       {% has_perm 'core.view_photo' user person as can_view_photo %}
       {% if person.photo and can_view_photo %}
-        <img class="person-img" src="{% cropped_thumbnail person 'photo_cropping' max_size='300x400' %}"
+        <img class="person-img" src="{{ person.photo.url }}"
              alt="{{ person.first_name }} {{ person.last_name }}"/>
       {% else %}
         <img class="person-img" src="{% static 'img/fallback.png' %}"
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index 391867c9bd3ab54b89cfb58d7bc4120ac5c2d7cb..33db765bb8b709b2725d6679718dc37b56f0a73b 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -285,11 +285,11 @@ def edit_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse
 
     if id_:
         # Edit form for existing group
-        edit_person_form = EditPersonForm(request.POST or None, instance=person)
+        edit_person_form = EditPersonForm(request.POST, request.FILES or None, instance=person)
     else:
         # Empty form to create a new group
         if request.user.has_perm("core.create_person"):
-            edit_person_form = EditPersonForm(request.POST or None)
+            edit_person_form = EditPersonForm(request.POST, request.FILES or None)
         else:
             raise PermissionDenied()
 
@@ -299,9 +299,6 @@ def edit_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse
                 edit_person_form.save(commit=True)
             messages.success(request, _("The person has been saved."))
 
-            # Redirect to self to ensure post-processed data is displayed
-            return redirect("edit_person_by_id", id_=person.id)
-
     context["edit_person_form"] = edit_person_form
 
     return render(request, "core/person/edit.html", context)