diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/AlbumsRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/AlbumsRepository.kt
index b335a32905f0987f24d457f512b342b2582b219b..7d81ed4d5fa58dd1bd9978582ebe38dcb63e6a96 100644
--- a/app/src/main/java/audio/funkwhale/ffa/repositories/AlbumsRepository.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/repositories/AlbumsRepository.kt
@@ -5,7 +5,7 @@ import audio.funkwhale.ffa.model.Album
 import audio.funkwhale.ffa.model.AlbumsCache
 import audio.funkwhale.ffa.model.AlbumsResponse
 import audio.funkwhale.ffa.utils.OAuth
-import com.github.kittinunf.fuel.gson.gsonDeserializerOf
+import audio.funkwhale.ffa.utils.gsonDeserializerOf
 import com.google.gson.reflect.TypeToken
 import org.koin.java.KoinJavaComponent.inject
 
diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/ArtistTracksRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/ArtistTracksRepository.kt
index d4b420ca660d46d111699f78bcb67e61963cd5cd..e1e155f1dc22d07a826c232e4f32506b418e2fb0 100644
--- a/app/src/main/java/audio/funkwhale/ffa/repositories/ArtistTracksRepository.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/repositories/ArtistTracksRepository.kt
@@ -6,7 +6,7 @@ import audio.funkwhale.ffa.model.Track
 import audio.funkwhale.ffa.model.TracksCache
 import audio.funkwhale.ffa.model.TracksResponse
 import audio.funkwhale.ffa.utils.OAuth
-import com.github.kittinunf.fuel.gson.gsonDeserializerOf
+import audio.funkwhale.ffa.utils.gsonDeserializerOf
 import com.google.gson.reflect.TypeToken
 import org.koin.java.KoinJavaComponent.inject
 
diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/ArtistsRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/ArtistsRepository.kt
index ecb5aef183f92ba281d7cdc8408dcf0817c8e173..f232a5170bc652c69ea4d2b9064768edc16da02a 100644
--- a/app/src/main/java/audio/funkwhale/ffa/repositories/ArtistsRepository.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/repositories/ArtistsRepository.kt
@@ -6,10 +6,9 @@ import audio.funkwhale.ffa.model.ArtistsCache
 import audio.funkwhale.ffa.model.ArtistsResponse
 import audio.funkwhale.ffa.model.FFAResponse
 import audio.funkwhale.ffa.utils.OAuth
-import com.github.kittinunf.fuel.gson.gsonDeserializerOf
+import audio.funkwhale.ffa.utils.gsonDeserializerOf
 import com.google.gson.reflect.TypeToken
 import org.koin.java.KoinJavaComponent.inject
-import java.io.BufferedReader
 
 class ArtistsRepository(override val context: Context?) : Repository<Artist, ArtistsCache>() {
 
diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/FavoritesRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/FavoritesRepository.kt
index 3f7b34e4fb5d162e33e15ac4677fcd21e7a1af16..0100b9579f43b8ff70916cb6eb662964691f75cf 100644
--- a/app/src/main/java/audio/funkwhale/ffa/repositories/FavoritesRepository.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/repositories/FavoritesRepository.kt
@@ -1,22 +1,10 @@
 package audio.funkwhale.ffa.repositories
 
 import android.content.Context
-import audio.funkwhale.ffa.model.FFAResponse
-import audio.funkwhale.ffa.model.FavoritedCache
-import audio.funkwhale.ffa.model.FavoritedResponse
-import audio.funkwhale.ffa.model.Track
-import audio.funkwhale.ffa.model.TracksCache
-import audio.funkwhale.ffa.model.TracksResponse
-import audio.funkwhale.ffa.utils.FFACache
-import audio.funkwhale.ffa.utils.OAuth
-import audio.funkwhale.ffa.utils.Settings
-import audio.funkwhale.ffa.utils.authorize
-import audio.funkwhale.ffa.utils.maybeNormalizeUrl
-import audio.funkwhale.ffa.utils.mustNormalizeUrl
-import audio.funkwhale.ffa.utils.untilNetwork
+import audio.funkwhale.ffa.model.*
+import audio.funkwhale.ffa.utils.*
 import com.github.kittinunf.fuel.Fuel
 import com.github.kittinunf.fuel.coroutines.awaitByteArrayResponseResult
-import com.github.kittinunf.fuel.gson.gsonDeserializerOf
 import com.google.android.exoplayer2.offline.DownloadManager
 import com.google.android.exoplayer2.upstream.cache.Cache
 import com.google.gson.Gson
@@ -27,7 +15,6 @@ import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import org.koin.core.qualifier.named
 import org.koin.java.KoinJavaComponent.inject
-import java.io.BufferedReader
 
 class FavoritesRepository(override val context: Context?) : Repository<Track, TracksCache>() {
 
diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/PlaylistTracksRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/PlaylistTracksRepository.kt
index c0a64303af0806d082c75a0fc7b3955cbabeb239..8e53ea04d8ccc65dcb1844d2db0ce76fb7c422ac 100644
--- a/app/src/main/java/audio/funkwhale/ffa/repositories/PlaylistTracksRepository.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/repositories/PlaylistTracksRepository.kt
@@ -6,13 +6,12 @@ import audio.funkwhale.ffa.model.PlaylistTrack
 import audio.funkwhale.ffa.model.PlaylistTracksCache
 import audio.funkwhale.ffa.model.PlaylistTracksResponse
 import audio.funkwhale.ffa.utils.OAuth
-import com.github.kittinunf.fuel.gson.gsonDeserializerOf
+import audio.funkwhale.ffa.utils.gsonDeserializerOf
 import com.google.gson.reflect.TypeToken
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.toList
 import kotlinx.coroutines.runBlocking
 import org.koin.java.KoinJavaComponent.inject
-import java.io.BufferedReader
 
 class PlaylistTracksRepository(override val context: Context?, playlistId: Int) :
   Repository<PlaylistTrack, PlaylistTracksCache>() {
diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/PlaylistsRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/PlaylistsRepository.kt
index 519f1855810145f7d6866c12db9e4184881a592f..8ec5a0fd39d7a742807c89cc25d4d71c02f1b38f 100644
--- a/app/src/main/java/audio/funkwhale/ffa/repositories/PlaylistsRepository.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/repositories/PlaylistsRepository.kt
@@ -1,25 +1,16 @@
 package audio.funkwhale.ffa.repositories
 
 import android.content.Context
-import audio.funkwhale.ffa.model.FFAResponse
-import audio.funkwhale.ffa.model.Playlist
-import audio.funkwhale.ffa.model.PlaylistsCache
-import audio.funkwhale.ffa.model.PlaylistsResponse
-import audio.funkwhale.ffa.model.Track
-import audio.funkwhale.ffa.utils.OAuth
-import audio.funkwhale.ffa.utils.Settings
-import audio.funkwhale.ffa.utils.authorize
-import audio.funkwhale.ffa.utils.mustNormalizeUrl
+import audio.funkwhale.ffa.model.*
+import audio.funkwhale.ffa.utils.*
 import com.github.kittinunf.fuel.Fuel
 import com.github.kittinunf.fuel.coroutines.awaitByteArrayResponseResult
 import com.github.kittinunf.fuel.coroutines.awaitObjectResponseResult
-import com.github.kittinunf.fuel.gson.gsonDeserializerOf
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import org.koin.java.KoinJavaComponent.inject
-import java.io.BufferedReader
 
 data class PlaylistAdd(val tracks: List<Int>, val allow_duplicates: Boolean)
 
diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/RadiosRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/RadiosRepository.kt
index 142af555b55224cce9e632e349f0e152b4faa083..7e398d1923185239bae2a13e1eba39a0068fbfb6 100644
--- a/app/src/main/java/audio/funkwhale/ffa/repositories/RadiosRepository.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/repositories/RadiosRepository.kt
@@ -6,10 +6,9 @@ import audio.funkwhale.ffa.model.Radio
 import audio.funkwhale.ffa.model.RadiosCache
 import audio.funkwhale.ffa.model.RadiosResponse
 import audio.funkwhale.ffa.utils.OAuth
-import com.github.kittinunf.fuel.gson.gsonDeserializerOf
+import audio.funkwhale.ffa.utils.gsonDeserializerOf
 import com.google.gson.reflect.TypeToken
 import org.koin.java.KoinJavaComponent.inject
-import java.io.BufferedReader
 
 class RadiosRepository(override val context: Context?) : Repository<Radio, RadiosCache>() {
 
diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/SearchRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/SearchRepository.kt
index 17a0873da62dd0b6526fd44e7524cd3c33c94b78..bb4d46b5894c4b4e5fc3989b33c54dee5c26dcbc 100644
--- a/app/src/main/java/audio/funkwhale/ffa/repositories/SearchRepository.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/repositories/SearchRepository.kt
@@ -1,18 +1,10 @@
 package audio.funkwhale.ffa.repositories
 
 import android.content.Context
-import audio.funkwhale.ffa.model.Album
-import audio.funkwhale.ffa.model.AlbumsCache
-import audio.funkwhale.ffa.model.AlbumsResponse
-import audio.funkwhale.ffa.model.Artist
-import audio.funkwhale.ffa.model.ArtistsCache
-import audio.funkwhale.ffa.model.ArtistsResponse
-import audio.funkwhale.ffa.model.Track
-import audio.funkwhale.ffa.model.TracksCache
-import audio.funkwhale.ffa.model.TracksResponse
+import audio.funkwhale.ffa.model.*
 import audio.funkwhale.ffa.utils.OAuth
+import audio.funkwhale.ffa.utils.gsonDeserializerOf
 import audio.funkwhale.ffa.utils.mustNormalizeUrl
-import com.github.kittinunf.fuel.gson.gsonDeserializerOf
 import com.google.android.exoplayer2.offline.DownloadManager
 import com.google.android.exoplayer2.upstream.cache.Cache
 import com.google.gson.reflect.TypeToken
@@ -21,7 +13,6 @@ import kotlinx.coroutines.flow.toList
 import kotlinx.coroutines.runBlocking
 import org.koin.core.qualifier.named
 import org.koin.java.KoinJavaComponent.inject
-import java.io.BufferedReader
 
 class TracksSearchRepository(override val context: Context?, var query: String) :
   Repository<Track, TracksCache>() {
diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt
index 4ae67f483f94e969c1f6d95ad3801c0007a046e9..6e14eef5aeea89e0b94b50a7415a9dcbf77ea364 100644
--- a/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt
@@ -7,8 +7,8 @@ import audio.funkwhale.ffa.model.TracksCache
 import audio.funkwhale.ffa.model.TracksResponse
 import audio.funkwhale.ffa.utils.OAuth
 import audio.funkwhale.ffa.utils.getMetadata
+import audio.funkwhale.ffa.utils.gsonDeserializerOf
 import audio.funkwhale.ffa.utils.mustNormalizeUrl
-import com.github.kittinunf.fuel.gson.gsonDeserializerOf
 import com.google.android.exoplayer2.offline.Download
 import com.google.android.exoplayer2.offline.DownloadManager
 import com.google.android.exoplayer2.upstream.cache.Cache
@@ -18,7 +18,6 @@ import kotlinx.coroutines.flow.toList
 import kotlinx.coroutines.runBlocking
 import org.koin.core.qualifier.named
 import org.koin.java.KoinJavaComponent.inject
-import java.io.BufferedReader
 
 class TracksRepository(override val context: Context?, albumId: Int) :
   Repository<Track, TracksCache>() {
diff --git a/app/src/main/java/audio/funkwhale/ffa/utils/Extensions.kt b/app/src/main/java/audio/funkwhale/ffa/utils/Extensions.kt
index af35567b74d9c0490cd5b8b53e59865790f6b5f2..0ea41df547fbd3b57c04faa48f3ec746a7bb8260 100644
--- a/app/src/main/java/audio/funkwhale/ffa/utils/Extensions.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/utils/Extensions.kt
@@ -10,20 +10,22 @@ import audio.funkwhale.ffa.model.DownloadInfo
 import audio.funkwhale.ffa.repositories.Repository
 import com.github.kittinunf.fuel.core.FuelError
 import com.github.kittinunf.fuel.core.Request
+import com.github.kittinunf.fuel.core.ResponseDeserializable
 import com.google.android.exoplayer2.offline.Download
 import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
 import com.squareup.picasso.Picasso
 import com.squareup.picasso.RequestCreator
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers.Main
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import net.openid.appauth.ClientSecretPost
+import java.io.Reader
 import java.text.SimpleDateFormat
-import java.util.Date
+import java.util.*
 import kotlin.coroutines.CoroutineContext
 
 inline fun <D> Flow<Repository.Response<D>>.untilNetwork(
@@ -113,3 +115,15 @@ val ISO_8601_DATE_TIME_FORMAT = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
 fun Date.format(): String {
   return ISO_8601_DATE_TIME_FORMAT.format(this)
 }
+
+inline fun <reified T : Any> gsonDeserializerOf(clazz: Class<T>) = gsonDeserializer<T>()
+
+inline fun <reified T : Any> gsonDeserializer(gson: Gson = Gson()) = object :
+  ResponseDeserializable<T> {
+
+  override fun deserialize(content: String): T? =
+    gson.fromJson<T>(content, object : TypeToken<T>() {}.type)
+
+  override fun deserialize(reader: Reader): T? =
+    gson.fromJson<T>(reader, object : TypeToken<T>() {}.type)
+}