diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index c0ff1e8283bb2286c2ab0cd5080a8911c228e65f..7c10a39be567ef573337fea4b254db21b3a83ed0 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -327,7 +327,7 @@ SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
 # AUTHENTICATION CONFIGURATION
 # ------------------------------------------------------------------------------
 AUTHENTICATION_BACKENDS = (
-    "django.contrib.auth.backends.ModelBackend",
+    "funkwhale_api.users.auth_backends.ModelBackend",
     "allauth.account.auth_backends.AuthenticationBackend",
 )
 SESSION_COOKIE_HTTPONLY = False
@@ -538,6 +538,7 @@ MUSICBRAINZ_HOSTNAME = env("MUSICBRAINZ_HOSTNAME", default="musicbrainz.org")
 # Custom Admin URL, use {% url 'admin:index' %}
 ADMIN_URL = env("DJANGO_ADMIN_URL", default="^api/admin/")
 CSRF_USE_SESSIONS = True
+SESSION_ENGINE = "django.contrib.sessions.backends.cache"
 
 # Playlist settings
 # XXX: deprecated, see #186
diff --git a/api/funkwhale_api/factories.py b/api/funkwhale_api/factories.py
index 602037a065440bfde3fba2ff99821b2bebae1d91..5db75fd58d74756689fb48b7df072c635acc99f3 100644
--- a/api/funkwhale_api/factories.py
+++ b/api/funkwhale_api/factories.py
@@ -28,3 +28,14 @@ def ManyToManyFromList(field_name):
             field.add(*extracted)
 
     return inner
+
+
+class NoUpdateOnCreate:
+    """
+    Factory boy calls save after the initial create. In most case, this
+    is not needed, so we disable this behaviour
+    """
+
+    @classmethod
+    def _after_postgeneration(cls, instance, create, results=None):
+        return
diff --git a/api/funkwhale_api/favorites/factories.py b/api/funkwhale_api/favorites/factories.py
index d96ef1c15180c3c5d425585a3f2d562db015f139..fcc2f820425c80130a93b7c45c1dca7650da5c88 100644
--- a/api/funkwhale_api/favorites/factories.py
+++ b/api/funkwhale_api/favorites/factories.py
@@ -1,12 +1,12 @@
 import factory
 
-from funkwhale_api.factories import registry
+from funkwhale_api.factories import registry, NoUpdateOnCreate
 from funkwhale_api.music.factories import TrackFactory
 from funkwhale_api.users.factories import UserFactory
 
 
 @registry.register
-class TrackFavorite(factory.django.DjangoModelFactory):
+class TrackFavorite(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     track = factory.SubFactory(TrackFactory)
     user = factory.SubFactory(UserFactory)
 
diff --git a/api/funkwhale_api/federation/factories.py b/api/funkwhale_api/federation/factories.py
index cbe0bee85fceee231b9d9d86181225aab97390b0..331a5f5d68df35d53823640eb2c5a5b7518a8764 100644
--- a/api/funkwhale_api/federation/factories.py
+++ b/api/funkwhale_api/federation/factories.py
@@ -7,7 +7,7 @@ from django.conf import settings
 from django.utils import timezone
 from django.utils.http import http_date
 
-from funkwhale_api.factories import registry
+from funkwhale_api.factories import registry, NoUpdateOnCreate
 from funkwhale_api.users import factories as user_factories
 
 from . import keys, models
@@ -67,7 +67,7 @@ def create_user(actor):
 
 
 @registry.register
-class Domain(factory.django.DjangoModelFactory):
+class Domain(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     name = factory.Faker("domain_name")
 
     class Meta:
@@ -76,7 +76,7 @@ class Domain(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class ActorFactory(factory.DjangoModelFactory):
+class ActorFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
     public_key = None
     private_key = None
     preferred_username = factory.Faker("user_name")
@@ -100,6 +100,7 @@ class ActorFactory(factory.DjangoModelFactory):
             o.domain.name, o.preferred_username
         )
     )
+    keys = factory.LazyFunction(keys.get_key_pair)
 
     class Meta:
         model = models.Actor
@@ -125,19 +126,9 @@ class ActorFactory(factory.DjangoModelFactory):
         else:
             self.user = UserFactory(actor=self, **kwargs)
 
-    @factory.post_generation
-    def keys(self, create, extracted, **kwargs):
-        if not create:
-            # Simple build, do nothing.
-            return
-        if not extracted:
-            private, public = keys.get_key_pair()
-            self.private_key = private.decode("utf-8")
-            self.public_key = public.decode("utf-8")
-
 
 @registry.register
-class FollowFactory(factory.DjangoModelFactory):
+class FollowFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
     target = factory.SubFactory(ActorFactory)
     actor = factory.SubFactory(ActorFactory)
 
@@ -149,28 +140,23 @@ class FollowFactory(factory.DjangoModelFactory):
 
 
 @registry.register
-class MusicLibraryFactory(factory.django.DjangoModelFactory):
+class MusicLibraryFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     actor = factory.SubFactory(ActorFactory)
     privacy_level = "me"
     name = factory.Faker("sentence")
     description = factory.Faker("sentence")
     uploads_count = 0
     fid = factory.Faker("federation_url")
+    followers_url = factory.LazyAttribute(
+        lambda o: o.fid + "/followers" if o.fid else None
+    )
 
     class Meta:
         model = "music.Library"
 
-    @factory.post_generation
-    def followers_url(self, create, extracted, **kwargs):
-        if not create:
-            # Simple build, do nothing.
-            return
-
-        self.followers_url = extracted or self.fid + "/followers"
-
 
 @registry.register
-class LibraryScan(factory.django.DjangoModelFactory):
+class LibraryScan(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     library = factory.SubFactory(MusicLibraryFactory)
     actor = factory.SubFactory(ActorFactory)
     total_files = factory.LazyAttribute(lambda o: o.library.uploads_count)
@@ -180,7 +166,7 @@ class LibraryScan(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class ActivityFactory(factory.django.DjangoModelFactory):
+class ActivityFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     actor = factory.SubFactory(ActorFactory)
     url = factory.Faker("federation_url")
     payload = factory.LazyFunction(lambda: {"type": "Create"})
@@ -190,7 +176,7 @@ class ActivityFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class InboxItemFactory(factory.django.DjangoModelFactory):
+class InboxItemFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     actor = factory.SubFactory(ActorFactory, local=True)
     activity = factory.SubFactory(ActivityFactory)
     type = "to"
@@ -200,7 +186,7 @@ class InboxItemFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class DeliveryFactory(factory.django.DjangoModelFactory):
+class DeliveryFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     activity = factory.SubFactory(ActivityFactory)
     inbox_url = factory.Faker("url")
 
@@ -209,7 +195,7 @@ class DeliveryFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class LibraryFollowFactory(factory.DjangoModelFactory):
+class LibraryFollowFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
     target = factory.SubFactory(MusicLibraryFactory)
     actor = factory.SubFactory(ActorFactory)
 
diff --git a/api/funkwhale_api/federation/models.py b/api/funkwhale_api/federation/models.py
index 35b15b6678f5537da7a6f8d2b0f0c8d12c5100d5..2fdeaaa7675abf7ccef9e3a2ce05319682ea0f85 100644
--- a/api/funkwhale_api/federation/models.py
+++ b/api/funkwhale_api/federation/models.py
@@ -238,6 +238,15 @@ class Actor(models.Model):
         )
         return data
 
+    @property
+    def keys(self):
+        return self.private_key, self.public_key
+
+    @keys.setter
+    def keys(self, v):
+        self.private_key = v[0].decode("utf-8")
+        self.public_key = v[1].decode("utf-8")
+
 
 class InboxItem(models.Model):
     """
diff --git a/api/funkwhale_api/history/factories.py b/api/funkwhale_api/history/factories.py
index 0524eff1967d9b525e3c029b9cc6336eafdfcad0..59a701063173dea2cbb14907a931db9fe21a02e9 100644
--- a/api/funkwhale_api/history/factories.py
+++ b/api/funkwhale_api/history/factories.py
@@ -1,12 +1,12 @@
 import factory
 
-from funkwhale_api.factories import registry
+from funkwhale_api.factories import registry, NoUpdateOnCreate
 from funkwhale_api.music import factories
 from funkwhale_api.users.factories import UserFactory
 
 
 @registry.register
-class ListeningFactory(factory.django.DjangoModelFactory):
+class ListeningFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     user = factory.SubFactory(UserFactory)
     track = factory.SubFactory(factories.TrackFactory)
 
diff --git a/api/funkwhale_api/music/factories.py b/api/funkwhale_api/music/factories.py
index 8a7e84a925478c81ad02155f976bac99575fd2be..cd2a91ccb1d72766493b8998189ea8bc58e654e4 100644
--- a/api/funkwhale_api/music/factories.py
+++ b/api/funkwhale_api/music/factories.py
@@ -2,7 +2,8 @@ import os
 
 import factory
 
-from funkwhale_api.factories import ManyToManyFromList, registry
+from funkwhale_api.factories import ManyToManyFromList, registry, NoUpdateOnCreate
+
 from funkwhale_api.federation import factories as federation_factories
 from funkwhale_api.music import licenses
 from funkwhale_api.users import factories as users_factories
@@ -39,7 +40,7 @@ def deduce_from_conf(field):
 
 
 @registry.register
-class LicenseFactory(factory.django.DjangoModelFactory):
+class LicenseFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     code = "cc-by-4.0"
     url = deduce_from_conf("url")
     commercial = deduce_from_conf("commercial")
@@ -54,7 +55,7 @@ class LicenseFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class ArtistFactory(factory.django.DjangoModelFactory):
+class ArtistFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     name = factory.Faker("name")
     mbid = factory.Faker("uuid4")
     fid = factory.Faker("federation_url")
@@ -65,7 +66,7 @@ class ArtistFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class AlbumFactory(factory.django.DjangoModelFactory):
+class AlbumFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     title = factory.Faker("sentence", nb_words=3)
     mbid = factory.Faker("uuid4")
     release_date = factory.Faker("date_object")
@@ -80,7 +81,7 @@ class AlbumFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class TrackFactory(factory.django.DjangoModelFactory):
+class TrackFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     fid = factory.Faker("federation_url")
     title = factory.Faker("sentence", nb_words=3)
     mbid = factory.Faker("uuid4")
@@ -104,7 +105,7 @@ class TrackFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class UploadFactory(factory.django.DjangoModelFactory):
+class UploadFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     fid = factory.Faker("federation_url")
     track = factory.SubFactory(TrackFactory)
     library = factory.SubFactory(federation_factories.MusicLibraryFactory)
@@ -128,7 +129,7 @@ class UploadFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class UploadVersionFactory(factory.django.DjangoModelFactory):
+class UploadVersionFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     upload = factory.SubFactory(UploadFactory, bitrate=200000)
     bitrate = factory.SelfAttribute("upload.bitrate")
     mimetype = "audio/mpeg"
@@ -140,7 +141,7 @@ class UploadVersionFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class WorkFactory(factory.django.DjangoModelFactory):
+class WorkFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     mbid = factory.Faker("uuid4")
     language = "eng"
     nature = "song"
@@ -151,7 +152,7 @@ class WorkFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class LyricsFactory(factory.django.DjangoModelFactory):
+class LyricsFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     work = factory.SubFactory(WorkFactory)
     url = factory.Faker("url")
     content = factory.Faker("paragraphs", nb=4)
@@ -161,7 +162,7 @@ class LyricsFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class TagFactory(factory.django.DjangoModelFactory):
+class TagFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     name = factory.SelfAttribute("slug")
     slug = factory.Faker("slug")
 
@@ -172,7 +173,7 @@ class TagFactory(factory.django.DjangoModelFactory):
 # XXX To remove
 
 
-class ImportBatchFactory(factory.django.DjangoModelFactory):
+class ImportBatchFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     submitted_by = factory.SubFactory(users_factories.UserFactory)
 
     class Meta:
@@ -180,7 +181,7 @@ class ImportBatchFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class ImportJobFactory(factory.django.DjangoModelFactory):
+class ImportJobFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     batch = factory.SubFactory(ImportBatchFactory)
     source = factory.Faker("url")
     mbid = factory.Faker("uuid4")
diff --git a/api/funkwhale_api/playlists/factories.py b/api/funkwhale_api/playlists/factories.py
index ff031945a57163a633f8863487a6f68299c08cd5..acfde10cdf90bf8ae2c2859d16d0c0be2f3355e7 100644
--- a/api/funkwhale_api/playlists/factories.py
+++ b/api/funkwhale_api/playlists/factories.py
@@ -1,12 +1,12 @@
 import factory
 
-from funkwhale_api.factories import registry
+from funkwhale_api.factories import registry, NoUpdateOnCreate
 from funkwhale_api.music.factories import TrackFactory
 from funkwhale_api.users.factories import UserFactory
 
 
 @registry.register
-class PlaylistFactory(factory.django.DjangoModelFactory):
+class PlaylistFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     name = factory.Faker("name")
     user = factory.SubFactory(UserFactory)
 
@@ -15,7 +15,7 @@ class PlaylistFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class PlaylistTrackFactory(factory.django.DjangoModelFactory):
+class PlaylistTrackFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     playlist = factory.SubFactory(PlaylistFactory)
     track = factory.SubFactory(TrackFactory)
 
diff --git a/api/funkwhale_api/radios/factories.py b/api/funkwhale_api/radios/factories.py
index a83c53737a9b174a37fa97ebdb46d13fdea805e5..2ba66483dad5cf63dcbaf1127a5c6f6bd935856d 100644
--- a/api/funkwhale_api/radios/factories.py
+++ b/api/funkwhale_api/radios/factories.py
@@ -1,11 +1,11 @@
 import factory
 
-from funkwhale_api.factories import registry
+from funkwhale_api.factories import registry, NoUpdateOnCreate
 from funkwhale_api.users.factories import UserFactory
 
 
 @registry.register
-class RadioFactory(factory.django.DjangoModelFactory):
+class RadioFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     name = factory.Faker("name")
     description = factory.Faker("paragraphs")
     user = factory.SubFactory(UserFactory)
@@ -16,7 +16,7 @@ class RadioFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class RadioSessionFactory(factory.django.DjangoModelFactory):
+class RadioSessionFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     user = factory.SubFactory(UserFactory)
 
     class Meta:
@@ -24,7 +24,7 @@ class RadioSessionFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register(name="radios.CustomRadioSession")
-class CustomRadioSessionFactory(factory.django.DjangoModelFactory):
+class CustomRadioSessionFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     user = factory.SubFactory(UserFactory)
     radio_type = "custom"
     custom_radio = factory.SubFactory(
diff --git a/api/funkwhale_api/users/auth_backends.py b/api/funkwhale_api/users/auth_backends.py
new file mode 100644
index 0000000000000000000000000000000000000000..404b34f4d1d2efa35bf83c9178da163ac3a0110c
--- /dev/null
+++ b/api/funkwhale_api/users/auth_backends.py
@@ -0,0 +1,17 @@
+from django.contrib.auth import backends, get_user_model
+
+
+class ModelBackend(backends.ModelBackend):
+    def get_user(self, user_id):
+        """
+        Select related to avoid two additional queries
+        """
+        try:
+            user = (
+                get_user_model()
+                ._default_manager.select_related("actor__domain")
+                .get(pk=user_id)
+            )
+        except get_user_model().DoesNotExist:
+            return None
+        return user if self.user_can_authenticate(user) else None
diff --git a/api/funkwhale_api/users/factories.py b/api/funkwhale_api/users/factories.py
index 9bef1da1c909c38797a3dc5430cc8861d804d501..a5b113cf4506f0a8c80074f38f5cf98c98669ce6 100644
--- a/api/funkwhale_api/users/factories.py
+++ b/api/funkwhale_api/users/factories.py
@@ -2,13 +2,13 @@ import factory
 from django.contrib.auth.models import Permission
 from django.utils import timezone
 
-from funkwhale_api.factories import ManyToManyFromList, registry
+from funkwhale_api.factories import ManyToManyFromList, registry, NoUpdateOnCreate
 
 from . import models
 
 
 @registry.register
-class GroupFactory(factory.django.DjangoModelFactory):
+class GroupFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     name = factory.Sequence(lambda n: "group-{0}".format(n))
 
     class Meta:
@@ -32,7 +32,7 @@ class GroupFactory(factory.django.DjangoModelFactory):
 
 
 @registry.register
-class InvitationFactory(factory.django.DjangoModelFactory):
+class InvitationFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     owner = factory.LazyFunction(lambda: UserFactory())
 
     class Meta:
diff --git a/api/tests/music/test.ogg b/api/tests/music/test.ogg
index 3027e3ec473cbffc6eee56dff868300a6763fab7..5ca0a7f55bec448220af35a368ec557b2f42fae6 100644
Binary files a/api/tests/music/test.ogg and b/api/tests/music/test.ogg differ
diff --git a/api/tests/music/test.opus b/api/tests/music/test.opus
index 1dd190eacaf0f9eb3445e76d5ed7e7798b0195e8..ac39fd3270e27f5cadaf0927472ad17926dfcff6 100644
Binary files a/api/tests/music/test.opus and b/api/tests/music/test.opus differ
diff --git a/api/tests/music/test_models.py b/api/tests/music/test_models.py
index 500d69886b0cea51276c5989aede7fbd41be2634..ab32579b7e0db29c5a77843161715a919e9a45c3 100644
--- a/api/tests/music/test_models.py
+++ b/api/tests/music/test_models.py
@@ -448,7 +448,7 @@ def test_get_audio_data(factories):
 
     result = upload.get_audio_data()
 
-    assert result == {"duration": 229, "bitrate": 128000, "size": 3459481}
+    assert result == {"duration": 1, "bitrate": 112000, "size": 14858}
 
 
 def test_library_queryset_with_follows(factories):
diff --git a/api/tests/music/test_utils.py b/api/tests/music/test_utils.py
index ecbfc49c9f7744a7e079bb890a237621bbc58fd3..87eaddc435d9270e29a0750a60f32b2af7f6e74f 100644
--- a/api/tests/music/test_utils.py
+++ b/api/tests/music/test_utils.py
@@ -27,7 +27,7 @@ def test_guess_mimetype_try_using_extension_if_fail(wrong, factories, mocker):
     [
         ("sample.flac", {"bitrate": 1608000, "length": 0.001}),
         ("test.mp3", {"bitrate": 8000, "length": 267.70285714285717}),
-        ("test.ogg", {"bitrate": 128000, "length": 229.18304166666667}),
+        ("test.ogg", {"bitrate": 112000, "length": 1}),
     ],
 )
 def test_get_audio_file_data(name, expected):