diff --git a/src/api/tests/permissions.py b/src/api/tests/permissions.py
index 92fef7d754435b8bacbd57c7be073c0c93eb7e5b..87c9010ebc969fb1c338200eb04669074048f4e0 100644
--- a/src/api/tests/permissions.py
+++ b/src/api/tests/permissions.py
@@ -135,7 +135,7 @@ class ConferencePermissionTestCase(PermissionTestCase):
         self.conference = self.view.conference = Conference.objects.create(slug='conf', name='TestConf', is_public=True)
 
 
-class ConferenceDetectionTestCase(PermissionTestCase):
+class ConferenceDetectionTestCase(ConferencePermissionTestCase):
     def test_get_conference_view(self):
         self.assertEqual(ConferencePermission().get_conference(view=self.view), self.conference)
 
diff --git a/src/backoffice/views/assemblies/assemblies.py b/src/backoffice/views/assemblies/assemblies.py
index 9bffb30f54cbe3cea190b8086b8c34f945e759e1..06bbe853723f05ace7d2f6c7e6bebb492cd8b090 100644
--- a/src/backoffice/views/assemblies/assemblies.py
+++ b/src/backoffice/views/assemblies/assemblies.py
@@ -402,7 +402,7 @@ class AssemblyLinksUpdateView(AssemblyMixin, View):
                 if link_created:
                     messages.success(request, gettext('assemblyedit_addedlink').format(linked_name=linkee.name))
                     logger.info(
-                        'Assembly "%(assembly_name)s" (%(assembly_pk)s): added link to "%(linkee)s" (%(linkee_pk)s), requested by {%(user)s.'
+                        'Assembly "%(assembly_name)s" (%(assembly_pk)s): added link to "%(linkee)s" (%(linkee_pk)s), requested by {%(user)s}.'
                         'Not from this assembly',
                         {'assembly_name': assembly.name, 'assembly_pk': assembly.pk, 'linkee': linkee, 'linkee_pk': linkee.pk, 'user': request.user.username},
                     )
diff --git a/src/core/integrations/workadventure.py b/src/core/integrations/workadventure.py
index 094bed765356d0f6fae4d68f81e1cc5d9ea671c9..461339ba1cb49c33ffc3e49b3b3913ec1920be6b 100644
--- a/src/core/integrations/workadventure.py
+++ b/src/core/integrations/workadventure.py
@@ -264,6 +264,7 @@ class WorkAdventureIntegration:
         linter_errors = None
         linter_missingassets = None
         linter_missingentrypoints = None
+        linter_exitgraph = None
         publish_timestamp = None
         publish_commit = None
         has_mapinfo = False
diff --git a/src/core/management/commands/sanitize_database.py b/src/core/management/commands/sanitize_database.py
index 0b56489e4ad3ec4ccf8b78426d1ab96aab279d57..c9b268407ff695a13739b9ab62fd0229d5e35c5f 100644
--- a/src/core/management/commands/sanitize_database.py
+++ b/src/core/management/commands/sanitize_database.py
@@ -4,7 +4,8 @@ from django.conf import settings
 from django.core.management.base import BaseCommand
 from django.db.models import Max
 
-from core.models.assemblies import Assembly, AssemblyLogEntry, AssemblyMember
+from core.models.activitylog import ActivityLogEntry
+from core.models.assemblies import Assembly, AssemblyMember
 from core.models.badges import UserBadge
 from core.models.conference import (
     ConferenceMember,
@@ -60,8 +61,8 @@ class Command(BaseCommand):
         print('Assembly(technical_user:=None): ', end='', flush=True)
         print(Assembly.objects.exclude(technical_user=None).update(technical_user=None))
 
-        print('AssemblyLogEntry: ', end='', flush=True)
-        print_delete_stat(AssemblyLogEntry.objects.all().delete())
+        print('ActivityLogEntry: ', end='', flush=True)
+        print_delete_stat(ActivityLogEntry.objects.all().delete())
 
         print('ConferenceMembers: ', end='', flush=True)
         print_delete_stat(ConferenceMember.objects.all().delete())
diff --git a/src/core/models/badges.py b/src/core/models/badges.py
index fcee09d49089064bf53110fd6062524835558607..cbaedb7fcb91eadcb783c1de1f444cdf3371b3c5 100644
--- a/src/core/models/badges.py
+++ b/src/core/models/badges.py
@@ -185,10 +185,9 @@ class Badge(models.Model):
         return self.state == self.State.PUBLIC
 
     def save(self, update_fields=None, *args, **kwargs):
-        if self.conference_id is None and self.issuing_assembly_id is not None:
-            self.conference_id = self.issuing_assembly.conference_id
-
-        elif self.conference_id != self.issuing_assembly.conference_id:
+        if not hasattr(self, 'conference') and hasattr(self, 'issuing_assembly'):
+            self.conference = self.issuing_assembly.conference
+        elif hasattr(self, 'conference') and self.conference != self.issuing_assembly.conference:
             raise ValidationError(_('Badge__issuing_assembly__wrong_conference'))
         if update_fields is None or 'description' in update_fields:
             render_results = compile_translated_markdown_fields(self, self.conference, 'description')
diff --git a/src/core/models/messages.py b/src/core/models/messages.py
index edcb87f3e5aa5710bcf96db1c2a42a334ae71da7..28e424ce9bac8c3be832245d62b3b2f2ed72875c 100644
--- a/src/core/models/messages.py
+++ b/src/core/models/messages.py
@@ -87,7 +87,7 @@ class DirectMessage(models.Model):
         ctx = {
             'conference': self.conference,
             'subject': self.subject,
-            'message': self.message,
+            'message': self.body,
             'timestamp': self.timestamp,
             'sender': str(self.sender) if self.sender is not None else None,
             'recipient': str(self.recipient) if self.recipient is not None else None,
@@ -96,7 +96,7 @@ class DirectMessage(models.Model):
         body_text = render_to_string('core/directmessage.txt', ctx)
 
         if settings.SUPPORT_HTML_MAILS:
-            ctx['message_html'] = render_markdown(self.body)
+            ctx['message_html'] = render_markdown(self.conference, self.body)
             body_html = render_to_string('core/directmessage.html', ctx)
         else:
             body_html = None
diff --git a/src/core/models/pages.py b/src/core/models/pages.py
index e4c37ddf12c59f6768b9f240db18c2f9c9c56354..257ca1333fcafc5d67617ae4ff9a17e657390425 100644
--- a/src/core/models/pages.py
+++ b/src/core/models/pages.py
@@ -326,7 +326,7 @@ class StaticPage(models.Model):
     def newest_revision(self):
         try:
             return self.revisions.order_by('-revision').first()
-        except models.DoesNotExist:
+        except StaticPageRevision.DoesNotExist:
             return None
 
     def clean(self, *args, **kwargs):
diff --git a/src/core/tests/exportcache.py b/src/core/tests/exportcache.py
index 72e57d7e46465b636be9dc6a0995b81b8985be14..a62ffc4c80d1f54d0caeb04b89469faf69061009 100644
--- a/src/core/tests/exportcache.py
+++ b/src/core/tests/exportcache.py
@@ -1,7 +1,6 @@
-from datetime import datetime, timedelta
+from datetime import UTC, datetime, timedelta
 
 from django.test import TestCase, override_settings
-from django.utils import timezone
 from django.utils.timezone import now
 
 from core.models.assemblies import Assembly
@@ -13,8 +12,8 @@ class ScheduleTests(TestCase):
         self.conference = Conference(
             slug='foo',
             name='Foo Conference',
-            start=datetime(2021, 12, 1, 9, 0, 0, tzinfo=timezone.utc),
-            end=datetime(2021, 12, 31, 15, 00, 00, tzinfo=timezone.utc),
+            start=datetime(2021, 12, 1, 9, 0, 0, tzinfo=UTC),
+            end=datetime(2021, 12, 31, 15, 00, 00, tzinfo=UTC),
         )
         self.conference.save()
 
diff --git a/src/plainui/tests/test_views.py b/src/plainui/tests/test_views.py
index a7ca15956bbcf25f442c22e407313fc1cd7735bc..e9002f0c704db719229956d1659aa6d71ed7b151 100644
--- a/src/plainui/tests/test_views.py
+++ b/src/plainui/tests/test_views.py
@@ -131,8 +131,8 @@ class ViewsTestBase(TestCase):
 
         This is the test pendant to `plainui.views.ConferenceRequiredMixin`.
         """
+        old_cookies = self.client.cookies
         try:
-            old_cookies = self.client.cookies
             self.client.cookies = SimpleCookie()
             ConferenceRequiredMixin._test_cork = True
             _request = self.client.post if post else self.client.get
@@ -192,8 +192,8 @@ class ViewsTestBase(TestCase):
             ConferenceRequiredMixin._conf = None
 
     def assertNeedsNoLogin(self, url, data=None, post=False):
+        old_cookies = self.client.cookies
         try:
-            old_cookies = self.client.cookies
             self.client.cookies = SimpleCookie()
             ConferenceRequiredMixin._test_cork = True
             _request = self.client.post if post else self.client.get
diff --git a/src/plainui/utils.py b/src/plainui/utils.py
index 5228e53df0414c2f50f68a0f9fba11e7262f3cda..08c243bd7634f39bf271c97af306ff950dadb61a 100644
--- a/src/plainui/utils.py
+++ b/src/plainui/utils.py
@@ -62,6 +62,7 @@ def check_message_content(conf, request, text, kind, kind_data):
 
         report_form = ReportForm(
             conf=conf,
+            request=request,
             data={
                 'kind': kind,
                 'kind_data': str(kind_data),