diff --git a/green_deal/migrations/0002_auto_20201208_1435.py b/green_deal/migrations/0002_auto_20201208_1435.py
index 13640517af8d9b6b44431d8ad9af7e6a4aab6d3a..f1cebf6cc8d77ddf0e21dd517bab15b120ece52a 100644
--- a/green_deal/migrations/0002_auto_20201208_1435.py
+++ b/green_deal/migrations/0002_auto_20201208_1435.py
@@ -6,7 +6,7 @@ import wagtail.blocks
 import wagtail.fields
 import wagtail.images.blocks
 from django.db import migrations, models
-from django.utils.timezone import utc
+from datetime import timezone
 
 
 class Migration(migrations.Migration):
@@ -218,7 +218,7 @@ class Migration(migrations.Migration):
                                                 35,
                                                 3,
                                                 209883,
-                                                tzinfo=utc,
+                                                tzinfo=timezone.utc,
                                             )
                                         ),
                                     ),
@@ -394,7 +394,7 @@ class Migration(migrations.Migration):
                                                 35,
                                                 3,
                                                 209883,
-                                                tzinfo=utc,
+                                                tzinfo=timezone.utc,
                                             )
                                         ),
                                     ),
diff --git a/green_deal/migrations/0003_auto_20210107_1120.py b/green_deal/migrations/0003_auto_20210107_1120.py
index 1c09520d41d10f32fa38e0a1953dbd03a9298035..836a3437a6c7596fe0b11c0cca435033d88bddcf 100644
--- a/green_deal/migrations/0003_auto_20210107_1120.py
+++ b/green_deal/migrations/0003_auto_20210107_1120.py
@@ -6,7 +6,7 @@ import wagtail.blocks
 import wagtail.fields
 import wagtail.images.blocks
 from django.db import migrations
-from django.utils.timezone import utc
+from datetime import timezone
 
 
 class Migration(migrations.Migration):
@@ -185,7 +185,7 @@ class Migration(migrations.Migration):
                                                 20,
                                                 56,
                                                 694472,
-                                                tzinfo=utc,
+                                                tzinfo=timezone.utc,
                                             )
                                         ),
                                     ),
@@ -361,7 +361,7 @@ class Migration(migrations.Migration):
                                                 20,
                                                 56,
                                                 694472,
-                                                tzinfo=utc,
+                                                tzinfo=timezone.utc,
                                             )
                                         ),
                                     ),
diff --git a/green_deal/migrations/0004_auto_20210110_2351.py b/green_deal/migrations/0004_auto_20210110_2351.py
index 8bd93ad365d4419eedfbdaa7e5cba790bdad4181..c8e89a65307575fcea5b875445e8514be26287d3 100644
--- a/green_deal/migrations/0004_auto_20210110_2351.py
+++ b/green_deal/migrations/0004_auto_20210110_2351.py
@@ -6,7 +6,7 @@ import wagtail.blocks
 import wagtail.fields
 import wagtail.images.blocks
 from django.db import migrations
-from django.utils.timezone import utc
+from datetime import timezone
 
 
 class Migration(migrations.Migration):
@@ -177,7 +177,7 @@ class Migration(migrations.Migration):
                                                 51,
                                                 27,
                                                 691203,
-                                                tzinfo=utc,
+                                                tzinfo=timezone.utc,
                                             )
                                         ),
                                     ),
@@ -353,7 +353,7 @@ class Migration(migrations.Migration):
                                                 51,
                                                 27,
                                                 691203,
-                                                tzinfo=utc,
+                                                tzinfo=timezone.utc,
                                             )
                                         ),
                                     ),
diff --git a/majak/settings/base.py b/majak/settings/base.py
index b695cfde72eda286a876b08c9d6733c8453a8e23..27cd5ca788daa90b1a27374fb80c5deaba0e35c6 100644
--- a/majak/settings/base.py
+++ b/majak/settings/base.py
@@ -58,7 +58,7 @@ INSTALLED_APPS = [
     "captcha",
     "wagtail.contrib.forms",
     "wagtail.contrib.redirects",
-    "wagtail.contrib.modeladmin",
+    # "wagtail.contrib.modeladmin",  TODO: Upgrade
     "wagtail.contrib.table_block",
     "wagtail.contrib.routable_page",
     "wagtail.embeds",
diff --git a/requirements/base.in b/requirements/base.in
index 66fca59cee8725cc5eeb90fe346366315d89d68a..85886ce2f1731590c87b127eea125a54ce30aa20 100644
--- a/requirements/base.in
+++ b/requirements/base.in
@@ -1,16 +1,16 @@
-wagtail<5.0  # For now
+wagtail
 wagtail-metadata
 wagtail-trash
-django<4.2  # Wagtail compatibility
-django-environ<0.10.0
+django
+django-environ
 django-extensions
 django-redis
 django-settings-export
 django-widget-tweaks
 django-simple-captcha
 psycopg2-binary
-pirates<=0.7
-whitenoise==5.3.0
+pirates
+whitenoise
 opencv-python
 requests
 ics
@@ -28,7 +28,7 @@ fastjsonschema
 tweepy
 requests-cache
 wand
-httplib2<0.21.0,>=0.20.4
-icalendar==4.0.9
-pytz<2022.0,>=2021.3
+httplib2
+icalendar
+pytz
 nh3
diff --git a/requirements/base.txt b/requirements/base.txt
index 6588abe8f5e1776824cf1eafa9fdd6b3a7a149d1..ad577c1eb6ac60a8921c00d0ab5e231fb5be216c 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -23,7 +23,7 @@ attrs==23.2.0
     #   cattrs
     #   ics
     #   requests-cache
-beautifulsoup4==4.11.2
+beautifulsoup4==4.12.3
     # via
     #   -r base.in
     #   wagtail
@@ -68,7 +68,9 @@ cssselect2==0.7.0
     # via weasyprint
 decorator==5.1.1
     # via ipython
-django==4.1.13
+defusedxml==0.7.1
+    # via willow
+django==5.0.4
     # via
     #   -r base.in
     #   django-extensions
@@ -82,15 +84,16 @@ django==4.1.13
     #   django-taggit
     #   django-treebeard
     #   djangorestframework
+    #   laces
     #   mozilla-django-oidc
     #   wagtail
-django-environ==0.9.0
+django-environ==0.11.2
     # via -r base.in
 django-extensions==3.2.3
     # via -r base.in
-django-filter==22.1
+django-filter==24.2
     # via wagtail
-django-modelcluster==6.0
+django-modelcluster==6.3
     # via wagtail
 django-permissionedforms==0.1
     # via wagtail
@@ -100,9 +103,9 @@ django-redis==5.4.0
     # via -r base.in
 django-settings-export==1.2.1
     # via -r base.in
-django-simple-captcha==0.5.20
+django-simple-captcha==0.6.0
     # via -r base.in
-django-taggit==3.1.0
+django-taggit==5.0.1
     # via wagtail
 django-treebeard==4.7.1
     # via wagtail
@@ -110,7 +113,7 @@ django-widget-tweaks==1.5.0
     # via -r base.in
 djangorestframework==3.15.1
     # via wagtail
-draftjs-exporter==2.1.7
+draftjs-exporter==5.0.0
     # via wagtail
 et-xmlfile==1.1.0
     # via openpyxl
@@ -118,21 +121,21 @@ executing==2.0.1
     # via stack-data
 fastjsonschema==2.19.1
     # via -r base.in
+filetype==1.2.0
+    # via willow
 fonttools[woff]==4.51.0
     # via weasyprint
 html5lib==1.1
-    # via
-    #   wagtail
-    #   weasyprint
-httplib2==0.20.4
+    # via weasyprint
+httplib2==0.22.0
     # via -r base.in
-icalendar==4.0.9
+icalendar==5.0.12
     # via -r base.in
 ics==0.7.2
     # via -r base.in
 idna==3.7
     # via requests
-ipython==8.23.0
+ipython==8.24.0
     # via -r base.in
 jedi==0.19.1
     # via ipython
@@ -142,6 +145,8 @@ kombu==5.3.7
     # via celery
 l18n==2021.3
     # via wagtail
+laces==0.1.1
+    # via wagtail
 markdown==3.6
     # via -r base.in
 matplotlib-inline==0.1.7
@@ -164,14 +169,17 @@ parso==0.8.4
     # via jedi
 pexpect==4.9.0
     # via ipython
-pillow==9.5.0
+pillow==10.3.0
     # via
     #   django-simple-captcha
+    #   pillow-heif
     #   wagtail
     #   weasyprint
+pillow-heif==0.16.0
+    # via willow
 pirates==0.7.0
     # via -r base.in
-platformdirs==4.2.0
+platformdirs==4.2.1
     # via requests-cache
 prompt-toolkit==3.0.43
     # via
@@ -185,7 +193,7 @@ pure-eval==0.2.2
     # via stack-data
 pycparser==2.22
     # via cffi
-pydyf==0.9.0
+pydyf==0.10.0
     # via weasyprint
 pygments==2.17.2
     # via ipython
@@ -195,7 +203,7 @@ pyparsing==3.1.2
     # via httplib2
 pypdf2==3.0.1
     # via -r base.in
-pyphen==0.14.0
+pyphen==0.15.0
     # via weasyprint
 python-dateutil==2.9.0.post0
     # via
@@ -203,7 +211,7 @@ python-dateutil==2.9.0.post0
     #   celery
     #   icalendar
     #   ics
-pytz==2021.3
+pytz==2024.1
     # via
     #   -r base.in
     #   django-modelcluster
@@ -211,7 +219,7 @@ pytz==2021.3
     #   l18n
 pyyaml==6.0.1
     # via -r base.in
-redis==5.0.3
+redis==5.0.4
     # via django-redis
 requests==2.31.0
     # via
@@ -225,7 +233,7 @@ requests-cache==1.2.0
     # via -r base.in
 requests-oauthlib==1.3.1
     # via tweepy
-sentry-sdk==1.45.0
+sentry-sdk==2.0.1
     # via -r base.in
 six==1.16.0
     # via
@@ -246,11 +254,11 @@ tatsu==5.12.0
     # via ics
 telepath==0.3.1
     # via wagtail
-tinycss2==1.2.1
+tinycss2==1.3.0
     # via
     #   cssselect2
     #   weasyprint
-traitlets==5.14.2
+traitlets==5.14.3
     # via
     #   ipython
     #   matplotlib-inline
@@ -274,20 +282,23 @@ vine==5.1.0
     #   amqp
     #   celery
     #   kombu
-wagtail==4.2.4
+wagtail==6.1
     # via
     #   -r base.in
     #   wagtail-metadata
+    #   wagtail-modeladmin
     #   wagtail-trash
-wagtail-metadata==4.0.3
+wagtail-metadata==5.0.0
     # via -r base.in
-wagtail-trash==2.0.0
+wagtail-modeladmin==2.0.0
+    # via wagtail-trash
+wagtail-trash==3.0.0
     # via -r base.in
 wand==0.6.13
     # via -r base.in
 wcwidth==0.2.13
     # via prompt-toolkit
-weasyprint==61.2
+weasyprint==62.0
     # via -r base.in
 webencodings==0.5.1
     # via
@@ -295,9 +306,9 @@ webencodings==0.5.1
     #   cssselect2
     #   html5lib
     #   tinycss2
-whitenoise==5.3.0
+whitenoise==6.6.0
     # via -r base.in
-willow==1.4.1
+willow[heif]==1.8.0
     # via wagtail
 zopfli==0.2.3
     # via fonttools
diff --git a/requirements/dev.in b/requirements/dev.in
index beaed0bf552a2613ded05d37c0b21f654dcd4594..0cc5912dfdbe9cdc70567d4ac410670a9628a313 100644
--- a/requirements/dev.in
+++ b/requirements/dev.in
@@ -1,4 +1,4 @@
-django<4.2  # wagtail compatibility
+django
 django-debug-toolbar
 pytest
 pytest-sugar
diff --git a/requirements/dev.txt b/requirements/dev.txt
index a527f403b31026de1dbcaf1ad12afdfe8edfecf2..e803e24ae281fe01bcb3270b3ed913ef1f78c158 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -6,9 +6,9 @@
 #
 asgiref==3.8.1
     # via django
-coverage[toml]==7.4.4
+coverage[toml]==7.5.0
     # via pytest-cov
-django==4.1.13
+django==5.0.4
     # via
     #   -r dev.in
     #   django-debug-toolbar
@@ -16,11 +16,11 @@ django-debug-toolbar==4.3.0
     # via -r dev.in
 factory-boy==3.3.0
     # via pytest-factoryboy
-faker==24.11.0
+faker==25.0.0
     # via factory-boy
 fastdiff==0.3.0
     # via snapshottest
-freezegun==1.4.0
+freezegun==1.5.0
     # via pytest-freezegun
 inflection==0.5.1
     # via pytest-factoryboy
@@ -31,9 +31,9 @@ packaging==24.0
     #   pytest
     #   pytest-factoryboy
     #   pytest-sugar
-pluggy==1.4.0
+pluggy==1.5.0
     # via pytest
-pytest==8.1.1
+pytest==8.2.0
     # via
     #   -r dev.in
     #   pytest-cov
diff --git a/senate/models.py b/senate/models.py
index 8b3facef72b25bc08a756080c8ef11f1c9df2aff..ea77e536843618b0ba59bf3b16341860530f7ece 100644
--- a/senate/models.py
+++ b/senate/models.py
@@ -4,7 +4,6 @@ from wagtail import blocks
 from wagtail.admin.panels import CommentPanel, FieldPanel, HelpPanel, MultiFieldPanel
 from wagtail.fields import StreamField
 from wagtail.images.blocks import ImageChooserBlock
-from wagtail.images.edit_handlers import FieldPanel
 from wagtail.models import Page
 from wagtailmetadata.models import MetadataPageMixin
 
diff --git a/shared/forms.py b/shared/forms.py
index 464b10dad6ba62d05557218c286bbb609f398a37..b9e90c8fd88acbdb3705287259401c0a14781354 100644
--- a/shared/forms.py
+++ b/shared/forms.py
@@ -1,6 +1,6 @@
 from django import forms
 from wagtail.admin.forms import WagtailAdminPageForm
-from wagtail.models.collections import Collection
+from wagtail.models.media import Collection
 
 
 class SubscribeForm(forms.Form):
diff --git a/shared/jekyll_import.py b/shared/jekyll_import.py
index d0d999b5f87796ac140530a84d66aaf4fefe9d2b..58451065d958f3be37a862f0038afb1d4e8896b6 100644
--- a/shared/jekyll_import.py
+++ b/shared/jekyll_import.py
@@ -26,7 +26,7 @@ from markdown.inlinepatterns import InlineProcessor
 from wagtail.contrib.redirects.models import Redirect
 from wagtail.images.models import Image
 from wagtail.models import Page
-from wagtail.models.collections import Collection
+from wagtail.models.media import Collection
 from willow.image import UnrecognisedImageFormatError
 from yaml.scanner import ScannerError
 
diff --git a/shared/utils.py b/shared/utils.py
index 989cf258d6449a6d62d5684f90815004727d78ea..c27449f8ded58045eba91bad10bdb65869cebb27 100644
--- a/shared/utils.py
+++ b/shared/utils.py
@@ -10,7 +10,6 @@ from django.core.files import File
 from django.http import HttpResponse
 from django.utils.translation import gettext_lazy
 from wagtail.admin.panels import CommentPanel, FieldPanel, HelpPanel, MultiFieldPanel
-from wagtail.images.edit_handlers import FieldPanel
 from wagtail.images.models import Image
 from wagtail.models import Page