diff --git a/api/funkwhale_api/federation/factories.py b/api/funkwhale_api/federation/factories.py
index 97158582d089bf3b085ab14b7b02da6a0b2411b5..574560f0df0dc8957438b108acfa06983cab8fea 100644
--- a/api/funkwhale_api/federation/factories.py
+++ b/api/funkwhale_api/federation/factories.py
@@ -86,6 +86,17 @@ class DomainFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
         return self.service_actor
 
 
+_CACHE = {}
+
+
+def get_cached_key_pair():
+    try:
+        return _CACHE["keys"]
+    except KeyError:
+        _CACHE["keys"] = keys.get_key_pair()
+    return _CACHE["keys"]
+
+
 @registry.register
 class ActorFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
     public_key = None
@@ -111,11 +122,14 @@ class ActorFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
             o.domain.name, o.preferred_username
         )
     )
-    keys = factory.LazyFunction(keys.get_key_pair)
+    keys = factory.LazyFunction(get_cached_key_pair)
 
     class Meta:
         model = models.Actor
 
+    class Params:
+        with_real_keys = factory.Trait(keys=factory.LazyFunction(keys.get_key_pair),)
+
     @factory.post_generation
     def local(self, create, extracted, **kwargs):
         if not extracted and not kwargs:
diff --git a/api/funkwhale_api/music/factories.py b/api/funkwhale_api/music/factories.py
index 4247af3a29a9d3174448aa48a2b4870a80848251..8537c5c50922e8e7cda6c34ec6e9f55401b64cd9 100644
--- a/api/funkwhale_api/music/factories.py
+++ b/api/funkwhale_api/music/factories.py
@@ -64,7 +64,6 @@ class ArtistFactory(
     mbid = factory.Faker("uuid4")
     fid = factory.Faker("federation_url")
     playable = playable_factory("track__album__artist")
-    attachment_cover = factory.SubFactory(common_factories.AttachmentFactory)
 
     class Meta:
         model = "music.Artist"
@@ -74,6 +73,9 @@ class ArtistFactory(
             attributed_to=factory.SubFactory(federation_factories.ActorFactory)
         )
         local = factory.Trait(fid=factory.Faker("federation_url", local=True))
+        with_cover = factory.Trait(
+            attachment_cover=factory.SubFactory(common_factories.AttachmentFactory)
+        )
 
 
 @registry.register
@@ -83,7 +85,6 @@ class AlbumFactory(
     title = factory.Faker("sentence", nb_words=3)
     mbid = factory.Faker("uuid4")
     release_date = factory.Faker("date_object")
-    attachment_cover = factory.SubFactory(common_factories.AttachmentFactory)
     artist = factory.SubFactory(ArtistFactory)
     release_group_id = factory.Faker("uuid4")
     fid = factory.Faker("federation_url")
@@ -100,6 +101,9 @@ class AlbumFactory(
         local = factory.Trait(
             fid=factory.Faker("federation_url", local=True), artist__local=True
         )
+        with_cover = factory.Trait(
+            attachment_cover=factory.SubFactory(common_factories.AttachmentFactory)
+        )
 
 
 @registry.register
@@ -112,7 +116,6 @@ class TrackFactory(
     album = factory.SubFactory(AlbumFactory)
     position = 1
     playable = playable_factory("track")
-    attachment_cover = factory.SubFactory(common_factories.AttachmentFactory)
 
     class Meta:
         model = "music.Track"
@@ -125,6 +128,9 @@ class TrackFactory(
         local = factory.Trait(
             fid=factory.Faker("federation_url", local=True), album__local=True
         )
+        with_cover = factory.Trait(
+            attachment_cover=factory.SubFactory(common_factories.AttachmentFactory)
+        )
 
     @factory.post_generation
     def artist(self, created, extracted, **kwargs):
diff --git a/api/tests/audio/test_serializers.py b/api/tests/audio/test_serializers.py
index 5ddef7c29bf8bc11ca634eddc4888d3b6413fca7..3c29bdf458a0700dd8fa7c70042f143b23fe3cc8 100644
--- a/api/tests/audio/test_serializers.py
+++ b/api/tests/audio/test_serializers.py
@@ -290,6 +290,7 @@ def test_rss_item_serializer(factories):
         track__description=description,
         track__disc_number=4,
         track__position=42,
+        track__with_cover=True,
     )
     setattr(
         upload.track,
@@ -339,6 +340,7 @@ def test_rss_channel_serializer(factories):
         artist__set_tags=["pop", "rock"],
         artist__description=description,
         metadata=metadata,
+        artist__with_cover=True,
     )
     setattr(
         channel.artist,
diff --git a/api/tests/audio/test_spa_views.py b/api/tests/audio/test_spa_views.py
index ebce5d301aab2f69ecffb5193abdfce3990f7a6a..11a3e5f4e7dc6698700857032fd089437878a228 100644
--- a/api/tests/audio/test_spa_views.py
+++ b/api/tests/audio/test_spa_views.py
@@ -11,7 +11,9 @@ from funkwhale_api.music import serializers
 
 @pytest.mark.parametrize("attribute", ["uuid", "actor.full_username"])
 def test_channel_detail(attribute, spa_html, no_api_auth, client, factories, settings):
-    channel = factories["audio.Channel"](library__privacy_level="everyone")
+    channel = factories["audio.Channel"](
+        library__privacy_level="everyone", artist__with_cover=True
+    )
     factories["music.Upload"](playable=True, library=channel.library)
     url = "/channels/{}".format(utils.recursive_getattr(channel, attribute))
     detail_url = "/channels/{}".format(channel.actor.full_username)
@@ -77,7 +79,7 @@ def test_channel_detail(attribute, spa_html, no_api_auth, client, factories, set
 def test_oembed_channel(factories, no_api_auth, api_client, settings):
     settings.FUNKWHALE_URL = "http://test"
     settings.FUNKWHALE_EMBED_URL = "http://embed"
-    channel = factories["audio.Channel"]()
+    channel = factories["audio.Channel"](artist__with_cover=True)
     artist = channel.artist
     url = reverse("api:v1:oembed")
     obj_url = "https://test.com/channels/{}".format(channel.uuid)
diff --git a/api/tests/audio/test_views.py b/api/tests/audio/test_views.py
index b28b444165c1a5b519b7c5c8368bb7128a5eee77..ee037ec797c5e35a17669e9abf8a1ee2d6437aa5 100644
--- a/api/tests/audio/test_views.py
+++ b/api/tests/audio/test_views.py
@@ -55,7 +55,9 @@ def test_channel_create(logged_in_api_client):
     "field", ["uuid", "actor.preferred_username", "actor.full_username"],
 )
 def test_channel_detail(field, factories, logged_in_api_client):
-    channel = factories["audio.Channel"](artist__description=None, local=True)
+    channel = factories["audio.Channel"](
+        artist__description=None, local=True, artist__with_cover=True
+    )
 
     url = reverse(
         "api:v1:channels-detail",
@@ -74,7 +76,9 @@ def test_channel_detail(field, factories, logged_in_api_client):
 
 
 def test_channel_list(factories, logged_in_api_client):
-    channel = factories["audio.Channel"](artist__description=None)
+    channel = factories["audio.Channel"](
+        artist__description=None, artist__with_cover=True
+    )
     setattr(channel.artist, "_tracks_count", 0)
     setattr(channel.artist, "_prefetched_tagged_items", [])
     url = reverse("api:v1:channels-list")
@@ -216,7 +220,9 @@ def test_channel_unsubscribe(factories, logged_in_api_client):
 
 def test_subscriptions_list(factories, logged_in_api_client):
     actor = logged_in_api_client.user.create_actor()
-    channel = factories["audio.Channel"](artist__description=None)
+    channel = factories["audio.Channel"](
+        artist__description=None, artist__with_cover=True
+    )
     subscription = factories["audio.Subscription"](target=channel.actor, actor=actor)
     setattr(subscription.target.channel.artist, "_tracks_count", 0)
     setattr(subscription.target.channel.artist, "_prefetched_tagged_items", [])
diff --git a/api/tests/common/test_models.py b/api/tests/common/test_models.py
index 42992095fc606ce1d9a929d742d3f037abf34099..15cbe2dcc60ca1f6b3f5071c8e25e9342b86f4a7 100644
--- a/api/tests/common/test_models.py
+++ b/api/tests/common/test_models.py
@@ -64,7 +64,9 @@ def test_attachment(factories, now):
 @pytest.mark.parametrize("args, expected", [([], [0]), ([True], [0]), ([False], [1])])
 def test_attachment_queryset_attached(args, expected, factories, queryset_equal_list):
     attachments = [
-        factories["music.Album"](artist__attachment_cover=None).attachment_cover,
+        factories["music.Album"](
+            with_cover=True, artist__attachment_cover=None
+        ).attachment_cover,
         factories["common.Attachment"](),
     ]
 
diff --git a/api/tests/common/test_tasks.py b/api/tests/common/test_tasks.py
index cfb91470f3da90c7ca6c0b3f85cda9eda3a66c42..e35806847430e095812dc7293bd78737e2823c80 100644
--- a/api/tests/common/test_tasks.py
+++ b/api/tests/common/test_tasks.py
@@ -74,7 +74,7 @@ def test_prune_unattached_attachments(factories, settings, now):
     )
     attachments = [
         # attached, kept
-        factories["music.Album"]().attachment_cover,
+        factories["music.Album"](with_cover=True).attachment_cover,
         # recent, kept
         factories["common.Attachment"](),
         # too old, pruned
diff --git a/api/tests/common/test_utils.py b/api/tests/common/test_utils.py
index 5908c60bea127cbd9518c20015769a97c015bd2a..af2b25207413b2336527295652f8c55b3b102788 100644
--- a/api/tests/common/test_utils.py
+++ b/api/tests/common/test_utils.py
@@ -141,7 +141,7 @@ def test_render_html(text, content_type, permissive, expected):
 
 
 def test_attach_file_url(factories):
-    album = factories["music.Album"]()
+    album = factories["music.Album"](with_cover=True)
     existing_attachment = album.attachment_cover
     assert existing_attachment is not None
 
@@ -160,7 +160,7 @@ def test_attach_file_url(factories):
 
 
 def test_attach_file_url_fetch(factories, r_mock):
-    album = factories["music.Album"]()
+    album = factories["music.Album"](with_cover=True)
 
     data = {"mimetype": "image/jpeg", "url": "https://example.com/test.jpg"}
     r_mock.get(data["url"], body=io.BytesIO(b"content"))
diff --git a/api/tests/favorites/test_favorites.py b/api/tests/favorites/test_favorites.py
index 06a309e15ac1882ff895248d326d02960b6543f5..48d1857c62540fb1cef2a892c1386013085a7544 100644
--- a/api/tests/favorites/test_favorites.py
+++ b/api/tests/favorites/test_favorites.py
@@ -29,8 +29,6 @@ def test_user_can_get_his_favorites(
             favorite, context={"request": request}
         ).data
     ]
-    expected[0]["track"]["artist"].pop("cover")
-    expected[0]["track"]["album"]["artist"].pop("cover")
 
     assert response.status_code == 200
     assert response.data["results"] == expected
diff --git a/api/tests/federation/test_routes.py b/api/tests/federation/test_routes.py
index f63f82896d4559ae20e12088d70e5eabd1075672..1ce6499ecccbf34ee52bd0417c7c969f469974ad 100644
--- a/api/tests/federation/test_routes.py
+++ b/api/tests/federation/test_routes.py
@@ -321,7 +321,9 @@ def test_outbox_create_audio_channel(factories, mocker):
 
 def test_inbox_create_audio(factories, mocker):
     activity = factories["federation.Activity"]()
-    upload = factories["music.Upload"](bitrate=42, duration=55)
+    upload = factories["music.Upload"](
+        bitrate=42, duration=55, track__album__with_cover=True
+    )
     payload = {
         "@context": jsonld.get_default_context(),
         "type": "Create",
diff --git a/api/tests/federation/test_serializers.py b/api/tests/federation/test_serializers.py
index 538c43960fb9a48f22c164a51d94acf2dde52bb2..c77f9940dae33d3ae1b0e403d9134f73abc3a876 100644
--- a/api/tests/federation/test_serializers.py
+++ b/api/tests/federation/test_serializers.py
@@ -646,7 +646,7 @@ def test_music_library_serializer_from_ap_update(factories, mocker):
 def test_activity_pub_artist_serializer_to_ap(factories):
     content = factories["common.Content"]()
     artist = factories["music.Artist"](
-        description=content, attributed=True, set_tags=["Punk", "Rock"]
+        description=content, attributed=True, set_tags=["Punk", "Rock"], with_cover=True
     )
     expected = {
         "@context": jsonld.get_default_context(),
@@ -756,7 +756,7 @@ def test_activity_pub_artist_serializer_from_ap_update(factories, faker, now, mo
 def test_activity_pub_album_serializer_to_ap(factories):
     content = factories["common.Content"]()
     album = factories["music.Album"](
-        description=content, attributed=True, set_tags=["Punk", "Rock"]
+        description=content, attributed=True, set_tags=["Punk", "Rock"], with_cover=True
     )
 
     expected = {
@@ -886,6 +886,7 @@ def test_activity_pub_track_serializer_to_ap(factories):
         disc_number=3,
         attributed=True,
         set_tags=["Punk", "Rock"],
+        with_cover=True,
     )
     expected = {
         "@context": jsonld.get_default_context(),
@@ -1210,7 +1211,7 @@ def test_activity_pub_upload_serializer_from_ap(factories, mocker, r_mock):
 
 def test_activity_pub_upload_serializer_from_ap_update(factories, mocker, now, r_mock):
     library = factories["music.Library"]()
-    upload = factories["music.Upload"](library=library)
+    upload = factories["music.Upload"](library=library, track__album__with_cover=True)
 
     data = {
         "@context": jsonld.get_default_context(),
@@ -1393,7 +1394,9 @@ def test_track_serializer_update_license(factories):
 
 
 def test_channel_actor_serializer(factories):
-    channel = factories["audio.Channel"](actor__attachment_icon=None)
+    channel = factories["audio.Channel"](
+        actor__attachment_icon=None, artist__with_cover=True
+    )
 
     serializer = serializers.ActorSerializer(channel.actor)
     expected_url = [
diff --git a/api/tests/manage/test_serializers.py b/api/tests/manage/test_serializers.py
index 71f80bed0c8741f7e2fff3b11f285eadfd70b883..d2d00b058f849ee2d7d3bbc9fd4357a6b9ffc837 100644
--- a/api/tests/manage/test_serializers.py
+++ b/api/tests/manage/test_serializers.py
@@ -286,7 +286,7 @@ def test_instance_policy_serializer_purges_target_actor(
 
 
 def test_manage_artist_serializer(factories, now, to_api_date):
-    artist = factories["music.Artist"](attributed=True)
+    artist = factories["music.Artist"](attributed=True, with_cover=True)
     track = factories["music.Track"](artist=artist)
     album = factories["music.Album"](artist=artist)
     expected = {
@@ -331,7 +331,7 @@ def test_manage_nested_track_serializer(factories, now, to_api_date):
 
 
 def test_manage_nested_album_serializer(factories, now, to_api_date):
-    album = factories["music.Album"]()
+    album = factories["music.Album"](with_cover=True)
     setattr(album, "tracks_count", 44)
     expected = {
         "id": album.id,
@@ -367,7 +367,7 @@ def test_manage_nested_artist_serializer(factories, now, to_api_date):
 
 
 def test_manage_album_serializer(factories, now, to_api_date):
-    album = factories["music.Album"](attributed=True)
+    album = factories["music.Album"](attributed=True, with_cover=True)
     track = factories["music.Track"](album=album)
     expected = {
         "id": album.id,
@@ -392,7 +392,7 @@ def test_manage_album_serializer(factories, now, to_api_date):
 
 
 def test_manage_track_serializer(factories, now, to_api_date):
-    track = factories["music.Track"](attributed=True)
+    track = factories["music.Track"](attributed=True, with_cover=True)
     setattr(track, "uploads_count", 44)
     expected = {
         "id": track.id,
diff --git a/api/tests/music/test_mutations.py b/api/tests/music/test_mutations.py
index a0f6847697380e3c745c8491549ab24bfdaea0c0..14e71494c526ebc5409ed7e206ea6e824f92e464 100644
--- a/api/tests/music/test_mutations.py
+++ b/api/tests/music/test_mutations.py
@@ -182,7 +182,7 @@ def test_perm_checkers_can_approve(
 @pytest.mark.parametrize("factory_name", ["music.Artist", "music.Track", "music.Album"])
 def test_mutation_set_attachment_cover(factory_name, factories, now, mocker):
     new_attachment = factories["common.Attachment"](actor__local=True)
-    obj = factories[factory_name]()
+    obj = factories[factory_name](with_cover=True)
     old_attachment = obj.attachment_cover
     mutation = factories["common.Mutation"](
         type="update", target=obj, payload={"cover": new_attachment.uuid}
diff --git a/api/tests/music/test_serializers.py b/api/tests/music/test_serializers.py
index 60ecff579425b66863f2df391e1e83ca2725912f..5361950e1b0f5117fdf39d658b8f63d176f1a078 100644
--- a/api/tests/music/test_serializers.py
+++ b/api/tests/music/test_serializers.py
@@ -32,7 +32,7 @@ def test_license_serializer():
 
 
 def test_artist_album_serializer(factories, to_api_date):
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     album = track.album
     album = album.__class__.objects.with_tracks_count().get(pk=album.pk)
     expected = {
@@ -55,7 +55,9 @@ def test_artist_album_serializer(factories, to_api_date):
 
 def test_artist_with_albums_serializer(factories, to_api_date):
     actor = factories["federation.Actor"]()
-    track = factories["music.Track"](album__artist__attributed_to=actor)
+    track = factories["music.Track"](
+        album__artist__attributed_to=actor, album__artist__with_cover=True
+    )
     artist = track.artist
     artist = artist.__class__.objects.with_albums().get(pk=artist.pk)
     album = list(artist.albums.all())[0]
@@ -81,7 +83,7 @@ def test_artist_with_albums_serializer(factories, to_api_date):
 
 def test_artist_with_albums_serializer_channel(factories, to_api_date):
     actor = factories["federation.Actor"]()
-    channel = factories["audio.Channel"](attributed_to=actor)
+    channel = factories["audio.Channel"](attributed_to=actor, artist__with_cover=True)
     track = factories["music.Track"](album__artist=channel.artist)
     artist = track.artist
     artist = artist.__class__.objects.with_albums().get(pk=artist.pk)
@@ -195,7 +197,9 @@ def test_upload_owner_serializer(factories, to_api_date):
 
 def test_album_serializer(factories, to_api_date):
     actor = factories["federation.Actor"]()
-    track1 = factories["music.Track"](position=2, album__attributed_to=actor)
+    track1 = factories["music.Track"](
+        position=2, album__attributed_to=actor, album__with_cover=True
+    )
     track2 = factories["music.Track"](position=1, album=track1.album)
     album = track1.album
     expected = {
@@ -215,8 +219,6 @@ def test_album_serializer(factories, to_api_date):
     }
     serializer = serializers.AlbumSerializer(album)
 
-    for t in expected["tracks"]:
-        t["artist"].pop("cover")
     assert serializer.data == expected
 
 
@@ -236,6 +238,7 @@ def test_track_serializer(factories, to_api_date):
         track__copyright="test",
         track__disc_number=2,
         track__attributed_to=actor,
+        track__with_cover=True,
     )
     track = upload.track
     setattr(track, "playable_uploads", [upload])
diff --git a/api/tests/music/test_spa_views.py b/api/tests/music/test_spa_views.py
index ffb763a1b42e0e73b702f4c23849e517a949e099..9a3195f032a0e802d2bc47ad29d68b2fe89173f0 100644
--- a/api/tests/music/test_spa_views.py
+++ b/api/tests/music/test_spa_views.py
@@ -8,7 +8,10 @@ from funkwhale_api.music import serializers
 
 def test_library_track(spa_html, no_api_auth, client, factories, settings):
     upload = factories["music.Upload"](
-        playable=True, track__disc_number=1, track__attachment_cover=None
+        playable=True,
+        track__disc_number=1,
+        track__attachment_cover=None,
+        track__album__with_cover=True,
     )
     track = upload.track
     url = "/library/tracks/{}".format(track.pk)
@@ -93,7 +96,9 @@ def test_library_track(spa_html, no_api_auth, client, factories, settings):
 
 
 def test_library_album(spa_html, no_api_auth, client, factories, settings):
-    track = factories["music.Upload"](playable=True, track__disc_number=1).track
+    track = factories["music.Upload"](
+        playable=True, track__disc_number=1, track__album__with_cover=True
+    ).track
     album = track.album
     url = "/library/albums/{}".format(album.pk)
 
@@ -159,7 +164,7 @@ def test_library_album(spa_html, no_api_auth, client, factories, settings):
 
 
 def test_library_artist(spa_html, no_api_auth, client, factories, settings):
-    album = factories["music.Album"]()
+    album = factories["music.Album"](with_cover=True)
     factories["music.Upload"](playable=True, track__album=album)
     artist = album.artist
     url = "/library/artists/{}".format(artist.pk)
@@ -214,7 +219,9 @@ def test_library_artist(spa_html, no_api_auth, client, factories, settings):
 
 def test_library_playlist(spa_html, no_api_auth, client, factories, settings):
     playlist = factories["playlists.Playlist"](privacy_level="everyone")
-    track = factories["music.Upload"](playable=True).track
+    track = factories["music.Upload"](
+        playable=True, track__album__with_cover=True
+    ).track
     playlist.insert_many([track])
 
     url = "/library/playlists/{}".format(playlist.pk)
diff --git a/api/tests/music/test_tasks.py b/api/tests/music/test_tasks.py
index b9bb018b8a4ded4c62a4d59c746a50cc5fabbf43..4fbe6b5132ffab2b58fb932b632310a77841b186 100644
--- a/api/tests/music/test_tasks.py
+++ b/api/tests/music/test_tasks.py
@@ -379,7 +379,7 @@ def test_upload_import_get_audio_data(factories, mocker):
         "funkwhale_api.music.models.Upload.get_audio_data",
         return_value={"size": 23, "duration": 42, "bitrate": 66},
     )
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     upload = factories["music.Upload"](
         track=None, import_metadata={"funkwhale": {"track": {"uuid": track.uuid}}}
     )
@@ -459,7 +459,7 @@ def test_process_upload_picks_ignore_non_pending_uploads(import_status, factorie
 
 
 def test_upload_import_track_uuid(now, factories):
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     upload = factories["music.Upload"](
         track=None, import_metadata={"funkwhale": {"track": {"uuid": track.uuid}}}
     )
@@ -475,7 +475,7 @@ def test_upload_import_track_uuid(now, factories):
 
 def test_upload_import_skip_federation(now, factories, mocker):
     outbox = mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     upload = factories["music.Upload"](
         track=None,
         import_metadata={
@@ -493,7 +493,7 @@ def test_upload_import_skip_federation(now, factories, mocker):
 
 def test_upload_import_skip_broadcast(now, factories, mocker):
     group_send = mocker.patch("funkwhale_api.common.channels.group_send")
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     upload = factories["music.Upload"](
         library__actor__local=True,
         track=None,
@@ -792,6 +792,7 @@ def test_scan_page_fetches_page_and_creates_tracks(now, mocker, factories, r_moc
             bitrate=66,
             duration=99,
             library=scan.library,
+            track__album__with_cover=True,
         )
         for i in range(5)
     ]
@@ -1019,7 +1020,7 @@ def test_get_track_from_import_metadata_with_forced_values_album(
     factories, mocker, faker
 ):
     channel = factories["audio.Channel"]()
-    album = factories["music.Album"](artist=channel.artist)
+    album = factories["music.Album"](artist=channel.artist, with_cover=True)
 
     forced_values = {
         "title": "Real title",
@@ -1088,7 +1089,7 @@ def test_process_channel_upload_forces_artist_and_attributed_to(
 
 
 def test_process_upload_uses_import_metadata_if_valid(factories, mocker):
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     import_metadata = {"title": "hello", "funkwhale": {"foo": "bar"}}
     upload = factories["music.Upload"](track=None, import_metadata=import_metadata)
     get_track_from_import_metadata = mocker.patch.object(
@@ -1113,7 +1114,7 @@ def test_process_upload_uses_import_metadata_if_valid(factories, mocker):
 
 
 def test_process_upload_skips_import_metadata_if_invalid(factories, mocker):
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     import_metadata = {"title": None, "funkwhale": {"foo": "bar"}}
     upload = factories["music.Upload"](track=None, import_metadata=import_metadata)
     get_track_from_import_metadata = mocker.patch.object(
diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py
index 87590cb90d77e65f43d569b3afc1ae093fc0b3ca..b0bbc164f5ae08380c9f2a49f081303424fdb0ba 100644
--- a/api/tests/music/test_views.py
+++ b/api/tests/music/test_views.py
@@ -979,7 +979,7 @@ def test_detail_license(api_client, preferences):
 def test_oembed_track(factories, no_api_auth, api_client, settings):
     settings.FUNKWHALE_URL = "http://test"
     settings.FUNKWHALE_EMBED_URL = "http://embed"
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     url = reverse("api:v1:oembed")
     track_url = "https://test.com/library/tracks/{}".format(track.pk)
     iframe_src = "http://embed?type=track&id={}".format(track.pk)
@@ -1014,7 +1014,7 @@ def test_oembed_track(factories, no_api_auth, api_client, settings):
 def test_oembed_album(factories, no_api_auth, api_client, settings):
     settings.FUNKWHALE_URL = "http://test"
     settings.FUNKWHALE_EMBED_URL = "http://embed"
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     album = track.album
     url = reverse("api:v1:oembed")
     album_url = "https://test.com/library/albums/{}".format(album.pk)
@@ -1050,7 +1050,7 @@ def test_oembed_album(factories, no_api_auth, api_client, settings):
 def test_oembed_artist(factories, no_api_auth, api_client, settings):
     settings.FUNKWHALE_URL = "http://test"
     settings.FUNKWHALE_EMBED_URL = "http://embed"
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     album = track.album
     artist = track.artist
     url = reverse("api:v1:oembed")
@@ -1088,7 +1088,9 @@ def test_oembed_playlist(factories, no_api_auth, api_client, settings):
     settings.FUNKWHALE_URL = "http://test"
     settings.FUNKWHALE_EMBED_URL = "http://embed"
     playlist = factories["playlists.Playlist"](privacy_level="everyone")
-    track = factories["music.Upload"](playable=True).track
+    track = factories["music.Upload"](
+        playable=True, track__album__with_cover=True
+    ).track
     playlist.insert_many([track])
     url = reverse("api:v1:oembed")
     playlist_url = "https://test.com/library/playlists/{}".format(playlist.pk)
@@ -1307,12 +1309,6 @@ def test_search_get(use_fts, settings, logged_in_api_client, factories):
         "tracks": [serializers.TrackSerializer(track).data],
         "tags": [views.TagSerializer(tag).data],
     }
-    for album in expected["albums"]:
-        album["artist"].pop("cover")
-
-    for track in expected["tracks"]:
-        track["artist"].pop("cover")
-        track["album"]["artist"].pop("cover")
 
     response = logged_in_api_client.get(url, {"q": "foo"})
 
@@ -1380,7 +1376,7 @@ def test_detail_includes_description_key(
 
 def test_channel_owner_can_create_album(factories, logged_in_api_client):
     actor = logged_in_api_client.user.create_actor()
-    channel = factories["audio.Channel"](attributed_to=actor)
+    channel = factories["audio.Channel"](attributed_to=actor, artist__with_cover=True)
     attachment = factories["common.Attachment"](actor=actor)
     url = reverse("api:v1:albums-list")
 
diff --git a/api/tests/playlists/test_serializers.py b/api/tests/playlists/test_serializers.py
index 79105d3ccf48bf06174e8d697fca18d25ad4a1fa..ef89ea584a3877553fec0e01dadd20c201ed942c 100644
--- a/api/tests/playlists/test_serializers.py
+++ b/api/tests/playlists/test_serializers.py
@@ -93,13 +93,13 @@ def test_update_insert_is_called_with_duplicate_override_when_duplicates_allowed
 
 def test_playlist_serializer_include_covers(factories, api_request):
     playlist = factories["playlists.Playlist"]()
-    t1 = factories["music.Track"]()
-    t2 = factories["music.Track"]()
+    t1 = factories["music.Track"](album__with_cover=True)
+    t2 = factories["music.Track"](album__with_cover=True)
     t3 = factories["music.Track"](album__attachment_cover=None)
-    t4 = factories["music.Track"]()
-    t5 = factories["music.Track"]()
-    t6 = factories["music.Track"]()
-    t7 = factories["music.Track"]()
+    t4 = factories["music.Track"](album__with_cover=True)
+    t5 = factories["music.Track"](album__with_cover=True)
+    t6 = factories["music.Track"](album__with_cover=True)
+    t7 = factories["music.Track"](album__with_cover=True)
 
     playlist.insert_many([t1, t2, t3, t4, t5, t6, t7])
     request = api_request.get("/")
diff --git a/api/tests/playlists/test_views.py b/api/tests/playlists/test_views.py
index 1b7fca928da379fc946bcb114836a556fb0a7ff2..2be64b2bb864ef4b4fbbb5bb98ede9fd25b9ac7a 100644
--- a/api/tests/playlists/test_views.py
+++ b/api/tests/playlists/test_views.py
@@ -157,8 +157,6 @@ def test_can_list_tracks_from_playlist(level, factories, logged_in_api_client):
     url = reverse("api:v1:playlists-tracks", kwargs={"pk": plt.playlist.pk})
     response = logged_in_api_client.get(url)
     serialized_plt = serializers.PlaylistTrackSerializer(plt).data
-    serialized_plt["track"]["artist"].pop("cover")
-    serialized_plt["track"]["album"]["artist"].pop("cover")
 
     assert response.data["count"] == 1
     assert response.data["results"][0] == serialized_plt
diff --git a/api/tests/radios/test_api.py b/api/tests/radios/test_api.py
index 0b0ee618231b61cfcca707765974321705840ef0..5b0df2ea43ef1a4e647d88549f1626baecc592f6 100644
--- a/api/tests/radios/test_api.py
+++ b/api/tests/radios/test_api.py
@@ -36,8 +36,6 @@ def test_can_validate_config(logged_in_api_client, factories):
         "count": candidates.count(),
         "sample": TrackSerializer(candidates, many=True).data,
     }
-    for s in expected["sample"]:
-        s["artist"].pop("cover")
 
     assert payload["filters"][0]["candidates"] == expected
     assert payload["filters"][0]["errors"] == []
diff --git a/api/tests/subsonic/test_serializers.py b/api/tests/subsonic/test_serializers.py
index 14495ec9554e5b0a82873e4415282241eabd45ce..3e568bb9fb334a60ee18ac336d2af0aaa42a01a9 100644
--- a/api/tests/subsonic/test_serializers.py
+++ b/api/tests/subsonic/test_serializers.py
@@ -101,7 +101,7 @@ def test_get_artists_serializer(factories):
 
 def test_get_artist_serializer(factories):
     artist = factories["music.Artist"]()
-    album = factories["music.Album"](artist=artist)
+    album = factories["music.Album"](artist=artist, with_cover=True)
     tracks = factories["music.Track"].create_batch(size=3, album=album)
 
     expected = {
@@ -148,7 +148,7 @@ def test_get_track_data_content_type(mimetype, extension, expected, factories):
 
 def test_get_album_serializer(factories):
     artist = factories["music.Artist"]()
-    album = factories["music.Album"](artist=artist)
+    album = factories["music.Album"](artist=artist, with_cover=True)
     track = factories["music.Track"](album=album, disc_number=42)
     upload = factories["music.Upload"](track=track, bitrate=42000, duration=43, size=44)
 
@@ -306,7 +306,9 @@ def test_scrobble_serializer(factories):
 
 def test_channel_serializer(factories):
     description = factories["common.Content"]()
-    channel = factories["audio.Channel"](external=True, artist__description=description)
+    channel = factories["audio.Channel"](
+        external=True, artist__description=description, artist__with_cover=True
+    )
     upload = factories["music.Upload"](
         playable=True, library=channel.library, duration=42
     )
@@ -328,7 +330,9 @@ def test_channel_serializer(factories):
 def test_channel_episode_serializer(factories):
     description = factories["common.Content"]()
     channel = factories["audio.Channel"]()
-    track = factories["music.Track"](description=description, artist=channel.artist)
+    track = factories["music.Track"](
+        description=description, artist=channel.artist, with_cover=True
+    )
     upload = factories["music.Upload"](
         playable=True, track=track, bitrate=128000, duration=42
     )
diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py
index 8b576e1e212110bddb76b41a44117cebac21e946..3c9bae5f1919c5288663da746a9e1a352bffa33c 100644
--- a/api/tests/subsonic/test_views.py
+++ b/api/tests/subsonic/test_views.py
@@ -721,7 +721,7 @@ def test_get_indexes(
 def test_get_cover_art_album(factories, logged_in_api_client):
     url = reverse("api:subsonic-get_cover_art")
     assert url.endswith("getCoverArt") is True
-    album = factories["music.Album"]()
+    album = factories["music.Album"](with_cover=True)
     response = logged_in_api_client.get(url, {"id": "al-{}".format(album.pk)})
 
     assert response.status_code == 200