diff --git a/src/.ruff.toml b/src/.ruff.toml
index 1e623c4d3b61818a5b80c2f2fc2f6e98be6b8e68..d274a7fb49d219749a1c0e46c5c03511cb79cbb1 100644
--- a/src/.ruff.toml
+++ b/src/.ruff.toml
@@ -35,7 +35,6 @@ ignore = [
     "SIM102",
     "SIM108",
     "TD002",
-    "TID252",
     "ERA001",
     # Disabled due to format conflicts
     # see https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules
diff --git a/src/api/urls.py b/src/api/urls.py
index 8b618b9743729cffacb04f7193e364b5eb4cd352..82e9218b9d691bd243db1016b76d24640bedd5fa 100644
--- a/src/api/urls.py
+++ b/src/api/urls.py
@@ -4,7 +4,7 @@ from rest_framework.urlpatterns import format_suffix_patterns
 from django.conf import settings
 from django.urls import path
 
-from .views import api_root, assemblies, badges, bbb, conferencemember, conferences, events, maps, messages, metanav, rooms, schedule, users, workadventure
+from api.views import api_root, assemblies, badges, bbb, conferencemember, conferences, events, maps, messages, metanav, rooms, schedule, users, workadventure
 
 app_name = 'api'
 urlpatterns = [
diff --git a/src/api/urls_metrics.py b/src/api/urls_metrics.py
index e4e2ecadac4698ecff39fee05ac85255166390f5..4d54c32a4932f926779b1082b83d63d83f911a84 100644
--- a/src/api/urls_metrics.py
+++ b/src/api/urls_metrics.py
@@ -1,6 +1,6 @@
 from django.urls import path
 
-from .views import metrics
+from api.views import metrics
 
 app_name = 'api'
 
diff --git a/src/api/views/assemblies.py b/src/api/views/assemblies.py
index 98c5ec518cc2b33574ec45cdc7cc8b15bf999c61..d880d10a3a9a360538d7db2de7c84c6eeee6b66f 100644
--- a/src/api/views/assemblies.py
+++ b/src/api/views/assemblies.py
@@ -4,8 +4,8 @@ from core.models.assemblies import Assembly
 from core.models.events import Event
 from core.models.rooms import Room
 
-from ..serializers import AssemblySerializer, EventSerializer, RoomSerializer
-from .mixins import ConferenceSlugAssemblyMixin, ConferenceSlugMixin
+from api.serializers import AssemblySerializer, EventSerializer, RoomSerializer
+from api.views.mixins import ConferenceSlugAssemblyMixin, ConferenceSlugMixin
 
 
 class ConferenceAssemblyList(ConferenceSlugMixin, generics.ListAPIView):
diff --git a/src/api/views/conferencemember.py b/src/api/views/conferencemember.py
index 22eda299ab1cedea653e08b979c5c8c7d810fd26..795ea8136a6b837b0af8a299a3df92f47be6f6d1 100644
--- a/src/api/views/conferencemember.py
+++ b/src/api/views/conferencemember.py
@@ -9,8 +9,8 @@ from django.conf import settings
 from core.models.conference import ConferenceMember
 from core.sso import SSO
 
-from ..permissions import IsConferenceService, IsSuperUser
-from .mixins import ConferenceSlugMixin
+from api.permissions import IsConferenceService, IsSuperUser
+from api.views.mixins import ConferenceSlugMixin
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/api/views/conferences.py b/src/api/views/conferences.py
index 917181cbac6aec92661eebb2115d6e0a09cf527f..35ce795262375dc7ca86c77d5a6356fbaf88704d 100644
--- a/src/api/views/conferences.py
+++ b/src/api/views/conferences.py
@@ -2,8 +2,8 @@ from rest_framework import generics
 
 from core.models.conference import Conference, ConferenceTrack
 
-from ..serializers import ConferenceSerializer, ConferenceTrackSerializer
-from .mixins import ConferenceSlugMixin
+from api.serializers import ConferenceSerializer, ConferenceTrackSerializer
+from api.views.mixins import ConferenceSlugMixin
 
 
 class ConferenceList(generics.ListAPIView):
diff --git a/src/api/views/events.py b/src/api/views/events.py
index dccc9dd8ee1b305a599b6fb831013b0bc75714b9..94596144ef73ea8544aa5da78a9a1f7252a36d13 100644
--- a/src/api/views/events.py
+++ b/src/api/views/events.py
@@ -6,8 +6,8 @@ from django.shortcuts import get_object_or_404
 
 from core.models.events import Event
 
-from ..serializers import EventSerializer
-from .mixins import ConferenceSlugMixin
+from api.serializers import EventSerializer
+from api.views.mixins import ConferenceSlugMixin
 
 
 class EventList(ConferenceSlugMixin, generics.ListAPIView):
diff --git a/src/api/views/maps.py b/src/api/views/maps.py
index 030f68178fedeb857781b1095cad66919d99bfe9..2b2824ff33ba3eb666bd8d76d9fb9bd477ae2a0d 100644
--- a/src/api/views/maps.py
+++ b/src/api/views/maps.py
@@ -10,8 +10,8 @@ from core.models.assemblies import Assembly
 from core.models.conference import ConferenceExportCache
 from core.models.map import MapPOI
 
-from ..permissions import IsConferenceService, IsSuperUser
-from .mixins import ConferenceSlugMixin
+from api.permissions import IsConferenceService, IsSuperUser
+from api.views.mixins import ConferenceSlugMixin
 
 _cts = {}  # cache of CoordTransforms (if needed)
 
diff --git a/src/api/views/messages.py b/src/api/views/messages.py
index 01a3ecf3266d9f84dc9f302736355978944ee579..cecabad365d1706cb7e39c30554665b41a136932 100644
--- a/src/api/views/messages.py
+++ b/src/api/views/messages.py
@@ -4,14 +4,14 @@ from django.db.models import Q
 
 from core.models.messages import DirectMessage
 
-from ..serializers import (
+from api.serializers import (
     DirectMessageSendSerializer,
     DirectMessageSerializerReceived,
     DirectMessageSerializerReceivedShort,
     DirectMessageSerializerSent,
     DirectMessageSerializerSentShort,
 )
-from .mixins import ConferenceSlugMixin
+from api.views.mixins import ConferenceSlugMixin
 
 
 class DirectMessagesReceived(ConferenceSlugMixin, generics.ListAPIView):
diff --git a/src/api/views/rooms.py b/src/api/views/rooms.py
index b55800b3871d1b73c8d5310de18e46195c3d45ae..716e8795e55ec091a9b6322e0da51deab81d6445 100644
--- a/src/api/views/rooms.py
+++ b/src/api/views/rooms.py
@@ -4,8 +4,8 @@ from rest_framework import generics
 
 from core.models.rooms import Room
 
-from ..serializers import RoomSerializer
-from .mixins import ConferenceSlugMixin
+from api.serializers import RoomSerializer
+from api.views.mixins import ConferenceSlugMixin
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/api/views/schedule.py b/src/api/views/schedule.py
index d9c2c433d19ec4fcf9886839942d900244fd8676..b728ff43977d803200de257ab8ea958ee3642aa4 100644
--- a/src/api/views/schedule.py
+++ b/src/api/views/schedule.py
@@ -16,9 +16,9 @@ from core.models.events import Event
 from core.models.rooms import Room
 from core.schedules.base import filter_additional_data, schedule_time_to_timedelta
 
-from ..permissions import IsApiUserOrReadOnly
-from ..schedule import Schedule, ScheduleEncoder
-from .mixins import ConferenceSlugMixin
+from api.permissions import IsApiUserOrReadOnly
+from api.schedule import Schedule, ScheduleEncoder
+from api.views.mixins import ConferenceSlugMixin
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/api/views/users.py b/src/api/views/users.py
index 6f52f687be6869feeb1d68874906b213da9bb363..371269fc96912613a7b18e92e41b891c5a40ac89 100644
--- a/src/api/views/users.py
+++ b/src/api/views/users.py
@@ -14,7 +14,7 @@ from core.choices import UserBadgeVisibility
 from core.models.badges import Badge, UserBadge
 from core.models.users import PlatformUser, UserTimelineEntry
 
-from ..serializers import UserTimelineEntrySerializer
+from api.serializers import UserTimelineEntrySerializer
 
 
 @api_view(['GET'])
diff --git a/src/api/views/workadventure.py b/src/api/views/workadventure.py
index dae2b66c43bfb56eacb36a7b55b5ef30ba9d5e55..4cc556758e114dd6822c9550e632c5115431ddd5 100644
--- a/src/api/views/workadventure.py
+++ b/src/api/views/workadventure.py
@@ -19,8 +19,8 @@ from core.models.badges import BadgeToken
 from core.models.rooms import Room
 from core.models.workadventure import WorkadventureSession
 
-from ..permissions import IsConferenceService, IsSuperUser
-from .mixins import ConferenceSlugMixin
+from api.permissions import IsConferenceService, IsSuperUser
+from api.views.mixins import ConferenceSlugMixin
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/backoffice/views/assemblies.py b/src/backoffice/views/assemblies.py
index bae1782e3d2ec3300503a5cc088ed2bc034c9499..44fc93eceba29b9c60a4b2d5d429c9242a6b9bc6 100644
--- a/src/backoffice/views/assemblies.py
+++ b/src/backoffice/views/assemblies.py
@@ -28,7 +28,7 @@ from core.models.tags import ConferenceTag
 from core.models.users import PlatformUser
 from core.models.voucher import Voucher
 
-from ..forms import (
+from backoffice.forms import (
     AssemblyAddApplicationForm,
     AssemblyAddMemberForm,
     AssemblyCreateForm,
@@ -43,6 +43,7 @@ from ..forms import (
     EditAssemblyRoomHangarForm,
     EditAssemblyRoomWorkAdventureForm,
 )
+
 from .mixins import AssemblyMixin, ConferenceLoginRequiredMixin
 
 logger = logging.getLogger(__name__)
diff --git a/src/backoffice/views/assemblyteam.py b/src/backoffice/views/assemblyteam.py
index 2be313cf94632415f30a5adc0076864515b1af20..abd09724dda6f90ef404c26743a5c68f6f09faca 100644
--- a/src/backoffice/views/assemblyteam.py
+++ b/src/backoffice/views/assemblyteam.py
@@ -21,7 +21,8 @@ from core.models.assemblies import Assembly, AssemblyMember
 from core.models.conference import ConferenceExportCache
 from core.models.users import UserCommunicationChannel
 
-from ..templatetags.c3assemblies import get_language_item
+from backoffice.templatetags.c3assemblies import get_language_item
+
 from .mixins import AssemblyMixin, ConferenceLoginRequiredMixin
 
 logger = logging.getLogger(__name__)
diff --git a/src/backoffice/views/map.py b/src/backoffice/views/map.py
index dc635ba4aa2a2448eda87542e6b798d0a0793e88..b30b9dd6b4509a3adbb7bd4788fac5b694be87ae 100644
--- a/src/backoffice/views/map.py
+++ b/src/backoffice/views/map.py
@@ -10,8 +10,8 @@ from django.views.generic.edit import CreateView, ModelFormMixin, UpdateView
 
 from core.models.map import MapFloor, MapPOI
 
-from ..forms import POIForm
-from .mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
+from backoffice.forms import POIForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/backoffice/views/misc.py b/src/backoffice/views/misc.py
index 18c785b9f084909f56759ede7465c1e325ebf913..3ccbe69d9f88f8fef1249747e0039340f0fdbe8f 100644
--- a/src/backoffice/views/misc.py
+++ b/src/backoffice/views/misc.py
@@ -4,8 +4,8 @@ from django.views.generic.edit import FormView
 
 from core.models import Assembly, Conference
 
-from ..forms import ConferenceForm
-from .mixins import ConferenceLoginRequiredMixin
+from backoffice.forms import ConferenceForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin
 
 
 class ConferenceSelectionView(ConferenceLoginRequiredMixin, FormView):
diff --git a/src/backoffice/views/profile.py b/src/backoffice/views/profile.py
index 224d50fed264f47d78a44caf560b34ef53a14ec7..765ea3ee95cec954a61642c365052a13a203d2a7 100644
--- a/src/backoffice/views/profile.py
+++ b/src/backoffice/views/profile.py
@@ -3,8 +3,8 @@ from django.shortcuts import redirect
 from django.utils.translation import gettext_lazy as _
 from django.views.generic import FormView
 
-from ..forms import ProfileForm
-from .mixins import ConferenceLoginRequiredMixin
+from backoffice.forms import ProfileForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin
 
 
 class ProfileView(ConferenceLoginRequiredMixin, FormView):
diff --git a/src/backoffice/views/schedules.py b/src/backoffice/views/schedules.py
index 9b140857417f06dfbcea6e0d03baaaa915a0e45b..b4ffa0b2311124f5867551824970ba9f418c9986 100644
--- a/src/backoffice/views/schedules.py
+++ b/src/backoffice/views/schedules.py
@@ -9,8 +9,8 @@ from django.views.generic.detail import SingleObjectMixin
 from core.models import ScheduleSource, ScheduleSourceImport
 from core.schedules import ScheduleTypeManager
 
-from ..forms import ScheduleSourceCreateForm
-from .mixins import ConferenceLoginRequiredMixin
+from backoffice.forms import ScheduleSourceCreateForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin
 
 
 class ScheduleAdminMixin(ConferenceLoginRequiredMixin):
diff --git a/src/backoffice/views/wiki.py b/src/backoffice/views/wiki.py
index ca6ec52a72dac40654fd435bc9d2c6c5b55d4dd0..c4326412ee8d0182a7562938429a273b28d28c65 100644
--- a/src/backoffice/views/wiki.py
+++ b/src/backoffice/views/wiki.py
@@ -16,8 +16,8 @@ from django.views.generic.edit import DeleteView, UpdateView
 
 from core.models import Conference, Lock, StaticPage, StaticPageNamespace, StaticPageRevision
 
-from ..forms import StaticPageEditForm
-from .mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
+from backoffice.forms import StaticPageEditForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
 
 
 class WikiAdminMixin(ConferenceLoginRequiredMixin):
diff --git a/src/backoffice/views/workadventure.py b/src/backoffice/views/workadventure.py
index 51753a4132fd3a8cc50bf65e89e9bb30652073ee..985857aa72d0001685cb9da8e76c1599b72e3bab 100644
--- a/src/backoffice/views/workadventure.py
+++ b/src/backoffice/views/workadventure.py
@@ -19,8 +19,8 @@ from core.models import Assembly, ConferenceMember, PlatformUser
 from core.models.rooms import Room
 from core.models.workadventure import WorkadventureSession, WorkadventureTexture
 
-from ..forms import CreateWorkadventureTextureForm
-from .mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
+from backoffice.forms import CreateWorkadventureTextureForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
 
 logger = logging.getLogger(__name__)
 MAX_ROWS = 42
diff --git a/src/core/management/commands/assembly_contact_mails.py b/src/core/management/commands/assembly_contact_mails.py
index 4caf3905b00d7898b3c109c8d21f77a356ad0632..f7c4755eb6f007e55c1d2e806ca84297a90bee51 100644
--- a/src/core/management/commands/assembly_contact_mails.py
+++ b/src/core/management/commands/assembly_contact_mails.py
@@ -1,8 +1,8 @@
 from django.core.management.base import BaseCommand
 
-from ...models.assemblies import AssemblyMember
-from ...models.conference import Conference
-from ...models.users import UserCommunicationChannel
+from core.models.assemblies import AssemblyMember
+from core.models.conference import Conference
+from core.models.users import UserCommunicationChannel
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/housekeeping.py b/src/core/management/commands/housekeeping.py
index 8e7ab72ca3bd17dda15bcee4d15bc135819d8fcd..a81d4bf19ab3f08fb83fd20a2218902be2e03670 100644
--- a/src/core/management/commands/housekeeping.py
+++ b/src/core/management/commands/housekeeping.py
@@ -4,11 +4,11 @@ from django.core.management.base import BaseCommand, CommandError
 from django.db.models import Max
 from django.utils import timezone
 
-from ...models import StaticPageNamespace
-from ...models.conference import Conference, ConferenceExportCache
-from ...models.messages import DirectMessage
-from ...models.schedules import ScheduleSource, ScheduleSourceImport
-from ...models.voucher import Voucher
+from core.models.conference import Conference, ConferenceExportCache
+from core.models.messages import DirectMessage
+from core.models.pages import StaticPageNamespace
+from core.models.schedules import ScheduleSource, ScheduleSourceImport
+from core.models.voucher import Voucher
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/import_mapservice_resultfile.py b/src/core/management/commands/import_mapservice_resultfile.py
index 4c99565217eb42e1c7c8677a26cd0f5cc563f248..241054f0e1a95a9ea7bd1a9530f97de983d18ca2 100644
--- a/src/core/management/commands/import_mapservice_resultfile.py
+++ b/src/core/management/commands/import_mapservice_resultfile.py
@@ -3,9 +3,9 @@ import json
 
 from django.core.management.base import BaseCommand
 
-from api.views.workadventure import MapServiceView
+from core.models.conference import Conference
 
-from ...models import Conference
+from api.views.workadventure import MapServiceView
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/sanitize_database.py b/src/core/management/commands/sanitize_database.py
index df3c22063b91c5de33f86f08739ab44d99f7af2d..0b56489e4ad3ec4ccf8b78426d1ab96aab279d57 100644
--- a/src/core/management/commands/sanitize_database.py
+++ b/src/core/management/commands/sanitize_database.py
@@ -4,26 +4,21 @@ from django.conf import settings
 from django.core.management.base import BaseCommand
 from django.db.models import Max
 
-from ...models import (
-    Assembly,
-    AssemblyLogEntry,
-    AssemblyMember,
+from core.models.assemblies import Assembly, AssemblyLogEntry, AssemblyMember
+from core.models.badges import UserBadge
+from core.models.conference import (
     ConferenceMember,
-    ConferenceMemberTicket,
-    ConferenceTag,
     ConferenceTrack,
-    DirectMessage,
-    Event,
-    PlatformUser,
-    ScheduleSource,
-    ScheduleSourceImport,
-    StaticPage,
-    TagItem,
-    UserBadge,
-    UserCommunicationChannel,
-    UserDereferrerAllowlist,
-    WorkadventureSession,
 )
+from core.models.dereferrer import UserDereferrerAllowlist
+from core.models.events import Event
+from core.models.messages import DirectMessage
+from core.models.pages import StaticPage
+from core.models.schedules import ScheduleSource, ScheduleSourceImport
+from core.models.tags import ConferenceTag, TagItem
+from core.models.ticket import ConferenceMemberTicket
+from core.models.users import PlatformUser, UserCommunicationChannel
+from core.models.workadventure import WorkadventureSession
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/schedule_join_rooms.py b/src/core/management/commands/schedule_join_rooms.py
index a9d4b9cd6f3d77f8e017b53350c1b48cefe5552e..7aa3c2546027dc3fec765f55b03dbfe1cee1ce4b 100644
--- a/src/core/management/commands/schedule_join_rooms.py
+++ b/src/core/management/commands/schedule_join_rooms.py
@@ -1,7 +1,7 @@
 from django.core.management.base import BaseCommand, CommandError
 from django.db import transaction
 
-from ...models import Event, Room, RoomLink, ScheduleSourceMapping
+from core.models import Event, Room, RoomLink, ScheduleSourceMapping
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/serviceusers.py b/src/core/management/commands/serviceusers.py
index 2d857bf11f74dfb7cd160da73997ccd7eb038c23..d298295db2e8548ea8a50cbba12f8c3c2f6e72e1 100644
--- a/src/core/management/commands/serviceusers.py
+++ b/src/core/management/commands/serviceusers.py
@@ -2,7 +2,7 @@ from rest_framework.authtoken.models import Token
 
 from django.core.management.base import BaseCommand
 
-from ...models.users import PlatformUser
+from core.models.users import PlatformUser
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/stats.py b/src/core/management/commands/stats.py
index 08368fe7126796826f7f4a95de37cce8fa0c0acc..7eb4aca693fed9c2bbffbcb6c32cf9c2538cd79e 100644
--- a/src/core/management/commands/stats.py
+++ b/src/core/management/commands/stats.py
@@ -1,6 +1,6 @@
 from django.core.management.base import BaseCommand
 
-from ...models import Assembly, Badge, Conference, Event, Room, UserBadge
+from core.models import Assembly, Badge, Conference, Event, Room, UserBadge
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/test_schedule_import.py b/src/core/management/commands/test_schedule_import.py
index 839f672d1bbb29069bbbb275b4e91ffc815e1486..8108cf4abe05fda1bbe57061241932e14541c953 100644
--- a/src/core/management/commands/test_schedule_import.py
+++ b/src/core/management/commands/test_schedule_import.py
@@ -6,7 +6,7 @@ from django.core.exceptions import SuspiciousOperation
 from django.core.management.base import BaseCommand
 from django.db import transaction
 
-from ...models.conference import Conference
+from core.models.conference import Conference
 
 
 class Command(BaseCommand):
diff --git a/src/core/models/assemblies.py b/src/core/models/assemblies.py
index 3ac1a0f64091c0614b7e320282e3a963494824af..1ec7d59b9a9048444795f225b8cda60807e48789 100644
--- a/src/core/models/assemblies.py
+++ b/src/core/models/assemblies.py
@@ -19,18 +19,16 @@ from django.utils.safestring import mark_safe
 from django.utils.translation import gettext
 from django.utils.translation import gettext_lazy as _
 
+from core.fields import ConferenceReference
+from core.markdown import compile_translated_markdown_fields, render_markdown, store_relationships
 from core.models.base_managers import ConferenceManagerMixin
-from core.models.tags import TagItem
+from core.models.conference import Conference, ConferenceMember
+from core.models.map import MapFloor
+from core.models.tags import TaggedItemMixin, TagItem
+from core.models.users import PlatformUser
+from core.utils import render_markdown_as_text
 from core.validators import FileSizeValidator, ImageDimensionValidator
 
-from ..fields import ConferenceReference
-from ..markdown import compile_translated_markdown_fields, render_markdown, store_relationships
-from ..utils import render_markdown_as_text
-from .conference import Conference, ConferenceMember
-from .map import MapFloor
-from .tags import TaggedItemMixin
-from .users import PlatformUser
-
 
 class AssemblyManager(ConferenceManagerMixin['Assembly']):
     staff_permissions = ['assembly_team']
diff --git a/src/core/models/badges.py b/src/core/models/badges.py
index 07e949411f6f6c18ecc71e7ee565237d638b058e..9cc1f957d862136661027659086ef4742e3180d3 100644
--- a/src/core/models/badges.py
+++ b/src/core/models/badges.py
@@ -19,16 +19,15 @@ from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
 from core.choices import UserBadgeVisibility
+from core.fields import ConferenceReference
 from core.markdown import compile_translated_markdown_fields, store_relationships
+from core.models.assemblies import Assembly
 from core.models.base_managers import ConferenceManagerMixin
 from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser
+from core.utils import generate_token
 from core.validators import ImageDimensionValidator
 
-from ..fields import ConferenceReference
-from ..utils import generate_token
-from .assemblies import Assembly
-from .users import PlatformUser
-
 logger = logging.getLogger(__name__)
 
 TOKEN_VALIDATOR = RegexValidator(r'^[0-9a-z]*$', _('BadgeToken__validator_info__lower_alpha_num'))
diff --git a/src/core/models/conference.py b/src/core/models/conference.py
index ee4e2a4a5fd30f1f4542f7d431b27cf18ceb80ab..f604e69bc59a3a580d1b017482b6b523361bbb75 100644
--- a/src/core/models/conference.py
+++ b/src/core/models/conference.py
@@ -25,10 +25,9 @@ from django.utils.translation import get_language
 from django.utils.translation import gettext_lazy as _
 
 from core.choices import UserBadgeVisibility
-
-from ..fields import ConferenceReference
-from ..utils import render_markdown_as_text
-from .users import PlatformUser
+from core.fields import ConferenceReference
+from core.models.users import PlatformUser
+from core.utils import render_markdown_as_text
 
 logger = logging.getLogger(__name__)
 
@@ -157,7 +156,7 @@ class ConferenceMember(models.Model):
         return f'{self.user.username}@{self.conference.slug}'
 
     def save(self, *args, update_fields=None, **kwargs) -> None:
-        from ..markdown import compile_translated_markdown_fields, store_relationships
+        from core.markdown import compile_translated_markdown_fields, store_relationships
 
         if update_fields is None or 'description' in update_fields:
             render_results = compile_translated_markdown_fields(self, self.conference, 'description')
@@ -547,7 +546,7 @@ class Conference(models.Model):
         if not self.mail_footer:
             return None
 
-        from ..markdown import render_markdown
+        from core.markdown import render_markdown
 
         return format_html(
             '<div id="footer" style="margin-top: 1em; border-top: 2px solid #999; color: #999; font-size: 80%;">{0}</div>',
@@ -708,7 +707,7 @@ class ConferenceExportCache(models.Model):
         return False
 
     def save(self, *args, **kwargs):
-        from ..utils import int_to_custom_string
+        from core.utils import int_to_custom_string
 
         if self.last_generated is not None:
             self.etag = int_to_custom_string(int(self.last_generated.timestamp() * 1000))
@@ -853,7 +852,7 @@ class ConferenceNavigationItem(models.Model):
     )
 
     def resolve_url(self):
-        from ..utils import resolve_internal_url
+        from core.utils import resolve_internal_url
 
         return resolve_internal_url(self.url, fallback_as_is=True)
 
diff --git a/src/core/models/map.py b/src/core/models/map.py
index a88ab66ae90ef4da76cf8d69d84708d1f2dbedf6..d0f9f7444543843fcf7d8a4e84a8b964879d43fe 100644
--- a/src/core/models/map.py
+++ b/src/core/models/map.py
@@ -7,8 +7,8 @@ from django.core.exceptions import ValidationError
 from django.db import models
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..markdown import compile_translated_markdown_fields, store_relationships
+from core.fields import ConferenceReference
+from core.markdown import compile_translated_markdown_fields, store_relationships
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/core/models/messages.py b/src/core/models/messages.py
index 08315dce1b48ebe5c536ab0b3ad1b01c45d1447f..edcb87f3e5aa5710bcf96db1c2a42a334ae71da7 100644
--- a/src/core/models/messages.py
+++ b/src/core/models/messages.py
@@ -7,8 +7,8 @@ from django.urls import NoReverseMatch, reverse
 from django.utils.text import format_lazy
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..markdown import render_markdown
+from core.fields import ConferenceReference
+from core.markdown import render_markdown
 
 
 class DirectMessage(models.Model):
diff --git a/src/core/models/metanavi.py b/src/core/models/metanavi.py
index bf48236bb12d86a2343161f13284f0a63969d35d..b03b6b7c46086488923b53b384d7bdaca2593636 100644
--- a/src/core/models/metanavi.py
+++ b/src/core/models/metanavi.py
@@ -6,7 +6,7 @@ from django.db import models
 from django.utils.safestring import mark_safe
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
+from core.fields import ConferenceReference
 
 
 class MetaNavItemManager(models.Manager):
diff --git a/src/core/models/pages.py b/src/core/models/pages.py
index 9d0db7549cb24d6285341a261b9943b212f39b28..6577a977bd561dd7b120ce4875d26b06a0dcd8f7 100644
--- a/src/core/models/pages.py
+++ b/src/core/models/pages.py
@@ -17,12 +17,11 @@ from django.utils.functional import cached_property
 from django.utils.html import strip_tags
 from django.utils.translation import gettext_lazy as _
 
+from core.fields import ConferenceReference
 from core.markdown import render_markdown_ex, store_relationships
-
-from ..fields import ConferenceReference
-from ..utils import GitRepo
-from .conference import Conference
-from .users import PlatformUser
+from core.models.conference import Conference
+from core.models.users import PlatformUser
+from core.utils import GitRepo
 
 
 class StaticPageNamespace(models.Model):
diff --git a/src/core/models/projects.py b/src/core/models/projects.py
index e2b808b8c9c8e0519582d5a36165a9c3b65e453a..b7c97768934263542be468c69285d0792de11108 100644
--- a/src/core/models/projects.py
+++ b/src/core/models/projects.py
@@ -9,16 +9,15 @@ from django.db.models import QuerySet
 from django.utils.text import slugify
 from django.utils.translation import gettext_lazy as _
 
+from core.fields import ConferenceReference
+from core.markdown import compile_translated_markdown_fields, store_relationships
+from core.models.assemblies import Assembly
 from core.models.base_managers import ConferenceManagerMixin
+from core.models.conference import ConferenceMember
 from core.models.tags import TaggedItemMixin
 from core.models.users import PlatformUser
 from core.validators import FileSizeValidator, ImageDimensionValidator
 
-from ..fields import ConferenceReference
-from ..markdown import compile_translated_markdown_fields, store_relationships
-from ..models.conference import ConferenceMember
-from .assemblies import Assembly
-
 
 class ProjectManager(ConferenceManagerMixin['Project']):
     assembly_filter = 'assembly'
diff --git a/src/core/models/schedules.py b/src/core/models/schedules.py
index 271700e8d1771b604c348414e1fc0e2a2c17169d..1b24dc6d3c526be3b95be44701971a68f1be1eac 100644
--- a/src/core/models/schedules.py
+++ b/src/core/models/schedules.py
@@ -9,13 +9,13 @@ from django.db import models
 from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..schedules import ScheduleTypeManager
-from ..utils import mail2uuid, mask_url, str2bool
-from .assemblies import Assembly
-from .events import Event, EventAttachment
-from .rooms import Room
-from .users import PlatformUser
+from core.fields import ConferenceReference
+from core.models.assemblies import Assembly
+from core.models.events import Event, EventAttachment
+from core.models.rooms import Room
+from core.models.users import PlatformUser
+from core.schedules import ScheduleTypeManager
+from core.utils import mail2uuid, mask_url, str2bool
 
 if TYPE_CHECKING:
     pass
diff --git a/src/core/models/tags.py b/src/core/models/tags.py
index d08324e978147f7ded6692ba8f0a119b0f7f4664..630e5512f6180a189962b010cd718fe48ee904f4 100644
--- a/src/core/models/tags.py
+++ b/src/core/models/tags.py
@@ -9,10 +9,9 @@ from django.db.models import QuerySet
 from django.utils.functional import cached_property
 from django.utils.translation import gettext_lazy as _
 
+from core.fields import ConferenceReference
 from core.models.conference import Conference, ConferenceMember
 
-from ..fields import ConferenceReference
-
 
 class ConferenceTag(models.Model):
     class Meta:
diff --git a/src/core/models/ticket.py b/src/core/models/ticket.py
index e8804d537400a27e0d17865ea51c51e2a3c450ea..6b412164873d1a38cf2cddf81600dbed91c4e40e 100644
--- a/src/core/models/ticket.py
+++ b/src/core/models/ticket.py
@@ -7,9 +7,9 @@ from django.db import models
 from django.db.utils import IntegrityError
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from .conference import Conference
-from .users import PlatformUser
+from core.fields import ConferenceReference
+from core.models.conference import Conference
+from core.models.users import PlatformUser
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/core/models/users.py b/src/core/models/users.py
index d3f600c12ca384f5ad2f9aa84cc95e440a58d93e..b6b580e58d8d2ce51654d9fa5d171a955dbd4d90 100644
--- a/src/core/models/users.py
+++ b/src/core/models/users.py
@@ -26,9 +26,9 @@ from django.utils.text import slugify
 from django.utils.timezone import now
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..utils import download_from_url
-from ..validators import ImageDimensionValidator
+from core.fields import ConferenceReference
+from core.utils import download_from_url
+from core.validators import ImageDimensionValidator
 
 if TYPE_CHECKING:
     from core.models import Assembly, Conference, ConferenceMember
diff --git a/src/core/models/voucher.py b/src/core/models/voucher.py
index 835d04b33f02077adc0797ad99bf99a919d16caf..b6f437a5091627b4d4738aff6e01d9d45bd846a3 100644
--- a/src/core/models/voucher.py
+++ b/src/core/models/voucher.py
@@ -9,11 +9,11 @@ from django.utils import timezone
 from django.utils.functional import cached_property
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..markdown import render_markdown
-from .assemblies import Assembly
-from .conference import Conference
-from .users import PlatformUser
+from core.fields import ConferenceReference
+from core.markdown import render_markdown
+from core.models.assemblies import Assembly
+from core.models.conference import Conference
+from core.models.users import PlatformUser
 
 
 class VoucherManager(models.Manager):
diff --git a/src/core/models/workadventure.py b/src/core/models/workadventure.py
index 5c9fc1d7aa218fcfadf5cdfa0e4e665e34a303db..f96769d71dd2309e7cf1ae0b41b55ced70fe6f09 100644
--- a/src/core/models/workadventure.py
+++ b/src/core/models/workadventure.py
@@ -10,11 +10,11 @@ from django.db.models import Q
 from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..utils import generate_token
-from .assemblies import Assembly
-from .conference import Conference, ConferenceMember, PlatformUser
-from .rooms import Room
+from core.fields import ConferenceReference
+from core.models.assemblies import Assembly
+from core.models.conference import Conference, ConferenceMember, PlatformUser
+from core.models.rooms import Room
+from core.utils import generate_token
 
 
 class WorkadventureSession(models.Model):
diff --git a/src/core/tests/assemblies.py b/src/core/tests/assemblies.py
index be70aabad8f3ac39e86666e1e272694b3a65aaa6..3150f0ef24c39295ac73c28555c7798bfd3f9e9f 100644
--- a/src/core/tests/assemblies.py
+++ b/src/core/tests/assemblies.py
@@ -2,9 +2,9 @@ from django.contrib.auth.models import Group, Permission
 from django.core import mail
 from django.test import TestCase, override_settings
 
-from ..models.assemblies import Assembly, AssemblyMember
-from ..models.conference import Conference, ConferenceMember
-from ..models.users import PlatformUser, UserCommunicationChannel
+from core.models.assemblies import Assembly, AssemblyMember
+from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser, UserCommunicationChannel
 
 
 class AssembliesTestsMixin(TestCase):
diff --git a/src/core/tests/badges.py b/src/core/tests/badges.py
index f0f40ec9cbe0c662aa1789a7f460d32793ab6890..59ebfddb81edf264b5cd4e9c185851a17244e0e7 100644
--- a/src/core/tests/badges.py
+++ b/src/core/tests/badges.py
@@ -2,11 +2,10 @@ from django.core.exceptions import ValidationError
 from django.test import TestCase
 
 from core.choices import UserBadgeVisibility
-
-from ..models.assemblies import Assembly
-from ..models.badges import Badge, UserBadge
-from ..models.conference import Conference, ConferenceMember
-from ..models.users import PlatformUser
+from core.models.assemblies import Assembly
+from core.models.badges import Badge, UserBadge
+from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser
 
 
 class BadgeTests(TestCase):
diff --git a/src/core/tests/conference.py b/src/core/tests/conference.py
index 8e6a327f9fc6d6e99262d56bc4ae8985980d1eaf..3ed7df0ec677b36116043bf74eec19f1fc60b494 100644
--- a/src/core/tests/conference.py
+++ b/src/core/tests/conference.py
@@ -4,7 +4,7 @@ from unittest.mock import patch
 from django.test import TestCase
 from django.utils import timezone
 
-from ..models.conference import Conference, ConferenceDay
+from core.models.conference import Conference, ConferenceDay
 
 
 class ConferenceTests(TestCase):
diff --git a/src/core/tests/exportcache.py b/src/core/tests/exportcache.py
index 090d9e82ee0795dc080a81c00e4352d2253b7c87..72e57d7e46465b636be9dc6a0995b81b8985be14 100644
--- a/src/core/tests/exportcache.py
+++ b/src/core/tests/exportcache.py
@@ -4,8 +4,8 @@ from django.test import TestCase, override_settings
 from django.utils import timezone
 from django.utils.timezone import now
 
-from ..models.assemblies import Assembly
-from ..models.conference import Conference, ConferenceExportCache
+from core.models.assemblies import Assembly
+from core.models.conference import Conference, ConferenceExportCache
 
 
 class ScheduleTests(TestCase):
diff --git a/src/core/tests/markdown.py b/src/core/tests/markdown.py
index e4cb46a8bf3f90ca10130f62ee6c1762b3d658bd..d30892ab8ce3ecd58025077a29198c312c93ca9f 100644
--- a/src/core/tests/markdown.py
+++ b/src/core/tests/markdown.py
@@ -7,10 +7,9 @@ from django.test import TestCase
 from django.test.utils import override_settings
 from django.urls import reverse
 
+from core.markdown import render_markdown, render_markdown_ex
 from core.models import Conference, ConferenceTag, PlatformUser, StaticPage
 
-from ..markdown import render_markdown, render_markdown_ex
-
 TEST_CONF_ID = uuid.uuid4()
 
 
diff --git a/src/core/tests/schedules.py b/src/core/tests/schedules.py
index a53bfff0e9c44514d82a0dfc01b219ab957c332f..1fea3d274003d35b78a6ce27cb01873c7abf597e 100644
--- a/src/core/tests/schedules.py
+++ b/src/core/tests/schedules.py
@@ -4,15 +4,15 @@ from pathlib import Path
 
 from django.test import TestCase, override_settings
 
-from ..models import Event, Room
-from ..models.assemblies import Assembly
-from ..models.conference import Conference, ConferenceMember
-from ..models.schedules import ScheduleSource, ScheduleSourceImport, ScheduleSourceMapping
-from ..models.users import PlatformUser
-from ..schedules.base import BaseScheduleSupport, ScheduleTypeManager, filter_additional_data, schedule_time_to_timedelta
-from ..schedules.schedulejson import ScheduleJSONSupport
-from ..schedules.schedulejsonfrab import ScheduleJSONFrabSupport
-from ..schedules.schedulexml import ScheduleXMLSupport
+from core.models import Event, Room
+from core.models.assemblies import Assembly
+from core.models.conference import Conference, ConferenceMember
+from core.models.schedules import ScheduleSource, ScheduleSourceImport, ScheduleSourceMapping
+from core.models.users import PlatformUser
+from core.schedules.base import BaseScheduleSupport, ScheduleTypeManager, filter_additional_data, schedule_time_to_timedelta
+from core.schedules.schedulejson import ScheduleJSONSupport
+from core.schedules.schedulejsonfrab import ScheduleJSONFrabSupport
+from core.schedules.schedulexml import ScheduleXMLSupport
 
 
 class FileBasedScheduleSupport(BaseScheduleSupport):
diff --git a/src/core/tests/search.py b/src/core/tests/search.py
index 1d9f4dadb8b4fdcb934384517fc0207b4c58c9a6..852e85858702a3b2cbb6398c697c3ca687187f07 100644
--- a/src/core/tests/search.py
+++ b/src/core/tests/search.py
@@ -1,12 +1,12 @@
 from django.contrib.auth.models import AnonymousUser
 from django.test import TestCase
 
-from ..models.assemblies import Assembly
-from ..models.conference import Conference, ConferenceTrack
-from ..models.events import Event
-from ..models.pages import StaticPage
-from ..models.users import PlatformUser
-from ..search import search
+from core.models.assemblies import Assembly
+from core.models.conference import Conference, ConferenceTrack
+from core.models.events import Event
+from core.models.pages import StaticPage
+from core.models.users import PlatformUser
+from core.search import search
 
 
 class SearchTests(TestCase):
diff --git a/src/core/tests/tags.py b/src/core/tests/tags.py
index 6c411e15879fa702fd6c69e214f8e0f74d30e555..1d5d5d7dfbfdc1d9a09ba9ef4e3584d5c631bad3 100644
--- a/src/core/tests/tags.py
+++ b/src/core/tests/tags.py
@@ -2,10 +2,10 @@ from django.contrib.auth.models import AnonymousUser
 from django.contrib.contenttypes.models import ContentType
 from django.test import TestCase
 
-from ..models.assemblies import Assembly
-from ..models.conference import Conference
-from ..models.events import Event
-from ..models.tags import ConferenceTag, TaggedItemMixin, TagItem
+from core.models.assemblies import Assembly
+from core.models.conference import Conference
+from core.models.events import Event
+from core.models.tags import ConferenceTag, TaggedItemMixin, TagItem
 
 
 class TaggingTests(TestCase):
diff --git a/src/core/tests/tickets.py b/src/core/tests/tickets.py
index 1a7dfd5b1a6338588248286e8818041897de83e1..4ac9ecee1fa9757ebd794be6b0075eaca7f22c12 100644
--- a/src/core/tests/tickets.py
+++ b/src/core/tests/tickets.py
@@ -4,9 +4,9 @@ import jwt
 
 from django.test import TestCase, override_settings
 
-from ..models.conference import Conference
-from ..models.ticket import ConferenceMemberTicket, TicketValidationError
-from ..models.users import PlatformUser
+from core.models.conference import Conference
+from core.models.ticket import ConferenceMemberTicket, TicketValidationError
+from core.models.users import PlatformUser
 
 _GOOD_SECRET = 'F00Preti%'
 _BAD_SECRET = 'DämlicherFlanders'
diff --git a/src/core/tests/users.py b/src/core/tests/users.py
index c415cf8595d90f88eb54b521da12103641976536..d1047ef2226ac09a739a0a308feaf5587c91e895 100644
--- a/src/core/tests/users.py
+++ b/src/core/tests/users.py
@@ -2,8 +2,8 @@ from django.core.exceptions import ValidationError
 from django.test import TestCase
 from django.urls import reverse
 
-from ..models.conference import Conference, ConferenceMember
-from ..models.users import PlatformUser, UserCommunicationChannel
+from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser, UserCommunicationChannel
 
 
 class UserCommunicationChannelStaticTests(TestCase):
diff --git a/src/core/tests/utils.py b/src/core/tests/utils.py
index 568be24a70ab849ecc8a86440d2bf8478c5bbf60..a69dab3c921ad22cb63b78ace318f5538b256656 100644
--- a/src/core/tests/utils.py
+++ b/src/core/tests/utils.py
@@ -3,7 +3,7 @@ from datetime import timedelta
 
 from django.test import TestCase
 
-from ..utils import GitRepo, mail2uuid, mask_url, scheme_and_netloc_from_url, str2timedelta
+from core.utils import GitRepo, mail2uuid, mask_url, scheme_and_netloc_from_url, str2timedelta
 
 
 class UtilsTests(TestCase):
diff --git a/src/core/tests/vouchers.py b/src/core/tests/vouchers.py
index dddc98caa4ddba5dc68e1a718fe363b6cb0ec170..c598820be882e28a639d015078dbf4df71c5ac00 100644
--- a/src/core/tests/vouchers.py
+++ b/src/core/tests/vouchers.py
@@ -4,10 +4,10 @@ from datetime import datetime, timezone
 from django.core.exceptions import ValidationError
 from django.test import TestCase
 
-from ..models.assemblies import Assembly
-from ..models.conference import Conference, ConferenceMember
-from ..models.users import PlatformUser
-from ..models.voucher import Voucher
+from core.models.assemblies import Assembly
+from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser
+from core.models.voucher import Voucher
 
 
 class VoucherTests(TestCase):
diff --git a/src/core/tests/workadventure.py b/src/core/tests/workadventure.py
index 2e91edea33863e754f8144fba6c08d38ed983cc0..fd6eb43b4088a113c4d28487532d5a3ca02d95e7 100644
--- a/src/core/tests/workadventure.py
+++ b/src/core/tests/workadventure.py
@@ -1,8 +1,8 @@
 from django.test import TestCase
 
-from ..models import Assembly, Room, WorkadventureSession
-from ..models.conference import Conference, ConferenceMember
-from ..models.users import PlatformUser
+from core.models import Assembly, Room, WorkadventureSession
+from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser
 
 
 class WorkadventureSessionTests(TestCase):
diff --git a/src/hub/settings/default.py b/src/hub/settings/default.py
index 62069a573f8b6f5a93c1e784478ee1f0eafa0697..7dd95cacf958a8f20aed8418c6198c81f5c3a37a 100644
--- a/src/hub/settings/default.py
+++ b/src/hub/settings/default.py
@@ -58,9 +58,12 @@ assert SECRET_KEY is None or not SECRET_KEY.startswith('/'), (
 
 # Local Settings
 try:
-    from ..local_settings import *  # noqa: F403,F401
+    from hub.local_settings import *  # noqa: F403,F401
 except ImportError:
-    print('Unable to load (optional) local_settings.py.')
+    try:
+        from hub.settings.local_settings import *  # noqa: F403,F401
+    except ImportError:
+        print('Unable to load (optional) local_settings.py.')
 
 # read SECRET_KEY from a file not stored in git
 if DEBUG and SECRET_KEY is None:  # noqa: F405