diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py
index 459d4d8bb067f5915a41677ff3f941caa1de154d..4f4414b1b64219d95bfc4669f5f99cef670cc7c8 100644
--- a/aleksis/core/forms.py
+++ b/aleksis/core/forms.py
@@ -56,8 +56,7 @@ class PersonForm(ExtensibleForm):
             _("Advanced personal data"),
             Row("date_of_birth", "place_of_birth"),
             Row("sex"),
-            Row("photo", "photo_rect", "photo_square"),
-            Row("avatar", "avatar_rect", "avatar_square"),
+            Row("photo", "avatar"),
             "guardians",
         ),
     )
@@ -81,11 +80,7 @@ class PersonForm(ExtensibleForm):
             "place_of_birth",
             "sex",
             "photo",
-            "photo_rect",
-            "photo_square",
             "avatar",
-            "avatar_rect",
-            "avatar_square",
             "guardians",
             "primary_group",
         ]
@@ -162,8 +157,7 @@ class EditGroupForm(SchoolTermRelatedExtensibleForm):
         Fieldset(_("Common data"), "name", "short_name", "group_type"),
         Fieldset(_("Persons"), "members", "owners", "parent_groups"),
         Fieldset(_("Additional data"), "additional_fields"),
-        Fieldset(_("Photo"), "photo", "photo_rect", "photo_square"),
-        Fieldset(_("Avatar"), "avatar", "avatar_rect", "avatar_square"),
+        Fieldset(_("Photo"), "photo", "avatar"),
     )
 
     class Meta:
diff --git a/aleksis/core/migrations/0029_photo_avatar_croppable.py b/aleksis/core/migrations/0029_photo_avatar_croppable.py
deleted file mode 100644
index 42deecf9283a2febbaa62689a4074ec14d2ac9d9..0000000000000000000000000000000000000000
--- a/aleksis/core/migrations/0029_photo_avatar_croppable.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# Generated by Django 3.2.9 on 2021-12-09 14:56
-
-from django.db import migrations
-import image_cropping.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0028_update_photo_avatar'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='group',
-            name='avatar_rect',
-            field=image_cropping.fields.ImageRatioField('photo', '800x600', adapt_rotation=False, allow_fullsize=False, free_crop=False, help_text=None, hide_image_field=False, size_warning=False, verbose_name='avatar rect'),
-        ),
-        migrations.AddField(
-            model_name='group',
-            name='avatar_square',
-            field=image_cropping.fields.ImageRatioField('photo', '400x400', adapt_rotation=False, allow_fullsize=False, free_crop=False, help_text=None, hide_image_field=False, size_warning=False, verbose_name='avatar square'),
-        ),
-        migrations.AddField(
-            model_name='group',
-            name='photo_rect',
-            field=image_cropping.fields.ImageRatioField('photo', '800x600', adapt_rotation=False, allow_fullsize=False, free_crop=False, help_text=None, hide_image_field=False, size_warning=False, verbose_name='photo rect'),
-        ),
-        migrations.AddField(
-            model_name='group',
-            name='photo_square',
-            field=image_cropping.fields.ImageRatioField('photo', '400x400', adapt_rotation=False, allow_fullsize=False, free_crop=False, help_text=None, hide_image_field=False, size_warning=False, verbose_name='photo square'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='avatar_rect',
-            field=image_cropping.fields.ImageRatioField('photo', '600x800', adapt_rotation=False, allow_fullsize=False, free_crop=False, help_text=None, hide_image_field=False, size_warning=False, verbose_name='avatar rect'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='avatar_square',
-            field=image_cropping.fields.ImageRatioField('photo', '400x400', adapt_rotation=False, allow_fullsize=False, free_crop=False, help_text=None, hide_image_field=False, size_warning=False, verbose_name='avatar square'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='photo_rect',
-            field=image_cropping.fields.ImageRatioField('photo', '600x800', adapt_rotation=False, allow_fullsize=False, free_crop=False, help_text=None, hide_image_field=False, size_warning=False, verbose_name='photo rect'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='photo_square',
-            field=image_cropping.fields.ImageRatioField('photo', '400x400', adapt_rotation=False, allow_fullsize=False, free_crop=False, help_text=None, hide_image_field=False, size_warning=False, verbose_name='photo square'),
-        ),
-        migrations.AlterField(
-            model_name='group',
-            name='photo',
-            field=image_cropping.fields.ImageCropField(blank=True, help_text='This is an official photo, used for official documents and for internal use cases.', null=True, upload_to='', verbose_name='Photo'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='photo',
-            field=image_cropping.fields.ImageCropField(blank=True, help_text='This is an official photo, used for official documents and for internal use cases.', null=True, upload_to='', verbose_name='Photo'),
-        ),
-    ]
diff --git a/aleksis/core/migrations/0028_update_photo_avatar.py b/aleksis/core/migrations/0032_update_photo_avatar.py
similarity index 96%
rename from aleksis/core/migrations/0028_update_photo_avatar.py
rename to aleksis/core/migrations/0032_update_photo_avatar.py
index 7dd0dba29c41d027e434e07b3f513b96393ab2d8..30f8fcca3677ac5a5b8c12a026e660916a106a5b 100644
--- a/aleksis/core/migrations/0028_update_photo_avatar.py
+++ b/aleksis/core/migrations/0032_update_photo_avatar.py
@@ -6,7 +6,7 @@ from django.db import migrations, models
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('core', '0027_person_place_of_birth'),
+        ('core', '0031_remove_person_is_active'),
     ]
 
     operations = [
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index cac2d9d950e9d968983584ab3dbd0bf59405269b..4d2ec4b39a45f7a924fb753eacb8d3a0e8bba7cd 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -30,7 +30,6 @@ from cache_memoize import cache_memoize
 from django_celery_results.models import TaskResult
 from django_cte import CTEQuerySet, With
 from dynamic_preferences.models import PerInstancePreferenceModel
-from image_cropping import ImageCropField, ImageRatioField
 from invitations import signals
 from invitations.adapters import get_invitations_adapter
 from invitations.base_invitation import AbstractBaseInvitation
@@ -202,7 +201,7 @@ class Person(ExtensibleModel):
     place_of_birth = models.CharField(verbose_name=_("Place of birth"), max_length=255, blank=True)
     sex = models.CharField(verbose_name=_("Sex"), max_length=1, choices=SEX_CHOICES, blank=True)
 
-    photo = ImageCropField(
+    photo = ImageField(
         verbose_name=_("Photo"),
         blank=True,
         null=True,
@@ -210,8 +209,6 @@ class Person(ExtensibleModel):
             "This is an official photo, used for official documents and for internal use cases."
         ),
     )
-    photo_rect = ImageRatioField("photo", "600x800")
-    photo_square = ImageRatioField("photo", "400x400")
 
     avatar = models.ImageField(
         verbose_name=_("Display picture / Avatar"),
@@ -219,8 +216,6 @@ class Person(ExtensibleModel):
         null=True,
         help_text=_("This is a picture or an avatar for public display."),
     )
-    avatar_rect = ImageRatioField("photo", "600x800")
-    avatar_square = ImageRatioField("photo", "400x400")
 
     guardians = models.ManyToManyField(
         "self",
@@ -497,7 +492,7 @@ class Group(SchoolTermRelatedExtensibleModel):
         AdditionalField, verbose_name=_("Additional fields"), blank=True
     )
 
-    photo = ImageCropField(
+    photo = ImageField(
         verbose_name=_("Photo"),
         blank=True,
         null=True,
@@ -505,17 +500,12 @@ class Group(SchoolTermRelatedExtensibleModel):
             "This is an official photo, used for official documents and for internal use cases."
         ),
     )
-    photo_rect = ImageRatioField("photo", "800x600")
-    photo_square = ImageRatioField("photo", "400x400")
-
     avatar = models.ImageField(
         verbose_name=_("Display picture / Avatar"),
         blank=True,
         null=True,
         help_text=_("This is a picture or an avatar for public display."),
     )
-    avatar_rect = ImageRatioField("photo", "800x600")
-    avatar_square = ImageRatioField("photo", "400x400")
 
     def get_absolute_url(self) -> str:
         return reverse("group_by_id", args=[self.id])
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index 8e1207d490b839bbbdc9a7bda328451724779a83..3e1bb53785fe44247a1d2b276299011f1e667942 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -147,8 +147,6 @@ INSTALLED_APPS = [
     "django_filters",
     "oauth2_provider",
     "rest_framework",
-    "easy_thumbnails",
-    "image_cropping",
 ]
 
 merge_app_settings("INSTALLED_APPS", INSTALLED_APPS, True)
@@ -978,12 +976,6 @@ if SENTRY_ENABLED:
         **SENTRY_SETTINGS,
     )
 
-THUMBNAIL_PROCESSORS = (
-    "image_cropping.thumbnail_processors.crop_corners",
-) + thumbnail_settings.THUMBNAIL_PROCESSORS
-
-IMAGE_CROPPING_JQUERY_URL = None
-
 SHELL_PLUS_MODEL_IMPORTS_RESOLVER = "django_extensions.collision_resolvers.AppLabelPrefixCR"
 SHELL_PLUS_APP_PREFIXES = {
     "auth": "auth",
diff --git a/pyproject.toml b/pyproject.toml
index f0cfec6f98e15956eabf2efa6abc60651b16504e..b5c5929b32289fccc65b3ad0f67c57994e06eb2b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -123,8 +123,6 @@ django-titofisto = "^0.2.0"
 haystack-redis = "^0.0.1"
 python-gnupg = "^0.4.7"
 sentry-sdk = {version = "^1.4.3", optional = true}
-django-image-cropping = "^1.6.1"
-easy-thumbnails = "^2.8"
 django-cte = "^1.1.5"
 pycountry = "^20.7.3"