From 58ff3e099d1f45906f94a697f28a15f078e11d1f Mon Sep 17 00:00:00 2001
From: Duncan McNamara <dcn.mcnamara@gmail.com>
Date: Wed, 26 Jun 2019 18:30:50 +0200
Subject: [PATCH] Medialibrary: rename AClasses into AbstractClasses

---
 medialibrary/jni/medialibrary.cpp             | 192 ++++++------
 .../medialibrary/MLServiceLocator.java        |  74 ++---
 .../videolan/medialibrary/Medialibrary.java   | 241 ++++++++-------
 .../src/org/videolan/medialibrary/Tools.java  |  12 +-
 ...library.java => AbstractMedialibrary.java} | 126 ++++----
 .../medialibrary/interfaces/media/AGenre.java |  54 ----
 .../media/{AAlbum.java => AbstractAlbum.java} |  38 +--
 .../{AArtist.java => AbstractArtist.java}     |  44 +--
 .../{AFolder.java => AbstractFolder.java}     |  26 +-
 .../interfaces/media/AbstractGenre.java       |  54 ++++
 ...Wrapper.java => AbstractMediaWrapper.java} |  46 +--
 .../{APlaylist.java => AbstractPlaylist.java} |  24 +-
 .../videolan/medialibrary/media/Album.java    |  44 +--
 .../videolan/medialibrary/media/Artist.java   |  74 ++---
 .../medialibrary/media/DummyItem.java         |   8 +-
 .../videolan/medialibrary/media/Folder.java   |  44 +--
 .../videolan/medialibrary/media/Genre.java    |  90 +++---
 .../medialibrary/media/HistoryItem.java       |  12 +-
 .../medialibrary/media/MediaLibraryItem.java  |   6 +-
 .../medialibrary/media/MediaWrapper.java      |  36 ++-
 .../videolan/medialibrary/media/Playlist.java |  66 ++--
 .../medialibrary/media/SearchAggregate.java   |  48 +--
 .../videolan/medialibrary/media/Storage.java  |   8 +-
 .../medialibrary/stubs/StubAlbum.java         |  34 +--
 .../medialibrary/stubs/StubArtist.java        |  52 ++--
 .../medialibrary/stubs/StubDataSource.java    | 148 ++++-----
 .../medialibrary/stubs/StubFolder.java        |  44 +--
 .../medialibrary/stubs/StubGenre.java         |  70 ++---
 .../medialibrary/stubs/StubMediaWrapper.java  |   4 +-
 .../medialibrary/stubs/StubMedialibrary.java  | 286 +++++++++---------
 .../medialibrary/stubs/StubPlaylist.java      |  32 +-
 vlc-android/res/layout/folder_item.xml        |   2 +-
 vlc-android/res/layout/history_item.xml       |   4 +-
 vlc-android/res/layout/playlist_item.xml      |   2 +-
 .../res/layout/tv_simple_list_item.xml        |   2 +-
 vlc-android/res/layout/video_grid_card.xml    |   2 +-
 vlc-android/res/layout/video_list_card.xml    |   2 +-
 .../org/videolan/vlc/MediaParsingService.kt   |  24 +-
 .../org/videolan/vlc/MediaSessionCallback.kt  |   4 +-
 .../src/org/videolan/vlc/PlaybackService.kt   |  37 ++-
 .../videolan/vlc/RecommendationsService.kt    |   6 +-
 .../src/org/videolan/vlc/StoragesMonitor.kt   |   4 +-
 .../src/org/videolan/vlc/VLCApplication.kt    |   6 +-
 .../extensions/ExtensionManagerService.java   |   4 +-
 .../org/videolan/vlc/extensions/Utils.java    |   6 +-
 .../vlc/gui/AudioPlayerContainerActivity.kt   |   8 +-
 .../org/videolan/vlc/gui/DialogActivity.kt    |   4 +-
 .../org/videolan/vlc/gui/HistoryAdapter.kt    |   6 +-
 .../org/videolan/vlc/gui/HistoryFragment.kt   |  10 +-
 .../src/org/videolan/vlc/gui/InfoActivity.kt  |  22 +-
 .../src/org/videolan/vlc/gui/MainActivity.kt  |   4 +-
 .../org/videolan/vlc/gui/PlaylistActivity.kt  |  27 +-
 .../org/videolan/vlc/gui/PlaylistFragment.kt  |   4 +-
 .../org/videolan/vlc/gui/SearchActivity.kt    |   4 +-
 .../vlc/gui/audio/AudioAlbumsSongsFragment.kt |   8 +-
 .../vlc/gui/audio/AudioBrowserFragment.kt     |   6 +-
 .../org/videolan/vlc/gui/audio/AudioPlayer.kt |  10 +-
 .../vlc/gui/audio/BaseAudioBrowser.kt         |   8 +-
 .../videolan/vlc/gui/audio/PlaylistAdapter.kt |  14 +-
 .../vlc/gui/browser/BaseBrowserAdapter.kt     |  22 +-
 .../vlc/gui/browser/BaseBrowserFragment.kt    |  61 ++--
 .../vlc/gui/browser/ExtensionAdapter.kt       |  16 +-
 .../vlc/gui/browser/ExtensionBrowser.kt       |   6 +-
 .../vlc/gui/browser/FileBrowserFragment.kt    |  10 +-
 .../vlc/gui/browser/FilePickerAdapter.kt      |   4 +-
 .../vlc/gui/browser/FilePickerFragment.kt     |  10 +-
 .../vlc/gui/browser/MediaBrowserFragment.kt   |  34 +--
 .../vlc/gui/browser/NetworkBrowserFragment.kt |   6 +-
 .../videolan/vlc/gui/browser/PathAdapter.kt   |   4 +-
 .../vlc/gui/browser/StorageBrowserAdapter.kt  |   4 +-
 .../vlc/gui/browser/StorageBrowserFragment.kt |   8 +-
 .../vlc/gui/dialogs/NetworkServerDialog.kt    |   4 +-
 .../vlc/gui/dialogs/SavePlaylistDialog.kt     |  20 +-
 .../vlc/gui/folders/FoldersAdapter.kt         |  16 +-
 .../vlc/gui/folders/FoldersFragment.kt        |   8 +-
 .../org/videolan/vlc/gui/helpers/AudioUtil.kt |  20 +-
 .../videolan/vlc/gui/helpers/BitmapUtil.kt    |   8 +-
 .../videolan/vlc/gui/helpers/ImageLoader.kt   |  14 +-
 .../vlc/gui/helpers/MediaComparators.kt       |   4 +-
 .../vlc/gui/helpers/PlayerOptionsDelegate.kt  |   2 +-
 .../org/videolan/vlc/gui/helpers/UiTools.kt   |  48 +--
 .../videolan/vlc/gui/helpers/hf/OtgAccess.kt  |  14 +-
 .../videolan/vlc/gui/network/MRLAdapter.kt    |  10 +-
 .../vlc/gui/network/MRLPanelFragment.kt       |  10 +-
 .../gui/preferences/PreferencesAdvanced.kt    |   6 +-
 .../org/videolan/vlc/gui/tv/CardPresenter.kt  |  24 +-
 .../videolan/vlc/gui/tv/FileTvItemAdapter.kt  |  14 +-
 .../org/videolan/vlc/gui/tv/MainTvActivity.kt |   6 +-
 .../org/videolan/vlc/gui/tv/MainTvFragment.kt |  13 +-
 .../videolan/vlc/gui/tv/MediaHeaderAdapter.kt |  10 +-
 .../vlc/gui/tv/MediaItemDetailsFragment.kt    |  14 +-
 .../videolan/vlc/gui/tv/MediaTvItemAdapter.kt |   6 +-
 .../org/videolan/vlc/gui/tv/SearchFragment.kt |  16 +-
 .../src/org/videolan/vlc/gui/tv/TvUtil.kt     |  68 ++---
 .../gui/tv/audioplayer/AudioPlayerActivity.kt |  10 +-
 .../vlc/gui/tv/audioplayer/PlaylistAdapter.kt |   4 +-
 .../gui/tv/browser/BaseBrowserTvFragment.kt   |  24 +-
 .../vlc/gui/tv/browser/BaseTvActivity.kt      |   6 +-
 .../vlc/gui/tv/browser/CategoriesFragment.kt  |   8 +-
 .../tv/browser/DirectoryBrowserFragment.kt    |   4 +-
 .../gui/tv/browser/FileBrowserTvFragment.kt   |  16 +-
 .../gui/tv/browser/MediaBrowserTvFragment.kt  |   8 +-
 .../gui/tv/browser/NetworkBrowserFragment.kt  |   4 +-
 .../gui/tv/browser/VerticalGridActivity.kt    |   4 +-
 .../videolan/vlc/gui/video/PopupManager.kt    |   4 +-
 .../vlc/gui/video/VideoGridFragment.kt        |  38 +--
 .../vlc/gui/video/VideoListAdapter.kt         |  30 +-
 .../vlc/gui/video/VideoPlayerActivity.kt      |  50 +--
 .../org/videolan/vlc/interfaces/Sortable.kt   |  12 +-
 .../vlc/media/MediaSessionBrowser.java        |  26 +-
 .../src/org/videolan/vlc/media/MediaUtils.kt  |  74 ++---
 .../videolan/vlc/media/MediaWrapperList.kt    |  30 +-
 .../videolan/vlc/media/PlayerController.kt    |   7 +-
 .../org/videolan/vlc/media/PlaylistManager.kt |  90 +++---
 .../videolan/vlc/providers/BrowserProvider.kt |  30 +-
 .../vlc/providers/FileBrowserProvider.kt      |  14 +-
 .../vlc/providers/FilePickerProvider.kt       |   4 +-
 .../videolan/vlc/providers/NetworkProvider.kt |   8 +-
 .../videolan/vlc/providers/StorageProvider.kt |   4 +-
 .../providers/medialibrary/AlbumsProvider.kt  |  36 +--
 .../providers/medialibrary/ArtistsProvider.kt |   8 +-
 .../providers/medialibrary/FoldersProvider.kt |   8 +-
 .../providers/medialibrary/GenresProvider.kt  |   8 +-
 .../medialibrary/MedialibraryProvider.kt      |   8 +-
 .../medialibrary/PlaylistsProvider.kt         |   8 +-
 .../providers/medialibrary/TracksProvider.kt  |  52 ++--
 .../providers/medialibrary/VideosProvider.kt  |  20 +-
 .../vlc/repository/BrowserFavRepository.kt    |   8 +-
 .../vlc/repository/DirectoryRepository.kt     |   8 +-
 .../vlc/repository/SlaveRepository.kt         |   4 +-
 .../src/org/videolan/vlc/util/Browserutils.kt |   6 +-
 .../src/org/videolan/vlc/util/FileUtils.kt    |   4 +-
 .../org/videolan/vlc/util/FilterDelegate.kt   |   8 +-
 .../src/org/videolan/vlc/util/Kextensions.kt  |  26 +-
 .../src/org/videolan/vlc/util/ModelsHelper.kt | 116 +++----
 .../videolan/vlc/util/ThumbnailsProvider.kt   |  37 ++-
 .../src/org/videolan/vlc/util/TvChannels.kt   |   6 +-
 vlc-android/src/org/videolan/vlc/util/Util.kt |   4 +-
 .../src/org/videolan/vlc/util/VLCOptions.kt   |  10 +-
 .../videolan/vlc/viewmodels/HistoryModel.kt   |   6 +-
 .../vlc/viewmodels/MedialibraryModel.kt       |   6 +-
 .../vlc/viewmodels/MedialibraryViewModel.kt   |   6 +-
 .../videolan/vlc/viewmodels/PlaylistModel.kt  |  20 +-
 .../videolan/vlc/viewmodels/SortableModel.kt  |   6 +-
 .../videolan/vlc/viewmodels/StreamsModel.kt   |   4 +-
 .../vlc/viewmodels/browser/BrowserModel.kt    |  22 +-
 .../viewmodels/mobile/AlbumSongsViewModel.kt  |  20 +-
 .../mobile/AudioBrowserViewModel.kt           |  10 +-
 .../vlc/viewmodels/mobile/FoldersViewModel.kt |   8 +-
 .../viewmodels/mobile/PlaylistViewModel.kt    |  20 +-
 .../vlc/viewmodels/mobile/VideosViewModel.kt  |   8 +-
 .../videolan/vlc/viewmodels/tv/MainTvModel.kt |  24 +-
 .../org/videolan/vlc/util/TestUtil.kt         |   2 +-
 153 files changed, 1933 insertions(+), 1940 deletions(-)
 rename medialibrary/src/org/videolan/medialibrary/interfaces/{AMedialibrary.java => AbstractMedialibrary.java} (81%)
 delete mode 100644 medialibrary/src/org/videolan/medialibrary/interfaces/media/AGenre.java
 rename medialibrary/src/org/videolan/medialibrary/interfaces/media/{AAlbum.java => AbstractAlbum.java} (63%)
 rename medialibrary/src/org/videolan/medialibrary/interfaces/media/{AArtist.java => AbstractArtist.java} (56%)
 rename medialibrary/src/org/videolan/medialibrary/interfaces/media/{AFolder.java => AbstractFolder.java} (55%)
 create mode 100644 medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractGenre.java
 rename medialibrary/src/org/videolan/medialibrary/interfaces/media/{AMediaWrapper.java => AbstractMediaWrapper.java} (92%)
 rename medialibrary/src/org/videolan/medialibrary/interfaces/media/{APlaylist.java => AbstractPlaylist.java} (62%)

diff --git a/medialibrary/jni/medialibrary.cpp b/medialibrary/jni/medialibrary.cpp
index 8a81f85e32..a1305d7aba 100644
--- a/medialibrary/jni/medialibrary.cpp
+++ b/medialibrary/jni/medialibrary.cpp
@@ -1736,62 +1736,62 @@ static JNINativeMethod methods[] = {
     {"nativeRemoveDevice", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*)removeDevice },
     {"nativeBanFolder", "(Ljava/lang/String;)V", (void*)banFolder },
     {"nativeUnbanFolder", "(Ljava/lang/String;)V", (void*)unbanFolder },
-    {"nativeLastMediaPlayed", "()[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)lastMediaPLayed },
-    {"nativeLastStreamsPlayed", "()[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)lastStreamsPlayed },
+    {"nativeLastMediaPlayed", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)lastMediaPLayed },
+    {"nativeLastStreamsPlayed", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)lastStreamsPlayed },
     {"nativeAddToHistory", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*)addToHistory },
     {"nativeClearHistory", "()Z", (void*)clearHistory },
-    {"nativeGetVideos", "()[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getVideos },
-    {"nativeGetSortedVideos", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getSortedVideos },
-    {"nativeGetSortedPagedVideos", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getPagedVideos },
-    {"nativeGetRecentVideos", "()[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getRecentVideos },
-    {"nativeGetAudio", "()[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getAudio },
-    {"nativeGetSortedAudio", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getSortedAudio },
-    {"nativeGetSortedPagedAudio", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getPagedAudio },
-    {"nativeGetRecentAudio", "()[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getRecentAudio },
+    {"nativeGetVideos", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getVideos },
+    {"nativeGetSortedVideos", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getSortedVideos },
+    {"nativeGetSortedPagedVideos", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedVideos },
+    {"nativeGetRecentVideos", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getRecentVideos },
+    {"nativeGetAudio", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getAudio },
+    {"nativeGetSortedAudio", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getSortedAudio },
+    {"nativeGetSortedPagedAudio", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedAudio },
+    {"nativeGetRecentAudio", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getRecentAudio },
     {"nativeSearch", "(Ljava/lang/String;)Lorg/videolan/medialibrary/media/SearchAggregate;", (void*)search},
-    {"nativeSearchMedia", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)searchMedia},
-    {"nativeSearchPagedMedia", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)searchPagedMedia},
-    {"nativeSearchPagedAudio", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)searchPagedAudio},
-    {"nativeSearchPagedVideo", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)searchPagedVideo},
+    {"nativeSearchMedia", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchMedia},
+    {"nativeSearchPagedMedia", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchPagedMedia},
+    {"nativeSearchPagedAudio", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchPagedAudio},
+    {"nativeSearchPagedVideo", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchPagedVideo},
     {"nativeGetSearchVideoCount", "(Ljava/lang/String;)I", (void*)getSearchVideoCount },
     {"nativeGetSearchAudioCount", "(Ljava/lang/String;)I", (void*)getSearchAudioCount },
     {"nativeGetSearchMediaCount", "(Ljava/lang/String;)I", (void*)getSearchMediaCount },
-    {"nativeSearchAlbum", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)searchAlbum },
-    {"nativeSearchPagedAlbum", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)searchPagedAlbum },
+    {"nativeSearchAlbum", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)searchAlbum },
+    {"nativeSearchPagedAlbum", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)searchPagedAlbum },
     {"nativeGetAlbumSearchCount", "(Ljava/lang/String;)I", (void*)getAlbumSearchCount },
-    {"nativeSearchArtist", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AArtist;", (void*)searchArtist },
-    {"nativeSearchPagedArtist", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AArtist;", (void*)searchPagedArtist },
+    {"nativeSearchArtist", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)searchArtist },
+    {"nativeSearchPagedArtist", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)searchPagedArtist },
     {"nativeGetArtistsSearchCount", "(Ljava/lang/String;)I", (void*)getArtistsSearchCount },
-    {"nativeSearchGenre", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AGenre;", (void*)searchGenre },
-    {"nativeSearchPagedGenre", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AGenre;", (void*)searchPagedGenre },
+    {"nativeSearchGenre", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;", (void*)searchGenre },
+    {"nativeSearchPagedGenre", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;", (void*)searchPagedGenre },
     {"nativeGetGenreSearchCount", "(Ljava/lang/String;)I", (void*)getGenreSearchCount },
-    {"nativeSearchPlaylist", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/APlaylist;", (void*)searchPlaylist },
-    {"nativeSearchPagedPlaylist", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/APlaylist;", (void*)searchPagedPlaylist },
+    {"nativeSearchPlaylist", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)searchPlaylist },
+    {"nativeSearchPagedPlaylist", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)searchPagedPlaylist },
     {"nativeGetPlaylistSearchCount", "(Ljava/lang/String;)I", (void*)getPlaylistSearchCount },
-    {"nativeGetMedia", "(J)Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getMedia },
-    {"nativeGetMediaFromMrl", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getMediaFromMrl },
-    {"nativeAddMedia", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)addMedia },
+    {"nativeGetMedia", "(J)Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMedia },
+    {"nativeGetMediaFromMrl", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMediaFromMrl },
+    {"nativeAddMedia", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)addMedia },
     {"nativeRemoveExternalMedia", "(J)Z", (void*)removeExternalMedia },
-    {"nativeAddStream", "(Ljava/lang/String;Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)addStream },
+    {"nativeAddStream", "(Ljava/lang/String;Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)addStream },
     {"nativeGetVideoCount", "()I", (void*)getVideoCount },
     {"nativeGetAudioCount", "()I", (void*)getAudioCount },
-    {"nativeGetAlbums", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)getAlbums },
-    {"nativeGetPagedAlbums", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)getPagedAlbums },
+    {"nativeGetAlbums", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getAlbums },
+    {"nativeGetPagedAlbums", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getPagedAlbums },
     {"nativeGetAlbumsCount", "()I", (void*)getAlbumsCount },
-    {"nativeGetAlbum", "(J)Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)getAlbum },
-    {"nativeGetArtists", "(ZIZ)[Lorg/videolan/medialibrary/interfaces/media/AArtist;", (void*)getArtists },
-    {"nativeGetPagedArtists", "(ZIZII)[Lorg/videolan/medialibrary/interfaces/media/AArtist;", (void*)getPagedArtists },
+    {"nativeGetAlbum", "(J)Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getAlbum },
+    {"nativeGetArtists", "(ZIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)getArtists },
+    {"nativeGetPagedArtists", "(ZIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)getPagedArtists },
     {"nativeGetArtistsCount", "(Z)I", (void*)getArtistsCount },
-    {"nativeGetArtist", "(J)Lorg/videolan/medialibrary/interfaces/media/AArtist;", (void*)getArtist },
-    {"nativeGetGenres", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AGenre;", (void*)getGenres },
-    {"nativeGetPagedGenres", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AGenre;", (void*)getPagedGenres },
+    {"nativeGetArtist", "(J)Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)getArtist },
+    {"nativeGetGenres", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;", (void*)getGenres },
+    {"nativeGetPagedGenres", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;", (void*)getPagedGenres },
     {"nativeGetGenresCount", "()I", (void*)getGenresCount },
-    {"nativeGetGenre", "(J)Lorg/videolan/medialibrary/interfaces/media/AGenre;", (void*)getGenre },
-    {"nativeGetPlaylists", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/APlaylist;", (void*)getPlaylists },
-    {"nativeGetPagedPlaylists", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/APlaylist;", (void*)getPagedPlaylists },
+    {"nativeGetGenre", "(J)Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;", (void*)getGenre },
+    {"nativeGetPlaylists", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)getPlaylists },
+    {"nativeGetPagedPlaylists", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)getPagedPlaylists },
     {"nativeGetPlaylistsCount", "()I", (void*)getPlaylistsCount },
-    {"nativeGetPlaylist", "(J)Lorg/videolan/medialibrary/interfaces/media/APlaylist;", (void*)getPlaylist },
-    {"nativeGetFolders", "(IIZII)[Lorg/videolan/medialibrary/interfaces/media/AFolder;", (void*)folders },
+    {"nativeGetPlaylist", "(J)Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)getPlaylist },
+    {"nativeGetFolders", "(IIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractFolder;", (void*)folders },
     {"nativeGetFoldersCount", "(I)I", (void*)foldersCount },
     {"nativePauseBackgroundOperations", "()V", (void*)pauseBackgroundOperations },
     {"nativeResumeBackgroundOperations", "()V", (void*)resumeBackgroundOperations },
@@ -1802,78 +1802,78 @@ static JNINativeMethod methods[] = {
     {"nativeIncreasePlayCount", "(J)Z", (void*)increasePlayCount },
     {"nativeSetMediaUpdatedCbFlag", "(I)V", (void*)setMediaUpdatedCbFlag },
     {"nativeSetMediaAddedCbFlag", "(I)V", (void*)setMediaAddedCbFlag },
-    {"nativePlaylistCreate", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/APlaylist;", (void*)playlistCreate },
+    {"nativePlaylistCreate", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)playlistCreate },
     {"nativeRequestThumbnail", "(J)V", (void*)requestThumbnail },
 };
 
 static JNINativeMethod media_methods[] = {
-    {"nativeGetMediaLongMetadata", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JI)J", (void*)getMediaLongMetadata },
-    {"nativeGetMediaStringMetadata", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JI)Ljava/lang/String;", (void*)getMediaStringMetadata },
-    {"nativeSetMediaStringMetadata", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JILjava/lang/String;)V", (void*)setMediaStringMetadata },
-    {"nativeSetMediaLongMetadata", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIJ)V", (void*)setMediaLongMetadata },
-    {"nativeSetMediaThumbnail", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;)V", (void*)setMediaThumbnail },
-    {"nativeSetMediaTitle", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;)V", (void*)setMediaTitle },
-    {"nativeRemoveFromHistory", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J)V", (void*)removeMediaFromHistory },
+    {"nativeGetMediaLongMetadata", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)J", (void*)getMediaLongMetadata },
+    {"nativeGetMediaStringMetadata", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)Ljava/lang/String;", (void*)getMediaStringMetadata },
+    {"nativeSetMediaStringMetadata", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JILjava/lang/String;)V", (void*)setMediaStringMetadata },
+    {"nativeSetMediaLongMetadata", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIJ)V", (void*)setMediaLongMetadata },
+    {"nativeSetMediaThumbnail", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)V", (void*)setMediaThumbnail },
+    {"nativeSetMediaTitle", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)V", (void*)setMediaTitle },
+    {"nativeRemoveFromHistory", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)V", (void*)removeMediaFromHistory },
 };
 
 static JNINativeMethod album_methods[] = {
-    {"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getTracksFromAlbum },
-    {"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getPagedTracksFromAlbum },
-    {"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)searchFromAlbum },
-    {"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;)I", (void*)getSearchFromAlbumCount },
-    {"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J)I", (void*)getTracksFromAlbumCount },
+    {"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getTracksFromAlbum },
+    {"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedTracksFromAlbum },
+    {"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchFromAlbum },
+    {"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchFromAlbumCount },
+    {"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getTracksFromAlbumCount },
 };
 
 static JNINativeMethod artist_methods[] = {
-    {"nativeGetMedia", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getMediaFromArtist },
-    {"nativeGetAlbums", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)getAlbumsFromArtist },
-    {"nativeGetPagedMedia", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getPagedMediaFromArtist },
-    {"nativeGetPagedAlbums", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)getPagedAlbumsFromArtist },
-    {"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)searchFromArtist },
-    {"nativeSearchAlbums", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)searchAlbumsFromArtist },
-    {"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J)I", (void*)getArtistTracksCount },
-    {"nativeGetAlbumsCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J)I", (void*)getArtistAlbumsCount },
-    {"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;)I", (void*)getSearchFromArtistCount },
-    {"nativeGetSearchAlbumCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;)I", (void*)getSearchAlbumFromArtistCount },
+    {"nativeGetMedia", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMediaFromArtist },
+    {"nativeGetAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getAlbumsFromArtist },
+    {"nativeGetPagedMedia", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedMediaFromArtist },
+    {"nativeGetPagedAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getPagedAlbumsFromArtist },
+    {"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchFromArtist },
+    {"nativeSearchAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)searchAlbumsFromArtist },
+    {"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getArtistTracksCount },
+    {"nativeGetAlbumsCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getArtistAlbumsCount },
+    {"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchFromArtistCount },
+    {"nativeGetSearchAlbumCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchAlbumFromArtistCount },
 };
 
 static JNINativeMethod genre_methods[] = {
-    {"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getMediaFromGenre },
-    {"nativeGetAlbums", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)getAlbumsFromGenre },
-    {"nativeGetArtists", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AArtist;", (void*)getArtistsFromGenre },
-    {"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getPagedMediaFromGenre },
-    {"nativeGetPagedAlbums", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)getPagedAlbumsFromGenre },
-    {"nativeGetPagedArtists", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AArtist;", (void*)getPagedArtistsFromGenre },
-    {"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)searchMediaFromGenre },
-    {"nativeSearchAlbums", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AAlbum;", (void*)searchAlbumsFromGenre },
-    {"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J)I", (void*)getGenreTracksCount },
-    {"nativeGetAlbumsCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J)I", (void*)getGenreAlbumsCount },
-    {"nativeGetArtistsCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J)I", (void*)getGenreArtistsCount },
-    {"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;)I", (void*)getSearchMediaFromGenreCount },
-    {"nativeGetSearchAlbumCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;)I", (void*)getSearchAlbumsFromGenreCount },
+    {"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMediaFromGenre },
+    {"nativeGetAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getAlbumsFromGenre },
+    {"nativeGetArtists", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)getArtistsFromGenre },
+    {"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedMediaFromGenre },
+    {"nativeGetPagedAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getPagedAlbumsFromGenre },
+    {"nativeGetPagedArtists", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)getPagedArtistsFromGenre },
+    {"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchMediaFromGenre },
+    {"nativeSearchAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)searchAlbumsFromGenre },
+    {"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getGenreTracksCount },
+    {"nativeGetAlbumsCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getGenreAlbumsCount },
+    {"nativeGetArtistsCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getGenreArtistsCount },
+    {"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchMediaFromGenreCount },
+    {"nativeGetSearchAlbumCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchAlbumsFromGenreCount },
 };
 
 static JNINativeMethod folder_methods[] = {
-    {"nativeMedia", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIIZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)mediaFromFolder },
-    {"nativeSubfolders", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AFolder;", (void*)subFolders },
-    {"nativeMediaCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JI)I", (void*)mediaFromFolderCount },
-    {"nativeSubfoldersCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JI)I", (void*)subFoldersCount },
-    {"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;IIZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)searchMediaFromFolder },
-    {"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;I)I", (void*)getSearchMediaFromFolderCount },
+    {"nativeMedia", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)mediaFromFolder },
+    {"nativeSubfolders", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractFolder;", (void*)subFolders },
+    {"nativeMediaCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)I", (void*)mediaFromFolderCount },
+    {"nativeSubfoldersCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)I", (void*)subFoldersCount },
+    {"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchMediaFromFolder },
+    {"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;I)I", (void*)getSearchMediaFromFolderCount },
 };
 
 static JNINativeMethod playlist_methods[] = {
-    {"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getMediaFromPlaylist },
-    {"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)getPagedMediaFromPlaylist },
-    {"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J)I", (void*)getPlaylistTracksCount },
-    {"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;", (void*)searchFromPlaylist },
-    {"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JLjava/lang/String;)I", (void*)getSearchFromPlaylistCount },
-    {"nativePlaylistAppend", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JJ)Z", (void*)playlistAppend },
-    {"nativePlaylistAppendGroup", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J[J)Z", (void*)playlistAppendGroup },
-    {"nativePlaylistAdd", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JJI)Z", (void*)playlistAdd },
-    {"nativePlaylistMove", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JII)Z", (void*)playlistMove },
-    {"nativePlaylistRemove", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;JI)Z", (void*)playlistRemove },
-    {"nativePlaylistDelete", "(Lorg/videolan/medialibrary/interfaces/AMedialibrary;J)Z", (void*)playlistDelete },
+    {"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMediaFromPlaylist },
+    {"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedMediaFromPlaylist },
+    {"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getPlaylistTracksCount },
+    {"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchFromPlaylist },
+    {"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchFromPlaylistCount },
+    {"nativePlaylistAppend", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JJ)Z", (void*)playlistAppend },
+    {"nativePlaylistAppendGroup", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J[J)Z", (void*)playlistAppendGroup },
+    {"nativePlaylistAdd", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JJI)Z", (void*)playlistAdd },
+    {"nativePlaylistMove", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JII)Z", (void*)playlistMove },
+    {"nativePlaylistRemove", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)Z", (void*)playlistRemove },
+    {"nativePlaylistDelete", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)Z", (void*)playlistDelete },
 };
 
 /* This function is called when a thread attached to the Java VM is canceled or
@@ -2008,7 +2008,7 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
     GET_ID(GetMethodID,
            ml_fields.SearchAggregate.initID,
            ml_fields.SearchAggregate.clazz,
-           "<init>", "([Lorg/videolan/medialibrary/interfaces/media/AAlbum;[Lorg/videolan/medialibrary/interfaces/media/AArtist;[Lorg/videolan/medialibrary/interfaces/media/AGenre;[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;[Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;[Lorg/videolan/medialibrary/interfaces/media/APlaylist;)V");
+           "<init>", "([Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;)V");
 
     GET_CLASS(ml_fields.Folder.clazz, "org/videolan/medialibrary/media/Folder", true);
 
@@ -2025,11 +2025,11 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
     GET_ID(GetMethodID,
            ml_fields.MediaLibrary.onMediaAddedId,
            ml_fields.MediaLibrary.clazz,
-           "onMediaAdded", "([Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;)V");
+           "onMediaAdded", "([Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;)V");
     GET_ID(GetMethodID,
            ml_fields.MediaLibrary.onMediaUpdatedId,
            ml_fields.MediaLibrary.clazz,
-           "onMediaUpdated", "([Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;)V");
+           "onMediaUpdated", "([Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;)V");
     GET_ID(GetMethodID,
            ml_fields.MediaLibrary.onMediaDeletedId,
            ml_fields.MediaLibrary.clazz,
@@ -2129,7 +2129,7 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
     GET_ID(GetMethodID,
            ml_fields.MediaLibrary.onMediaThumbnailReadyId,
            ml_fields.MediaLibrary.clazz,
-           "onMediaThumbnailReady", "(Lorg/videolan/medialibrary/interfaces/media/AMediaWrapper;Z)V");
+           "onMediaThumbnailReady", "(Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;Z)V");
 
 #undef GET_CLASS
 #undef GET_ID
diff --git a/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java b/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java
index 8e40ba7a47..414c282d15 100644
--- a/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java
+++ b/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java
@@ -5,13 +5,13 @@ import android.net.Uri;
 import android.os.Parcel;
 
 import org.videolan.libvlc.Media;
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AFolder;
-import org.videolan.medialibrary.interfaces.media.AGenre;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
-import org.videolan.medialibrary.interfaces.media.APlaylist;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractFolder;
+import org.videolan.medialibrary.interfaces.media.AbstractGenre;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
 import org.videolan.medialibrary.media.Album;
 import org.videolan.medialibrary.media.Artist;
 import org.videolan.medialibrary.media.Folder;
@@ -40,7 +40,7 @@ public class MLServiceLocator {
         TESTS,
     }
 
-    public static AMedialibrary getAMedialibrary() {
+    public static AbstractMedialibrary getAbstractMedialibrary() {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Medialibrary();
         } else {
@@ -48,14 +48,14 @@ public class MLServiceLocator {
         }
     }
 
-    // AMediaWrapper
-    public static AMediaWrapper getAMediaWrapper(long id, String mrl, long time, long length,
-                                                 int type, String title, String filename,
-                                                 String artist, String genre, String album,
-                                                 String albumArtist, int width, int height,
-                                                 String artworkURL, int audio, int spu,
-                                                 int trackNumber, int discNumber, long lastModified,
-                                                 long seen, boolean isThumbnailGenerated) {
+    // AbstractMediaWrapper
+    public static AbstractMediaWrapper getAbstractMediaWrapper(long id, String mrl, long time, long length,
+                                                               int type, String title, String filename,
+                                                               String artist, String genre, String album,
+                                                               String albumArtist, int width, int height,
+                                                               String artworkURL, int audio, int spu,
+                                                               int trackNumber, int discNumber, long lastModified,
+                                                               long seen, boolean isThumbnailGenerated) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new MediaWrapper(id, mrl, time, length, type, title,
                     filename, artist, genre, album, albumArtist, width, height, artworkURL,
@@ -67,12 +67,12 @@ public class MLServiceLocator {
         }
     }
 
-    public static AMediaWrapper getAMediaWrapper(Uri uri, long time, long length, int type,
-                                                 Bitmap picture, String title, String artist,
-                                                 String genre, String album, String albumArtist,
-                                                 int width, int height, String artworkURL,
-                                                 int audio, int spu, int trackNumber,
-                                                 int discNumber, long lastModified, long seen) {
+    public static AbstractMediaWrapper getAbstractMediaWrapper(Uri uri, long time, long length, int type,
+                                                               Bitmap picture, String title, String artist,
+                                                               String genre, String album, String albumArtist,
+                                                               int width, int height, String artworkURL,
+                                                               int audio, int spu, int trackNumber,
+                                                               int discNumber, long lastModified, long seen) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new MediaWrapper(uri, time, length, type, picture, title, artist, genre,
                     album, albumArtist, width, height, artworkURL, audio, spu, trackNumber,
@@ -84,7 +84,7 @@ public class MLServiceLocator {
         }
     }
 
-    public static AMediaWrapper getAMediaWrapper(Uri uri) {
+    public static AbstractMediaWrapper getAbstractMediaWrapper(Uri uri) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new MediaWrapper(uri);
         } else {
@@ -92,7 +92,7 @@ public class MLServiceLocator {
         }
     }
 
-    public static AMediaWrapper getAMediaWrapper(Media media) {
+    public static AbstractMediaWrapper getAbstractMediaWrapper(Media media) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new MediaWrapper(media);
         } else {
@@ -100,7 +100,7 @@ public class MLServiceLocator {
         }
     }
 
-    public static AMediaWrapper getAMediaWrapper(Parcel in) {
+    public static AbstractMediaWrapper getAbstractMediaWrapper(Parcel in) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new MediaWrapper(in);
         } else {
@@ -109,7 +109,7 @@ public class MLServiceLocator {
     }
 
     //Artist
-    public static AArtist getAArtist(long id, String name, String shortBio, String artworkMrl, String musicBrainzId) {
+    public static AbstractArtist getAbstractArtist(long id, String name, String shortBio, String artworkMrl, String musicBrainzId) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Artist(id, name, shortBio, artworkMrl, musicBrainzId);
         } else {
@@ -117,7 +117,7 @@ public class MLServiceLocator {
         }
     }
 
-    public static AArtist getAArtist(Parcel in) {
+    public static AbstractArtist getAbstractArtist(Parcel in) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Artist(in);
         } else {
@@ -126,7 +126,7 @@ public class MLServiceLocator {
     }
 
     //Genre
-    public static AGenre getAGenre(long id, String title) {
+    public static AbstractGenre getAbstractGenre(long id, String title) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Genre(id, title);
         } else {
@@ -134,7 +134,7 @@ public class MLServiceLocator {
         }
     }
 
-    public static AGenre getAGenre(Parcel in) {
+    public static AbstractGenre getAbstractGenre(Parcel in) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Genre(in);
         } else {
@@ -143,9 +143,9 @@ public class MLServiceLocator {
     }
 
     //Album
-    public static AAlbum getAAlbum(long id, String title, int releaseYear, String artworkMrl,
-                                   String albumArtist, long albumArtistId, int nbTracks,
-                                   int duration) {
+    public static AbstractAlbum getAbstractAlbum(long id, String title, int releaseYear, String artworkMrl,
+                                                 String albumArtist, long albumArtistId, int nbTracks,
+                                                 int duration) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Album(id, title, releaseYear, artworkMrl, albumArtist, albumArtistId,
                     nbTracks, duration);
@@ -155,7 +155,7 @@ public class MLServiceLocator {
         }
     }
 
-    public static AAlbum getAAlbum(Parcel in) {
+    public static AbstractAlbum getAbstractAlbum(Parcel in) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Album(in);
         } else {
@@ -164,7 +164,7 @@ public class MLServiceLocator {
     }
 
     //Folder
-    public static AFolder getAFolder(long id, String name, String mrl) {
+    public static AbstractFolder getAbstractFolder(long id, String name, String mrl) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Folder(id, name, mrl);
         } else {
@@ -172,7 +172,7 @@ public class MLServiceLocator {
         }
     }
 
-    public static AFolder getAFolder(Parcel in) {
+    public static AbstractFolder getAbstractFolder(Parcel in) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Folder(in);
         } else {
@@ -181,7 +181,7 @@ public class MLServiceLocator {
     }
 
     //Playlist
-    public static APlaylist getAPlaylist(long id, String name, int trackCount) {
+    public static AbstractPlaylist getAbstractPlaylist(long id, String name, int trackCount) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Playlist(id, name, trackCount);
         } else {
@@ -189,7 +189,7 @@ public class MLServiceLocator {
         }
     }
 
-    public static APlaylist getAPlaylist(Parcel in) {
+    public static AbstractPlaylist getAbstractPlaylist(Parcel in) {
         if (mMode == LocatorMode.VLC_ANDROID) {
             return new Playlist(in);
         } else {
diff --git a/medialibrary/src/org/videolan/medialibrary/Medialibrary.java b/medialibrary/src/org/videolan/medialibrary/Medialibrary.java
index 8e5986a47e..e0868d0b23 100644
--- a/medialibrary/src/org/videolan/medialibrary/Medialibrary.java
+++ b/medialibrary/src/org/videolan/medialibrary/Medialibrary.java
@@ -22,21 +22,18 @@
 package org.videolan.medialibrary;
 
 import android.content.Context;
-import android.content.Intent;
 import android.net.Uri;
 import android.text.TextUtils;
 import android.util.Log;
 
 import org.videolan.libvlc.LibVLC;
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.DevicesDiscoveryCb;
-import org.videolan.medialibrary.interfaces.EntryPointsEventsCb;
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AFolder;
-import org.videolan.medialibrary.interfaces.media.AGenre;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
-import org.videolan.medialibrary.interfaces.media.APlaylist;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractFolder;
+import org.videolan.medialibrary.interfaces.media.AbstractGenre;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
 import org.videolan.medialibrary.media.SearchAggregate;
 
 import java.io.File;
@@ -44,11 +41,9 @@ import java.io.File;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.WorkerThread;
-import androidx.lifecycle.MutableLiveData;
-import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
 @SuppressWarnings("JniMissingFunction")
-public class Medialibrary extends AMedialibrary {
+public class Medialibrary extends AbstractMedialibrary {
     private static final String TAG = "VLC/JMedialibrary";
 
     public int init(Context context) {
@@ -141,43 +136,43 @@ public class Medialibrary extends AMedialibrary {
     }
 
     @WorkerThread
-    public AMediaWrapper[] getVideos() {
-        return mIsInitiated ? nativeGetVideos() : new AMediaWrapper[0];
+    public AbstractMediaWrapper[] getVideos() {
+        return mIsInitiated ? nativeGetVideos() : new AbstractMediaWrapper[0];
     }
 
     @WorkerThread
-    public AMediaWrapper[] getPagedVideos(int sort, boolean desc, int nbItems, int offset) {
-        return mIsInitiated ? nativeGetSortedPagedVideos(sort, desc, nbItems, offset) : new AMediaWrapper[0];
+    public AbstractMediaWrapper[] getPagedVideos(int sort, boolean desc, int nbItems, int offset) {
+        return mIsInitiated ? nativeGetSortedPagedVideos(sort, desc, nbItems, offset) : new AbstractMediaWrapper[0];
     }
 
     @WorkerThread
-    public AMediaWrapper[] getVideos(int sort, boolean desc) {
-        return mIsInitiated ? nativeGetSortedVideos(sort, desc) : new AMediaWrapper[0];
+    public AbstractMediaWrapper[] getVideos(int sort, boolean desc) {
+        return mIsInitiated ? nativeGetSortedVideos(sort, desc) : new AbstractMediaWrapper[0];
     }
 
     @WorkerThread
-    public AMediaWrapper[] getRecentVideos() {
-        return mIsInitiated ? nativeGetRecentVideos() : new AMediaWrapper[0];
+    public AbstractMediaWrapper[] getRecentVideos() {
+        return mIsInitiated ? nativeGetRecentVideos() : new AbstractMediaWrapper[0];
     }
 
     @WorkerThread
-    public AMediaWrapper[] getAudio() {
-        return mIsInitiated ? nativeGetAudio() : new AMediaWrapper[0];
+    public AbstractMediaWrapper[] getAudio() {
+        return mIsInitiated ? nativeGetAudio() : new AbstractMediaWrapper[0];
     }
 
     @WorkerThread
-    public AMediaWrapper[] getAudio(int sort, boolean desc) {
-        return mIsInitiated ? nativeGetSortedAudio(sort, desc) : new AMediaWrapper[0];
+    public AbstractMediaWrapper[] getAudio(int sort, boolean desc) {
+        return mIsInitiated ? nativeGetSortedAudio(sort, desc) : new AbstractMediaWrapper[0];
     }
 
     @WorkerThread
-    public AMediaWrapper[] getPagedAudio(int sort, boolean desc, int nbItems, int offset) {
-        return mIsInitiated ? nativeGetSortedPagedAudio(sort, desc, nbItems, offset) : new AMediaWrapper[0];
+    public AbstractMediaWrapper[] getPagedAudio(int sort, boolean desc, int nbItems, int offset) {
+        return mIsInitiated ? nativeGetSortedPagedAudio(sort, desc, nbItems, offset) : new AbstractMediaWrapper[0];
     }
 
     @WorkerThread
-    public AMediaWrapper[] getRecentAudio() {
-        return mIsInitiated ? nativeGetRecentAudio() : new AMediaWrapper[0];
+    public AbstractMediaWrapper[] getRecentAudio() {
+        return mIsInitiated ? nativeGetRecentAudio() : new AbstractMediaWrapper[0];
     }
 
     public int getVideoCount() {
@@ -190,19 +185,19 @@ public class Medialibrary extends AMedialibrary {
 
 
     @WorkerThread
-    public AAlbum[] getAlbums() {
-        return getAlbums(AMedialibrary.SORT_DEFAULT, false);
+    public AbstractAlbum[] getAlbums() {
+        return getAlbums(AbstractMedialibrary.SORT_DEFAULT, false);
     }
 
     @WorkerThread
-    public AAlbum[] getAlbums(int sort, boolean desc) {
-        return mIsInitiated ? nativeGetAlbums(sort, desc) : new AAlbum[0];
+    public AbstractAlbum[] getAlbums(int sort, boolean desc) {
+        return mIsInitiated ? nativeGetAlbums(sort, desc) : new AbstractAlbum[0];
     }
 
     @NonNull
     @WorkerThread
-    public AAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
-        return mIsInitiated ? nativeGetPagedAlbums(sort, desc, nbItems, offset) : new AAlbum[0];
+    public AbstractAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
+        return mIsInitiated ? nativeGetPagedAlbums(sort, desc, nbItems, offset) : new AbstractAlbum[0];
     }
 
     public int getAlbumsCount() {
@@ -214,23 +209,23 @@ public class Medialibrary extends AMedialibrary {
     }
 
     @WorkerThread
-    public AAlbum getAlbum(long albumId) {
+    public AbstractAlbum getAlbum(long albumId) {
         return mIsInitiated ? nativeGetAlbum(albumId) : null;
     }
 
     @WorkerThread
-    public AArtist[] getArtists(boolean all) {
-        return getArtists(all, AMedialibrary.SORT_DEFAULT, false);
+    public AbstractArtist[] getArtists(boolean all) {
+        return getArtists(all, AbstractMedialibrary.SORT_DEFAULT, false);
     }
 
     @WorkerThread
-    public AArtist[] getArtists(boolean all, int sort, boolean desc) {
-        return mIsInitiated ? nativeGetArtists(all, sort, desc) : new AArtist[0];
+    public AbstractArtist[] getArtists(boolean all, int sort, boolean desc) {
+        return mIsInitiated ? nativeGetArtists(all, sort, desc) : new AbstractArtist[0];
     }
 
     @WorkerThread
-    public AArtist[] getPagedArtists(boolean all, int sort, boolean desc, int nbItems, int offset) {
-        return mIsInitiated ? nativeGetPagedArtists(all, sort, desc, nbItems, offset) : new AArtist[0];
+    public AbstractArtist[] getPagedArtists(boolean all, int sort, boolean desc, int nbItems, int offset) {
+        return mIsInitiated ? nativeGetPagedArtists(all, sort, desc, nbItems, offset) : new AbstractArtist[0];
     }
 
     public int getArtistsCount(boolean all) {
@@ -241,24 +236,24 @@ public class Medialibrary extends AMedialibrary {
         return mIsInitiated ? nativeGetArtistsSearchCount(query) : 0;
     }
 
-    public AArtist getArtist(long artistId) {
+    public AbstractArtist getArtist(long artistId) {
         return mIsInitiated ? nativeGetArtist(artistId) : null;
     }
 
     @WorkerThread
-    public AGenre[] getGenres() {
-        return getGenres(AMedialibrary.SORT_DEFAULT, false);
+    public AbstractGenre[] getGenres() {
+        return getGenres(AbstractMedialibrary.SORT_DEFAULT, false);
     }
 
     @WorkerThread
-    public AGenre[] getGenres(int sort, boolean desc) {
-        return mIsInitiated ? nativeGetGenres(sort, desc) : new AGenre[0];
+    public AbstractGenre[] getGenres(int sort, boolean desc) {
+        return mIsInitiated ? nativeGetGenres(sort, desc) : new AbstractGenre[0];
     }
 
     @NonNull
     @WorkerThread
-    public AGenre[] getPagedGenres(int sort, boolean desc, int nbItems, int offset) {
-        return mIsInitiated ? nativeGetPagedGenres(sort, desc, nbItems, offset) : new AGenre[0];
+    public AbstractGenre[] getPagedGenres(int sort, boolean desc, int nbItems, int offset) {
+        return mIsInitiated ? nativeGetPagedGenres(sort, desc, nbItems, offset) : new AbstractGenre[0];
     }
 
     public int getGenresCount() {
@@ -269,23 +264,23 @@ public class Medialibrary extends AMedialibrary {
         return mIsInitiated ? nativeGetGenreSearchCount(query) : 0;
     }
 
-    public AGenre getGenre(long genreId) {
+    public AbstractGenre getGenre(long genreId) {
         return mIsInitiated ? nativeGetGenre(genreId) : null;
     }
 
     @WorkerThread
-    public APlaylist[] getPlaylists() {
-        return getPlaylists(AMedialibrary.SORT_DEFAULT, false);
+    public AbstractPlaylist[] getPlaylists() {
+        return getPlaylists(AbstractMedialibrary.SORT_DEFAULT, false);
     }
 
     @WorkerThread
-    public APlaylist[] getPlaylists(int sort, boolean desc) {
-        return mIsInitiated ? nativeGetPlaylists(sort, desc) : new APlaylist[0];
+    public AbstractPlaylist[] getPlaylists(int sort, boolean desc) {
+        return mIsInitiated ? nativeGetPlaylists(sort, desc) : new AbstractPlaylist[0];
     }
 
     @WorkerThread
-    public APlaylist[] getPagedPlaylists(int sort, boolean desc, int nbItems, int offset) {
-        return mIsInitiated ? nativeGetPagedPlaylists(sort, desc, nbItems, offset) : new APlaylist[0];
+    public AbstractPlaylist[] getPagedPlaylists(int sort, boolean desc, int nbItems, int offset) {
+        return mIsInitiated ? nativeGetPagedPlaylists(sort, desc, nbItems, offset) : new AbstractPlaylist[0];
     }
 
     public int getPlaylistsCount() {
@@ -296,11 +291,11 @@ public class Medialibrary extends AMedialibrary {
         return mIsInitiated ? nativeGetPlaylistSearchCount(query) : 0;
     }
 
-    public APlaylist getPlaylist(long playlistId) {
+    public AbstractPlaylist getPlaylist(long playlistId) {
         return mIsInitiated ? nativeGetPlaylist(playlistId) : null;
     }
 
-    public APlaylist createPlaylist(String name) {
+    public AbstractPlaylist createPlaylist(String name) {
         return mIsInitiated && !TextUtils.isEmpty(name) ? nativePlaylistCreate(name) : null;
     }
 
@@ -330,12 +325,12 @@ public class Medialibrary extends AMedialibrary {
     }
 
     @WorkerThread
-    public AMediaWrapper[] lastMediaPlayed() {
+    public AbstractMediaWrapper[] lastMediaPlayed() {
         return mIsInitiated ? nativeLastMediaPlayed() : EMPTY_COLLECTION;
     }
 
     @WorkerThread
-    public AMediaWrapper[] lastStreamsPlayed() {
+    public AbstractMediaWrapper[] lastStreamsPlayed() {
         return mIsInitiated ? nativeLastStreamsPlayed() : EMPTY_COLLECTION;
     }
 
@@ -348,26 +343,26 @@ public class Medialibrary extends AMedialibrary {
     }
 
     @Nullable
-    public AMediaWrapper getMedia(long id) {
+    public AbstractMediaWrapper getMedia(long id) {
         return mIsInitiated ? nativeGetMedia(id) : null;
     }
 
     @Nullable
-    public AMediaWrapper getMedia(Uri uri) {
+    public AbstractMediaWrapper getMedia(Uri uri) {
         if ("content".equals(uri.getScheme())) return null;
         final String vlcMrl = Tools.encodeVLCMrl(uri.toString());
         return mIsInitiated && !TextUtils.isEmpty(vlcMrl) ? nativeGetMediaFromMrl(vlcMrl) : null;
     }
 
     @Nullable
-    public AMediaWrapper getMedia(String mrl) {
+    public AbstractMediaWrapper getMedia(String mrl) {
         if (mrl != null && mrl.startsWith("content:")) return null;
         final String vlcMrl = Tools.encodeVLCMrl(mrl);
         return mIsInitiated && !TextUtils.isEmpty(vlcMrl) ? nativeGetMediaFromMrl(vlcMrl) : null;
     }
 
     @Nullable
-    public AMediaWrapper addMedia(String mrl) {
+    public AbstractMediaWrapper addMedia(String mrl) {
         final String vlcMrl = Tools.encodeVLCMrl(mrl);
         return mIsInitiated && !TextUtils.isEmpty(vlcMrl) ? nativeAddMedia(vlcMrl) : null;
     }
@@ -377,7 +372,7 @@ public class Medialibrary extends AMedialibrary {
     }
 
     @Nullable
-    public AMediaWrapper addStream(String mrl, String title) {
+    public AbstractMediaWrapper addStream(String mrl, String title) {
         final String vlcMrl = Tools.encodeVLCMrl(mrl);
         final String vlcTitle = Tools.encodeVLCMrl(title);
         return mIsInitiated && !TextUtils.isEmpty(vlcMrl) ? nativeAddStream(vlcMrl, vlcTitle) : null;
@@ -385,8 +380,8 @@ public class Medialibrary extends AMedialibrary {
 
     @NonNull
     @WorkerThread
-    public AFolder[] getFolders(int type, int sort, boolean desc, int nbItems, int offset) {
-        return mIsInitiated ? nativeGetFolders(type, sort, desc, nbItems, offset) : new AFolder[0];
+    public AbstractFolder[] getFolders(int type, int sort, boolean desc, int nbItems, int offset) {
+        return mIsInitiated ? nativeGetFolders(type, sort, desc, nbItems, offset) : new AbstractFolder[0];
     }
 
     @NonNull
@@ -404,17 +399,17 @@ public class Medialibrary extends AMedialibrary {
     }
 
     // If media is not in ML, find it with its path
-    public AMediaWrapper findMedia(AMediaWrapper mw) {
+    public AbstractMediaWrapper findMedia(AbstractMediaWrapper mw) {
         if (mIsInitiated && mw != null && mw.getId() == 0L) {
             final Uri uri = mw.getUri();
-            final AMediaWrapper libraryMedia = getMedia(uri);
+            final AbstractMediaWrapper libraryMedia = getMedia(uri);
             if (libraryMedia != null) {
                 libraryMedia.addFlags(mw.getFlags());
                 return libraryMedia;
             }
             if (TextUtils.equals("file", uri.getScheme()) &&
                     uri.getPath() != null && uri.getPath().startsWith("/sdcard")) {
-                final AMediaWrapper alternateMedia = getMedia(Tools.convertLocalUri(uri));
+                final AbstractMediaWrapper alternateMedia = getMedia(Tools.convertLocalUri(uri));
                 if (alternateMedia != null) {
                     alternateMedia.addFlags(mw.getFlags());
                     return alternateMedia;
@@ -428,11 +423,11 @@ public class Medialibrary extends AMedialibrary {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearch(query) : null;
     }
 
-    public AMediaWrapper[] searchMedia(String query) {
+    public AbstractMediaWrapper[] searchMedia(String query) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchMedia(query) : null;
     }
 
-    public AMediaWrapper[] searchMedia(String query, int sort, boolean desc, int nbItems, int offset) {
+    public AbstractMediaWrapper[] searchMedia(String query, int sort, boolean desc, int nbItems, int offset) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchPagedMedia(query, sort, desc, nbItems, offset) : null;
     }
 
@@ -440,7 +435,7 @@ public class Medialibrary extends AMedialibrary {
         return mIsInitiated ? nativeGetSearchMediaCount(query) : 0;
     }
 
-    public AMediaWrapper[] searchAudio(String query, int sort, boolean desc, int nbItems, int offset) {
+    public AbstractMediaWrapper[] searchAudio(String query, int sort, boolean desc, int nbItems, int offset) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchPagedAudio(query, sort, desc, nbItems, offset) : null;
     }
 
@@ -448,7 +443,7 @@ public class Medialibrary extends AMedialibrary {
         return mIsInitiated ? nativeGetSearchAudioCount(query) : 0;
     }
 
-    public AMediaWrapper[] searchVideo(String query, int sort, boolean desc, int nbItems, int offset) {
+    public AbstractMediaWrapper[] searchVideo(String query, int sort, boolean desc, int nbItems, int offset) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchPagedVideo(query, sort, desc, nbItems, offset) : null;
     }
 
@@ -456,35 +451,35 @@ public class Medialibrary extends AMedialibrary {
         return mIsInitiated ? nativeGetSearchVideoCount(query) : 0;
     }
 
-    public AArtist[] searchArtist(String query) {
+    public AbstractArtist[] searchArtist(String query) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchArtist(query) : null;
     }
 
-    public AArtist[] searchArtist(String query, int sort, boolean desc, int nbItems, int offset) {
-        return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchPagedArtist(query, sort, desc, nbItems, offset) : new AArtist[0];
+    public AbstractArtist[] searchArtist(String query, int sort, boolean desc, int nbItems, int offset) {
+        return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchPagedArtist(query, sort, desc, nbItems, offset) : new AbstractArtist[0];
     }
 
-    public AAlbum[] searchAlbum(String query, int sort, boolean desc, int nbItems, int offset) {
+    public AbstractAlbum[] searchAlbum(String query, int sort, boolean desc, int nbItems, int offset) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchPagedAlbum(query, sort, desc, nbItems, offset) : null;
     }
 
-    public AAlbum[] searchAlbum(String query) {
+    public AbstractAlbum[] searchAlbum(String query) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchAlbum(query) : null;
     }
 
-    public AGenre[] searchGenre(String query) {
+    public AbstractGenre[] searchGenre(String query) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchGenre(query) : null;
     }
 
-    public AGenre[] searchGenre(String query, int sort, boolean desc, int nbItems, int offset) {
+    public AbstractGenre[] searchGenre(String query, int sort, boolean desc, int nbItems, int offset) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchPagedGenre(query, sort, desc, nbItems, offset) : null;
     }
 
-    public APlaylist[] searchPlaylist(String query) {
+    public AbstractPlaylist[] searchPlaylist(String query) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchPlaylist(query) : null;
     }
 
-    public APlaylist[] searchPlaylist(String query, int sort, boolean desc, int nbItems, int offset) {
+    public AbstractPlaylist[] searchPlaylist(String query, int sort, boolean desc, int nbItems, int offset) {
         return mIsInitiated && !TextUtils.isEmpty(query) ? nativeSearchPagedPlaylist(query, sort, desc, nbItems, offset) : null;
     }
 
@@ -500,43 +495,43 @@ public class Medialibrary extends AMedialibrary {
     private native void nativeRemoveEntryPoint(String path);
     private native String[] nativeEntryPoints();
     private native boolean nativeRemoveDevice(String uuid, String path);
-    private native AMediaWrapper[] nativeLastMediaPlayed();
-    private native AMediaWrapper[] nativeLastStreamsPlayed();
+    private native AbstractMediaWrapper[] nativeLastMediaPlayed();
+    private native AbstractMediaWrapper[] nativeLastStreamsPlayed();
     private native  boolean nativeAddToHistory(String mrl, String title);
     private native  boolean nativeClearHistory();
-    private native AMediaWrapper nativeGetMedia(long id);
-    private native AMediaWrapper nativeGetMediaFromMrl(String mrl);
-    private native AMediaWrapper nativeAddMedia(String mrl);
+    private native AbstractMediaWrapper nativeGetMedia(long id);
+    private native AbstractMediaWrapper nativeGetMediaFromMrl(String mrl);
+    private native AbstractMediaWrapper nativeAddMedia(String mrl);
     private native boolean nativeRemoveExternalMedia(long id);
-    private native AMediaWrapper nativeAddStream(String mrl, String title);
-    private native AMediaWrapper[] nativeGetVideos();
-    private native AMediaWrapper[] nativeGetSortedVideos(int sort, boolean desc);
-    private native AMediaWrapper[] nativeGetRecentVideos();
-    private native AMediaWrapper[] nativeGetAudio();
-    private native AMediaWrapper[] nativeGetSortedAudio(int sort, boolean desc);
-    private native AMediaWrapper[] nativeGetSortedPagedAudio(int sort, boolean desc, int nbItems, int offset);
-    private native AMediaWrapper[] nativeGetSortedPagedVideos(int sort, boolean desc, int nbItems, int offset);
-    private native AMediaWrapper[] nativeGetRecentAudio();
+    private native AbstractMediaWrapper nativeAddStream(String mrl, String title);
+    private native AbstractMediaWrapper[] nativeGetVideos();
+    private native AbstractMediaWrapper[] nativeGetSortedVideos(int sort, boolean desc);
+    private native AbstractMediaWrapper[] nativeGetRecentVideos();
+    private native AbstractMediaWrapper[] nativeGetAudio();
+    private native AbstractMediaWrapper[] nativeGetSortedAudio(int sort, boolean desc);
+    private native AbstractMediaWrapper[] nativeGetSortedPagedAudio(int sort, boolean desc, int nbItems, int offset);
+    private native AbstractMediaWrapper[] nativeGetSortedPagedVideos(int sort, boolean desc, int nbItems, int offset);
+    private native AbstractMediaWrapper[] nativeGetRecentAudio();
     private native int nativeGetVideoCount();
     private native int nativeGetAudioCount();
-    private native AAlbum[] nativeGetAlbums(int sort, boolean desc);
-    private native AAlbum[] nativeGetPagedAlbums(int sort, boolean desc, int nbItems, int offset);
+    private native AbstractAlbum[] nativeGetAlbums(int sort, boolean desc);
+    private native AbstractAlbum[] nativeGetPagedAlbums(int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetAlbumsCount();
-    private native AAlbum nativeGetAlbum(long albumtId);
-    private native AArtist[] nativeGetArtists(boolean all, int sort, boolean desc);
-    private native AArtist[] nativeGetPagedArtists(boolean all, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractAlbum nativeGetAlbum(long albumtId);
+    private native AbstractArtist[] nativeGetArtists(boolean all, int sort, boolean desc);
+    private native AbstractArtist[] nativeGetPagedArtists(boolean all, int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetArtistsCount(boolean all);
-    private native AArtist nativeGetArtist(long artistId);
-    private native AGenre[] nativeGetGenres(int sort, boolean desc);
-    private native AGenre[] nativeGetPagedGenres(int sort, boolean desc, int nbItems, int offset);
+    private native AbstractArtist nativeGetArtist(long artistId);
+    private native AbstractGenre[] nativeGetGenres(int sort, boolean desc);
+    private native AbstractGenre[] nativeGetPagedGenres(int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetGenresCount();
-    private native AGenre nativeGetGenre(long genreId);
-    private native APlaylist[] nativeGetPlaylists(int sort, boolean desc);
-    private native APlaylist[] nativeGetPagedPlaylists(int sort, boolean desc, int nbItems, int offset);
+    private native AbstractGenre nativeGetGenre(long genreId);
+    private native AbstractPlaylist[] nativeGetPlaylists(int sort, boolean desc);
+    private native AbstractPlaylist[] nativeGetPagedPlaylists(int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetPlaylistsCount();
-    private native APlaylist nativeGetPlaylist(long playlistId);
-    private native APlaylist nativePlaylistCreate(String name);
-    private native AFolder[] nativeGetFolders(int type, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractPlaylist nativeGetPlaylist(long playlistId);
+    private native AbstractPlaylist nativePlaylistCreate(String name);
+    private native AbstractFolder[] nativeGetFolders(int type, int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetFoldersCount(int type);
     private native void nativePauseBackgroundOperations();
     private native void nativeResumeBackgroundOperations();
@@ -548,24 +543,24 @@ public class Medialibrary extends AMedialibrary {
     private native void nativeSetMediaUpdatedCbFlag(int flags);
     private native void nativeSetMediaAddedCbFlag(int flags);
     private native SearchAggregate nativeSearch(String query);
-    private native AMediaWrapper[] nativeSearchMedia(String query);
-    private native AMediaWrapper[] nativeSearchPagedMedia(String query, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractMediaWrapper[] nativeSearchMedia(String query);
+    private native AbstractMediaWrapper[] nativeSearchPagedMedia(String query, int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetSearchMediaCount(String query);
-    private native AMediaWrapper[] nativeSearchPagedAudio(String query, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractMediaWrapper[] nativeSearchPagedAudio(String query, int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetSearchAudioCount(String query);
-    private native AMediaWrapper[] nativeSearchPagedVideo(String query, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractMediaWrapper[] nativeSearchPagedVideo(String query, int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetSearchVideoCount(String query);
-    private native AArtist[] nativeSearchArtist(String query);
-    private native AArtist[] nativeSearchPagedArtist(String query, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractArtist[] nativeSearchArtist(String query);
+    private native AbstractArtist[] nativeSearchPagedArtist(String query, int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetArtistsSearchCount(String query);
-    private native AAlbum[] nativeSearchAlbum(String query);
-    private native AAlbum[] nativeSearchPagedAlbum(String query, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractAlbum[] nativeSearchAlbum(String query);
+    private native AbstractAlbum[] nativeSearchPagedAlbum(String query, int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetAlbumSearchCount(String query);
-    private native AGenre[] nativeSearchGenre(String query);
-    private native AGenre[] nativeSearchPagedGenre(String query, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractGenre[] nativeSearchGenre(String query);
+    private native AbstractGenre[] nativeSearchPagedGenre(String query, int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetGenreSearchCount(String query);
-    private native APlaylist[] nativeSearchPlaylist(String query);
-    private native APlaylist[] nativeSearchPagedPlaylist(String query, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractPlaylist[] nativeSearchPlaylist(String query);
+    private native AbstractPlaylist[] nativeSearchPagedPlaylist(String query, int sort, boolean desc, int nbItems, int offset);
     private native int nativeGetPlaylistSearchCount(String query);
     private native void nativeRequestThumbnail(long mediaId);
 }
diff --git a/medialibrary/src/org/videolan/medialibrary/Tools.java b/medialibrary/src/org/videolan/medialibrary/Tools.java
index a3ae35a328..39c10f065f 100644
--- a/medialibrary/src/org/videolan/medialibrary/Tools.java
+++ b/medialibrary/src/org/videolan/medialibrary/Tools.java
@@ -5,7 +5,7 @@ import android.net.Uri;
 import android.os.Environment;
 import android.text.TextUtils;
 
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 import org.videolan.medialibrary.media.MediaLibraryItem;
 
 import java.text.DecimalFormat;
@@ -36,7 +36,7 @@ public class Tools {
     public static boolean isArrayEmpty(@Nullable Object[] array) {
         return array == null || array.length == 0;
     }
-    public static String getProgressText(AMediaWrapper media) {
+    public static String getProgressText(AbstractMediaWrapper media) {
         long lastTime = media.getTime();
         if (lastTime == 0L) return "";
         return String.format("%s / %s",
@@ -62,7 +62,7 @@ public class Tools {
         return millisToString(millis, true, true);
     }
 
-    public static String getResolution(AMediaWrapper media) {
+    public static String getResolution(AbstractMediaWrapper media) {
         if (media.getWidth() > 0 && media.getHeight() > 0)
             return String.format(Locale.US, "%dx%d", media.getWidth(), media.getHeight());
         return "";
@@ -70,8 +70,8 @@ public class Tools {
 
     public static void setMediaDescription (MediaLibraryItem item) {
         if (item.getItemType() == MediaLibraryItem.TYPE_MEDIA) {
-            final AMediaWrapper mw = (AMediaWrapper) item;
-            if (mw.getType() == AMediaWrapper.TYPE_VIDEO) {
+            final AbstractMediaWrapper mw = (AbstractMediaWrapper) item;
+            if (mw.getType() == AbstractMediaWrapper.TYPE_VIDEO) {
                 final String progress = mw.getLength() == 0L ? null : mw.getTime() == 0L ? Tools.millisToString(mw.getLength()) : getProgressText(mw);
                 final String resolution = getResolution(mw);
                 boolean hasprogress = !TextUtils.isEmpty(progress), hasResolution = !TextUtils.isEmpty(resolution);
@@ -80,7 +80,7 @@ public class Tools {
                 else if (hasprogress) sb.append(progress);
                 else sb.append(resolution);
                 item.setDescription(sb.toString());
-            } else if (mw.getType() == AMediaWrapper.TYPE_AUDIO) {
+            } else if (mw.getType() == AbstractMediaWrapper.TYPE_AUDIO) {
                 final String artist = mw.getReferenceArtist(), album = mw.getAlbum();
                 final StringBuilder sb = new StringBuilder();
                 boolean hasArtist = !TextUtils.isEmpty(artist), hasAlbum = !TextUtils.isEmpty(album);
diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/AMedialibrary.java b/medialibrary/src/org/videolan/medialibrary/interfaces/AbstractMedialibrary.java
similarity index 81%
rename from medialibrary/src/org/videolan/medialibrary/interfaces/AMedialibrary.java
rename to medialibrary/src/org/videolan/medialibrary/interfaces/AbstractMedialibrary.java
index a524ff3a32..8531ef9a72 100644
--- a/medialibrary/src/org/videolan/medialibrary/interfaces/AMedialibrary.java
+++ b/medialibrary/src/org/videolan/medialibrary/interfaces/AbstractMedialibrary.java
@@ -18,12 +18,12 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 import org.videolan.medialibrary.MLServiceLocator;
 import org.videolan.medialibrary.SingleEvent;
 import org.videolan.medialibrary.Tools;
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AFolder;
-import org.videolan.medialibrary.interfaces.media.AGenre;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
-import org.videolan.medialibrary.interfaces.media.APlaylist;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractFolder;
+import org.videolan.medialibrary.interfaces.media.AbstractGenre;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
 import org.videolan.medialibrary.media.SearchAggregate;
 
 import java.io.File;
@@ -31,7 +31,7 @@ import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
 
-abstract public class AMedialibrary {
+abstract public class AbstractMedialibrary {
 
     // Sorting
     public final static int SORT_DEFAULT = 0;
@@ -64,7 +64,7 @@ abstract public class AMedialibrary {
     public static final String ACTION_IDLE = "action_idle";
     public static final String STATE_IDLE = "state_idle";
 
-    public static final AMediaWrapper[] EMPTY_COLLECTION = {};
+    public static final AbstractMediaWrapper[] EMPTY_COLLECTION = {};
     public static final String VLC_MEDIA_DB_NAME = "/vlc_media.db";
     public static final String THUMBS_FOLDER_NAME = "/thumbs";
 
@@ -83,9 +83,9 @@ abstract public class AMedialibrary {
     protected final List<DevicesDiscoveryCb> devicesDiscoveryCbList = new ArrayList<>();
     protected final List<EntryPointsEventsCb> entryPointsEventsCbList = new ArrayList<>();
     protected static Context sContext;
-    public static LiveData<AMediaWrapper> lastThumb = new SingleEvent<>();
+    public static LiveData<AbstractMediaWrapper> lastThumb = new SingleEvent<>();
 
-    protected static final AMedialibrary instance = MLServiceLocator.getAMedialibrary();
+    protected static final AbstractMedialibrary instance = MLServiceLocator.getAbstractMedialibrary();
 
     public static Context getContext() {
         return sContext;
@@ -104,7 +104,7 @@ abstract public class AMedialibrary {
     }
 
     @NonNull
-    public static AMedialibrary getInstance() {
+    public static AbstractMedialibrary getInstance() {
         return instance;
     }
 
@@ -201,17 +201,17 @@ abstract public class AMedialibrary {
     }
 
     // If media is not in ML, find it with its path
-    public AMediaWrapper findMedia(AMediaWrapper mw) {
+    public AbstractMediaWrapper findMedia(AbstractMediaWrapper mw) {
         if (mIsInitiated && mw != null && mw.getId() == 0L) {
             final Uri uri = mw.getUri();
-            final AMediaWrapper libraryMedia = getMedia(uri);
+            final AbstractMediaWrapper libraryMedia = getMedia(uri);
             if (libraryMedia != null) {
                 libraryMedia.addFlags(mw.getFlags());
                 return libraryMedia;
             }
             if (TextUtils.equals("file", uri.getScheme()) &&
                     uri.getPath() != null && uri.getPath().startsWith("/sdcard")) {
-                final AMediaWrapper alternateMedia = getMedia(Tools.convertLocalUri(uri));
+                final AbstractMediaWrapper alternateMedia = getMedia(Tools.convertLocalUri(uri));
                 if (alternateMedia != null) {
                     alternateMedia.addFlags(mw.getFlags());
                     return alternateMedia;
@@ -222,14 +222,14 @@ abstract public class AMedialibrary {
     }
 
     @SuppressWarnings("unused")
-    public void onMediaAdded(AMediaWrapper[] mediaList) {
+    public void onMediaAdded(AbstractMediaWrapper[] mediaList) {
         synchronized (mMediaCbs) {
             for (MediaCb cb : mMediaCbs) cb.onMediaAdded();
         }
     }
 
     @SuppressWarnings("unused")
-    public void onMediaUpdated(AMediaWrapper[] mediaList) {
+    public void onMediaUpdated(AbstractMediaWrapper[] mediaList) {
         synchronized (mMediaCbs) {
             for (MediaCb cb : mMediaCbs) cb.onMediaModified();
         }
@@ -440,9 +440,9 @@ abstract public class AMedialibrary {
         }
     }
 
-    //    public static LiveData<AMediaWrapper> lastThumb = new SingleEvent<>();
+    //    public static LiveData<AbstractMediaWrapper> lastThumb = new SingleEvent<>();
     @SuppressWarnings({"unused", "unchecked"})
-    public void onMediaThumbnailReady(AMediaWrapper media, boolean success) {
+    public void onMediaThumbnailReady(AbstractMediaWrapper media, boolean success) {
         if (success) ((MutableLiveData)lastThumb).postValue(media);
     }
 
@@ -586,75 +586,75 @@ abstract public class AMedialibrary {
     abstract public void removeFolder(@NonNull String mrl);
     abstract public String[] getFoldersList();
     abstract public boolean removeDevice(String uuid, String path);
-    abstract public AMediaWrapper[] getVideos();
-    abstract public AMediaWrapper[] getPagedVideos(int sort, boolean desc, int nbItems, int offset);
-    abstract public AMediaWrapper[] getVideos(int sort, boolean desc);
-    abstract public AMediaWrapper[] getRecentVideos();
-    abstract public AMediaWrapper[] getAudio();
-    abstract public AMediaWrapper[] getAudio(int sort, boolean desc);
-    abstract public AMediaWrapper[] getPagedAudio(int sort, boolean desc, int nbitems, int offset);
-    abstract public AMediaWrapper[] getRecentAudio();
+    abstract public AbstractMediaWrapper[] getVideos();
+    abstract public AbstractMediaWrapper[] getPagedVideos(int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] getVideos(int sort, boolean desc);
+    abstract public AbstractMediaWrapper[] getRecentVideos();
+    abstract public AbstractMediaWrapper[] getAudio();
+    abstract public AbstractMediaWrapper[] getAudio(int sort, boolean desc);
+    abstract public AbstractMediaWrapper[] getPagedAudio(int sort, boolean desc, int nbitems, int offset);
+    abstract public AbstractMediaWrapper[] getRecentAudio();
     abstract public int getVideoCount();
     abstract public int getAudioCount();
-    abstract public AAlbum[] getAlbums();
-    abstract public AAlbum[] getAlbums(int sort, boolean desc);
-    abstract public AAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractAlbum[] getAlbums();
+    abstract public AbstractAlbum[] getAlbums(int sort, boolean desc);
+    abstract public AbstractAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset);
     abstract public int getAlbumsCount();
     abstract public int getAlbumsCount(String query);
-    abstract public AAlbum getAlbum(long albumId);
-    abstract public AArtist[] getArtists(boolean all);
-    abstract public AArtist[] getArtists(boolean all, int sort, boolean desc);
-    abstract public AArtist[] getPagedArtists(boolean all, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractAlbum getAlbum(long albumId);
+    abstract public AbstractArtist[] getArtists(boolean all);
+    abstract public AbstractArtist[] getArtists(boolean all, int sort, boolean desc);
+    abstract public AbstractArtist[] getPagedArtists(boolean all, int sort, boolean desc, int nbItems, int offset);
     abstract public int getArtistsCount(boolean all);
     abstract public int getArtistsCount(String query);
-    abstract public AArtist getArtist(long artistId);
-    abstract public AGenre[] getGenres();
-    abstract public AGenre[] getGenres(int sort, boolean desc);
-    abstract public AGenre[] getPagedGenres(int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractArtist getArtist(long artistId);
+    abstract public AbstractGenre[] getGenres();
+    abstract public AbstractGenre[] getGenres(int sort, boolean desc);
+    abstract public AbstractGenre[] getPagedGenres(int sort, boolean desc, int nbItems, int offset);
     abstract public int getGenresCount();
     abstract public int getGenresCount(String query);
-    abstract public AGenre getGenre(long genreId);
-    abstract public APlaylist[] getPlaylists(int sort, boolean desc);
-    abstract public APlaylist[] getPlaylists();
-    abstract public APlaylist[] getPagedPlaylists(int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractGenre getGenre(long genreId);
+    abstract public AbstractPlaylist[] getPlaylists(int sort, boolean desc);
+    abstract public AbstractPlaylist[] getPlaylists();
+    abstract public AbstractPlaylist[] getPagedPlaylists(int sort, boolean desc, int nbItems, int offset);
     abstract public int getPlaylistsCount();
     abstract public int getPlaylistsCount(String query);
-    abstract public APlaylist getPlaylist(long playlistId);
-    abstract public APlaylist createPlaylist(String name);
+    abstract public AbstractPlaylist getPlaylist(long playlistId);
+    abstract public AbstractPlaylist createPlaylist(String name);
     abstract public void pauseBackgroundOperations();
     abstract public void resumeBackgroundOperations();
     abstract public void reload();
     abstract public void reload(String entrypoint);
     abstract public void forceParserRetry();
     abstract public void forceRescan();
-    abstract public AMediaWrapper[] lastMediaPlayed();
-    abstract public AMediaWrapper[] lastStreamsPlayed();
+    abstract public AbstractMediaWrapper[] lastMediaPlayed();
+    abstract public AbstractMediaWrapper[] lastStreamsPlayed();
     abstract public boolean clearHistory();
     abstract public boolean addToHistory(String mrl, String title);
-    abstract public AMediaWrapper getMedia(long id);
-    abstract public AMediaWrapper getMedia(Uri uri);
-    abstract public AMediaWrapper getMedia(String mrl);
-    abstract public AMediaWrapper addMedia(String mrl);
+    abstract public AbstractMediaWrapper getMedia(long id);
+    abstract public AbstractMediaWrapper getMedia(Uri uri);
+    abstract public AbstractMediaWrapper getMedia(String mrl);
+    abstract public AbstractMediaWrapper addMedia(String mrl);
     abstract public boolean removeExternalMedia(long id);
-    abstract public AMediaWrapper addStream(String mrl, String title);
-    abstract public AFolder[] getFolders(int type, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper addStream(String mrl, String title);
+    abstract public AbstractFolder[] getFolders(int type, int sort, boolean desc, int nbItems, int offset);
     abstract public int getFoldersCount(int type);
     abstract public void requestThumbnail(long id);
     abstract public boolean increasePlayCount(long mediaId);
     abstract public SearchAggregate search(String query);
-    abstract public AMediaWrapper[] searchMedia(String query);
-    abstract public AMediaWrapper[] searchMedia(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] searchMedia(String query);
+    abstract public AbstractMediaWrapper[] searchMedia(String query, int sort, boolean desc, int nbItems, int offset);
     abstract public int getMediaCount(String query);
-    abstract public AMediaWrapper[] searchAudio(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] searchAudio(String query, int sort, boolean desc, int nbItems, int offset);
     abstract public int getAudioCount(String query);
-    abstract public AMediaWrapper[] searchVideo(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] searchVideo(String query, int sort, boolean desc, int nbItems, int offset);
     abstract public int getVideoCount(String query);
-    abstract public AArtist[] searchArtist(String query);
-    abstract public AArtist[] searchArtist(String query, int sort, boolean desc, int nbItems, int offset);
-    abstract public AAlbum[] searchAlbum(String query);
-    abstract public AAlbum[] searchAlbum(String query, int sort, boolean desc, int nbItems, int offset);
-    abstract public AGenre[] searchGenre(String query);
-    abstract public AGenre[] searchGenre(String query, int sort, boolean desc, int nbItems, int offset);
-    abstract public APlaylist[] searchPlaylist(String query);
-    abstract public APlaylist[] searchPlaylist(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractArtist[] searchArtist(String query);
+    abstract public AbstractArtist[] searchArtist(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractAlbum[] searchAlbum(String query);
+    abstract public AbstractAlbum[] searchAlbum(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractGenre[] searchGenre(String query);
+    abstract public AbstractGenre[] searchGenre(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractPlaylist[] searchPlaylist(String query);
+    abstract public AbstractPlaylist[] searchPlaylist(String query, int sort, boolean desc, int nbItems, int offset);
 }
diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AGenre.java b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AGenre.java
deleted file mode 100644
index 9cb3a970b5..0000000000
--- a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AGenre.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.videolan.medialibrary.interfaces.media;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import org.videolan.medialibrary.MLServiceLocator;
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.media.MediaLibraryItem;
-
-public abstract class AGenre extends MediaLibraryItem {
-
-    public AGenre(long id, String title) { super(id, title); }
-    public AGenre(Parcel in) { super(in); }
-
-    abstract public AAlbum[] getAlbums(int sort, boolean desc);
-    abstract public AAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset);
-    abstract public AArtist[] getArtists(int sort, boolean desc);
-    abstract public AMediaWrapper[] getTracks(int sort, boolean desc);
-    abstract public AMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset);
-    abstract public int getTracksCount();
-    abstract public int getAlbumsCount();
-    abstract public AAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset);
-    abstract public int searchAlbumsCount(String query);
-    abstract public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset);
-    abstract public int searchTracksCount(String query);
-
-    public AAlbum[] getAlbums() {
-        return getAlbums(AMedialibrary.SORT_DEFAULT, false);
-    }
-    public AArtist[] getArtists() {
-        return getArtists(AMedialibrary.SORT_DEFAULT, false);
-    }
-    public AMediaWrapper[] getTracks() {
-        return getTracks(AMedialibrary.SORT_ALBUM, false);
-    }
-    @Override
-    public int getItemType() {
-        return TYPE_GENRE;
-    }
-
-    public static Parcelable.Creator<AGenre> CREATOR
-            = new Parcelable.Creator<AGenre>() {
-        @Override
-        public AGenre createFromParcel(Parcel in) {
-            return MLServiceLocator.getAGenre(in);
-        }
-
-        @Override
-        public AGenre[] newArray(int size) {
-            return new AGenre[size];
-        }
-    };
-
-}
diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AAlbum.java b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractAlbum.java
similarity index 63%
rename from medialibrary/src/org/videolan/medialibrary/interfaces/media/AAlbum.java
rename to medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractAlbum.java
index a61efff6d9..747b47f1d7 100644
--- a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AAlbum.java
+++ b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractAlbum.java
@@ -7,12 +7,12 @@ import android.text.TextUtils;
 import org.videolan.libvlc.util.VLCUtil;
 import org.videolan.medialibrary.R;
 import org.videolan.medialibrary.MLServiceLocator;
-import org.videolan.medialibrary.interfaces.AMedialibrary;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
 import org.videolan.medialibrary.media.MediaLibraryItem;
 
-public abstract class AAlbum extends MediaLibraryItem {
+public abstract class AbstractAlbum extends MediaLibraryItem {
     public static class SpecialRes {
-        public static String UNKNOWN_ALBUM = AMedialibrary.getContext().getString(R.string.unknown_album);
+        public static String UNKNOWN_ALBUM = AbstractMedialibrary.getContext().getString(R.string.unknown_album);
     }
 
     protected int releaseYear;
@@ -22,7 +22,7 @@ public abstract class AAlbum extends MediaLibraryItem {
     protected int mTracksCount;
     protected int duration;
 
-    public AAlbum(long id, String title, int releaseYear, String artworkMrl, String albumArtist, long albumArtistId, int nbTracks, int duration) {
+    public AbstractAlbum(long id, String title, int releaseYear, String artworkMrl, String albumArtist, long albumArtistId, int nbTracks, int duration) {
         super(id, title);
         this.releaseYear = releaseYear;
         this.artworkMrl = artworkMrl != null ? VLCUtil.UriFromMrl(artworkMrl).getPath() : null;
@@ -32,13 +32,13 @@ public abstract class AAlbum extends MediaLibraryItem {
         this.duration = duration;
         if (TextUtils.isEmpty(title)) mTitle = SpecialRes.UNKNOWN_ALBUM;
         if (albumArtistId == 1L) {
-            this.albumArtist = AArtist.SpecialRes.UNKNOWN_ARTIST;
+            this.albumArtist = AbstractArtist.SpecialRes.UNKNOWN_ARTIST;
         } else if (albumArtistId == 2L) {
-            this.albumArtist = AArtist.SpecialRes.VARIOUS_ARTISTS;
+            this.albumArtist = AbstractArtist.SpecialRes.VARIOUS_ARTISTS;
         }
     }
 
-    protected AAlbum(Parcel in) {
+    protected AbstractAlbum(Parcel in) {
         super(in);
         this.releaseYear = in.readInt();
         this.artworkMrl = in.readString();
@@ -49,11 +49,11 @@ public abstract class AAlbum extends MediaLibraryItem {
     }
 
     abstract public int getRealTracksCount();
-    abstract public AMediaWrapper[] getTracks(int sort, boolean desc);
-    abstract public AMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset);
-    abstract public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] getTracks(int sort, boolean desc);
+    abstract public AbstractMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset);
     abstract public int searchTracksCount(String query);
-    abstract public AArtist getAlbumArtist();
+    abstract public AbstractArtist getAlbumArtist();
 
     @Override
     public long getId() {
@@ -84,8 +84,8 @@ public abstract class AAlbum extends MediaLibraryItem {
     }
 
     @Override
-    public AMediaWrapper[] getTracks() {
-        return getTracks(AMedialibrary.SORT_ALBUM, false);
+    public AbstractMediaWrapper[] getTracks() {
+        return getTracks(AbstractMedialibrary.SORT_ALBUM, false);
     }
 
     @Override
@@ -93,16 +93,16 @@ public abstract class AAlbum extends MediaLibraryItem {
         return TYPE_ALBUM;
     }
 
-    public static Parcelable.Creator<AAlbum> CREATOR
-            = new Parcelable.Creator<AAlbum>() {
+    public static Parcelable.Creator<AbstractAlbum> CREATOR
+            = new Parcelable.Creator<AbstractAlbum>() {
         @Override
-        public AAlbum createFromParcel(Parcel in) {
-            return MLServiceLocator.getAAlbum(in);
+        public AbstractAlbum createFromParcel(Parcel in) {
+            return MLServiceLocator.getAbstractAlbum(in);
         }
 
         @Override
-        public AAlbum[] newArray(int size) {
-            return new AAlbum[size];
+        public AbstractAlbum[] newArray(int size) {
+            return new AbstractAlbum[size];
         }
     };
 
diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AArtist.java b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractArtist.java
similarity index 56%
rename from medialibrary/src/org/videolan/medialibrary/interfaces/media/AArtist.java
rename to medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractArtist.java
index 9ff83b510a..4f0c34b05b 100644
--- a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AArtist.java
+++ b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractArtist.java
@@ -6,21 +6,21 @@ import android.os.Parcelable;
 import org.videolan.libvlc.util.VLCUtil;
 import org.videolan.medialibrary.R;
 import org.videolan.medialibrary.MLServiceLocator;
-import org.videolan.medialibrary.interfaces.AMedialibrary;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
 import org.videolan.medialibrary.media.MediaLibraryItem;
 
-abstract public class AArtist extends MediaLibraryItem {
+abstract public class AbstractArtist extends MediaLibraryItem {
 
     private String shortBio;
     private String artworkMrl;
     private String musicBrainzId;
 
     public static class SpecialRes {
-        public static String UNKNOWN_ARTIST = AMedialibrary.getContext().getString(R.string.unknown_artist);
-        public static String VARIOUS_ARTISTS = AMedialibrary.getContext().getString(R.string.various_artists);
+        public static String UNKNOWN_ARTIST = AbstractMedialibrary.getContext().getString(R.string.unknown_artist);
+        public static String VARIOUS_ARTISTS = AbstractMedialibrary.getContext().getString(R.string.various_artists);
     }
 
-    public AArtist(long id, String name, String shortBio, String artworkMrl, String musicBrainzId) {
+    public AbstractArtist(long id, String name, String shortBio, String artworkMrl, String musicBrainzId) {
         super(id, name);
         this.shortBio = shortBio;
         this.artworkMrl = artworkMrl != null ? VLCUtil.UriFromMrl(artworkMrl).getPath() : null;
@@ -32,15 +32,15 @@ abstract public class AArtist extends MediaLibraryItem {
         }
     }
 
-    abstract public AAlbum[] getAlbums(int sort, boolean desc);
-    abstract public AAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset);
-    abstract public AAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractAlbum[] getAlbums(int sort, boolean desc);
+    abstract public AbstractAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset);
     abstract public int searchAlbumsCount(String query);
-    abstract public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset);
     abstract public int searchTracksCount(String query);
     abstract public int getAlbumsCount();
-    abstract public AMediaWrapper[] getTracks(int sort, boolean desc);
-    abstract public AMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] getTracks(int sort, boolean desc);
+    abstract public AbstractMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset);
     abstract public int getTracksCount();
 
     public String getShortBio() {
@@ -64,13 +64,13 @@ abstract public class AArtist extends MediaLibraryItem {
         this.artworkMrl = artworkMrl;
     }
 
-    public AAlbum[] getAlbums() {
-        return getAlbums(AMedialibrary.SORT_DEFAULT, false);
+    public AbstractAlbum[] getAlbums() {
+        return getAlbums(AbstractMedialibrary.SORT_DEFAULT, false);
     }
 
     @Override
-    public AMediaWrapper[] getTracks() {
-        return getTracks(AMedialibrary.SORT_ALBUM, true);
+    public AbstractMediaWrapper[] getTracks() {
+        return getTracks(AbstractMedialibrary.SORT_ALBUM, true);
     }
 
     @Override
@@ -86,20 +86,20 @@ abstract public class AArtist extends MediaLibraryItem {
         parcel.writeString(musicBrainzId);
     }
 
-    public static Parcelable.Creator<AArtist> CREATOR
-            = new Parcelable.Creator<AArtist>() {
+    public static Parcelable.Creator<AbstractArtist> CREATOR
+            = new Parcelable.Creator<AbstractArtist>() {
         @Override
-        public AArtist createFromParcel(Parcel in) {
-            return MLServiceLocator.getAArtist(in);
+        public AbstractArtist createFromParcel(Parcel in) {
+            return MLServiceLocator.getAbstractArtist(in);
         }
 
         @Override
-        public AArtist[] newArray(int size) {
-            return new AArtist[size];
+        public AbstractArtist[] newArray(int size) {
+            return new AbstractArtist[size];
         }
     };
 
-    public AArtist(Parcel in) {
+    public AbstractArtist(Parcel in) {
         super(in);
         this.shortBio = in.readString();
         this.artworkMrl = in.readString();
diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AFolder.java b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractFolder.java
similarity index 55%
rename from medialibrary/src/org/videolan/medialibrary/interfaces/media/AFolder.java
rename to medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractFolder.java
index 8a9a244fc7..c578141b02 100644
--- a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AFolder.java
+++ b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractFolder.java
@@ -6,7 +6,7 @@ import android.os.Parcelable;
 import org.videolan.medialibrary.MLServiceLocator;
 import org.videolan.medialibrary.media.MediaLibraryItem;
 
-public abstract class AFolder extends MediaLibraryItem {
+public abstract class AbstractFolder extends MediaLibraryItem {
     public static int TYPE_FOLDER_UNKNOWN = 0;
     public static int TYPE_FOLDER_VIDEO = 1;
     public static int TYPE_FOLDER_AUDIO = 2;
@@ -15,21 +15,21 @@ public abstract class AFolder extends MediaLibraryItem {
 
     public String mMrl;
 
-    public AFolder(long id, String name, String mrl) {
+    public AbstractFolder(long id, String name, String mrl) {
         super(id, name);
         mMrl = mrl;
     }
 
-    abstract public AMediaWrapper[] media(int type, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] media(int type, int sort, boolean desc, int nbItems, int offset);
     abstract public int mediaCount(int type);
-    abstract public AFolder[] subfolders(int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractFolder[] subfolders(int sort, boolean desc, int nbItems, int offset);
     abstract public int subfoldersCount(int type);
-    abstract public AMediaWrapper[] searchTracks(String query, int mediaType, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] searchTracks(String query, int mediaType, int sort, boolean desc, int nbItems, int offset);
     abstract public int searchTracksCount(String query, int mediaType);
 
     @Override
-    public AMediaWrapper[] getTracks() {
-        return new AMediaWrapper[0];
+    public AbstractMediaWrapper[] getTracks() {
+        return new AbstractMediaWrapper[0];
     }
 
     @Override
@@ -48,19 +48,19 @@ public abstract class AFolder extends MediaLibraryItem {
         parcel.writeString(mMrl);
     }
 
-    public static Parcelable.Creator<AFolder> CREATOR = new Parcelable.Creator<AFolder>() {
+    public static Parcelable.Creator<AbstractFolder> CREATOR = new Parcelable.Creator<AbstractFolder>() {
         @Override
-        public AFolder createFromParcel(Parcel in) {
-            return MLServiceLocator.getAFolder(in);
+        public AbstractFolder createFromParcel(Parcel in) {
+            return MLServiceLocator.getAbstractFolder(in);
         }
 
         @Override
-        public AFolder[] newArray(int size) {
-            return new AFolder[size];
+        public AbstractFolder[] newArray(int size) {
+            return new AbstractFolder[size];
         }
     };
 
-    public AFolder(Parcel in) {
+    public AbstractFolder(Parcel in) {
         super(in);
         this.mMrl = in.readString();
     }
diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractGenre.java b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractGenre.java
new file mode 100644
index 0000000000..97df92b862
--- /dev/null
+++ b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractGenre.java
@@ -0,0 +1,54 @@
+package org.videolan.medialibrary.interfaces.media;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import org.videolan.medialibrary.MLServiceLocator;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.media.MediaLibraryItem;
+
+public abstract class AbstractGenre extends MediaLibraryItem {
+
+    public AbstractGenre(long id, String title) { super(id, title); }
+    public AbstractGenre(Parcel in) { super(in); }
+
+    abstract public AbstractAlbum[] getAlbums(int sort, boolean desc);
+    abstract public AbstractAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractArtist[] getArtists(int sort, boolean desc);
+    abstract public AbstractMediaWrapper[] getTracks(int sort, boolean desc);
+    abstract public AbstractMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset);
+    abstract public int getTracksCount();
+    abstract public int getAlbumsCount();
+    abstract public AbstractAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public int searchAlbumsCount(String query);
+    abstract public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public int searchTracksCount(String query);
+
+    public AbstractAlbum[] getAlbums() {
+        return getAlbums(AbstractMedialibrary.SORT_DEFAULT, false);
+    }
+    public AbstractArtist[] getArtists() {
+        return getArtists(AbstractMedialibrary.SORT_DEFAULT, false);
+    }
+    public AbstractMediaWrapper[] getTracks() {
+        return getTracks(AbstractMedialibrary.SORT_ALBUM, false);
+    }
+    @Override
+    public int getItemType() {
+        return TYPE_GENRE;
+    }
+
+    public static Parcelable.Creator<AbstractGenre> CREATOR
+            = new Parcelable.Creator<AbstractGenre>() {
+        @Override
+        public AbstractGenre createFromParcel(Parcel in) {
+            return MLServiceLocator.getAbstractGenre(in);
+        }
+
+        @Override
+        public AbstractGenre[] newArray(int size) {
+            return new AbstractGenre[size];
+        }
+    };
+
+}
diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AMediaWrapper.java b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractMediaWrapper.java
similarity index 92%
rename from medialibrary/src/org/videolan/medialibrary/interfaces/media/AMediaWrapper.java
rename to medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractMediaWrapper.java
index 55d0772a76..f2a68b9edf 100644
--- a/medialibrary/src/org/videolan/medialibrary/interfaces/media/AMediaWrapper.java
+++ b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractMediaWrapper.java
@@ -18,7 +18,7 @@ import org.videolan.medialibrary.media.MediaLibraryItem;
 
 import java.util.Locale;
 
-public abstract class AMediaWrapper extends MediaLibraryItem implements Parcelable {
+public abstract class AbstractMediaWrapper extends MediaLibraryItem implements Parcelable {
     public final static int TYPE_ALL = -1;
     public final static int TYPE_VIDEO = 0;
     public final static int TYPE_AUDIO = 1;
@@ -110,14 +110,14 @@ public abstract class AMediaWrapper extends MediaLibraryItem implements Parcelab
     public abstract void setThumbnail(String mrl);
 
     /**
-     * Create a new AMediaWrapper
+     * Create a new AbstractMediaWrapper
      *
      * @param mrl Should not be null.
      */
-    public AMediaWrapper(long id, String mrl, long time, long length, int type, String title,
-                        String filename, String artist, String genre, String album, String albumArtist,
-                        int width, int height, String artworkURL, int audio, int spu, int trackNumber,
-                        int discNumber, long lastModified, long seen, boolean isThumbnailGenerated) {
+    public AbstractMediaWrapper(long id, String mrl, long time, long length, int type, String title,
+                                String filename, String artist, String genre, String album, String albumArtist,
+                                int width, int height, String artworkURL, int audio, int spu, int trackNumber,
+                                int discNumber, long lastModified, long seen, boolean isThumbnailGenerated) {
         super();
         if (TextUtils.isEmpty(mrl)) throw new IllegalArgumentException("uri was empty");
 
@@ -161,11 +161,11 @@ public abstract class AMediaWrapper extends MediaLibraryItem implements Parcelab
     }
 
     /**
-     * Create a new AMediaWrapper
+     * Create a new AbstractMediaWrapper
      *
      * @param uri Should not be null.
      */
-    public AMediaWrapper(Uri uri) {
+    public AbstractMediaWrapper(Uri uri) {
         super();
         if (uri == null) throw new NullPointerException("uri was null");
 
@@ -175,11 +175,11 @@ public abstract class AMediaWrapper extends MediaLibraryItem implements Parcelab
     }
 
     /**
-     * Create a new AMediaWrapper
+     * Create a new AbstractMediaWrapper
      *
      * @param media should be parsed and not NULL
      */
-    public AMediaWrapper(Media media) {
+    public AbstractMediaWrapper(Media media) {
         super();
         if (media == null)
             throw new NullPointerException("media was null");
@@ -193,10 +193,10 @@ public abstract class AMediaWrapper extends MediaLibraryItem implements Parcelab
         if (this == obj) return true;
         if (!(obj instanceof MediaLibraryItem) || ((MediaLibraryItem) obj).getItemType() != TYPE_MEDIA)
             return false;
-        return equals((AMediaWrapper) obj);
+        return equals((AbstractMediaWrapper) obj);
     }
 
-    public boolean equals(AMediaWrapper obj) {
+    public boolean equals(AbstractMediaWrapper obj) {
         long otherId = obj.getId();
         if (otherId != 0L && getId() != 0L && otherId == getId()) return true;
         final Uri otherUri = obj.getUri();
@@ -298,17 +298,17 @@ public abstract class AMediaWrapper extends MediaLibraryItem implements Parcelab
         mSlaves = slaves;
     }
 
-    public AMediaWrapper(Uri uri, long time, long length, int type,
-                        Bitmap picture, String title, String artist, String genre, String album, String albumArtist,
-                        int width, int height, String artworkURL, int audio, int spu, int trackNumber, int discNumber, long lastModified, long seen) {
+    public AbstractMediaWrapper(Uri uri, long time, long length, int type,
+                                Bitmap picture, String title, String artist, String genre, String album, String albumArtist,
+                                int width, int height, String artworkURL, int audio, int spu, int trackNumber, int discNumber, long lastModified, long seen) {
         mUri = uri;
         init(time, length, type, picture, title, artist, genre, album, albumArtist,
                 width, height, artworkURL, audio, spu, trackNumber, discNumber, lastModified, seen, null);
     }
 
     @Override
-    public AMediaWrapper[] getTracks() {
-        return new AMediaWrapper[]{this};
+    public AbstractMediaWrapper[] getTracks() {
+        return new AbstractMediaWrapper[]{this};
     }
 
     @Override
@@ -636,7 +636,7 @@ public abstract class AMediaWrapper extends MediaLibraryItem implements Parcelab
         return 0;
     }
 
-    public AMediaWrapper(Parcel in) {
+    public AbstractMediaWrapper(Parcel in) {
         super(in);
         mUri = in.readParcelable(Uri.class.getClassLoader());
         init(in.readLong(),
@@ -693,15 +693,15 @@ public abstract class AMediaWrapper extends MediaLibraryItem implements Parcelab
             dest.writeTypedArray(null, flags);
     }
 
-    public static final Parcelable.Creator<AMediaWrapper> CREATOR = new Parcelable.Creator<AMediaWrapper>() {
+    public static final Parcelable.Creator<AbstractMediaWrapper> CREATOR = new Parcelable.Creator<AbstractMediaWrapper>() {
         @Override
-        public AMediaWrapper createFromParcel(Parcel in) {
-            return MLServiceLocator.getAMediaWrapper(in);
+        public AbstractMediaWrapper createFromParcel(Parcel in) {
+            return MLServiceLocator.getAbstractMediaWrapper(in);
         }
 
         @Override
-        public AMediaWrapper[] newArray(int size) {
-            return new AMediaWrapper[size];
+        public AbstractMediaWrapper[] newArray(int size) {
+            return new AbstractMediaWrapper[size];
         }
     };
 
diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/media/APlaylist.java b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractPlaylist.java
similarity index 62%
rename from medialibrary/src/org/videolan/medialibrary/interfaces/media/APlaylist.java
rename to medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractPlaylist.java
index 722c7a8bdf..9b57bbd83f 100644
--- a/medialibrary/src/org/videolan/medialibrary/interfaces/media/APlaylist.java
+++ b/medialibrary/src/org/videolan/medialibrary/interfaces/media/AbstractPlaylist.java
@@ -8,17 +8,17 @@ import org.videolan.medialibrary.media.MediaLibraryItem;
 
 import java.util.List;
 
-public abstract class APlaylist extends MediaLibraryItem {
+public abstract class AbstractPlaylist extends MediaLibraryItem {
 
     protected int mTracksCount;
 
-    protected APlaylist(long id, String name, int trackCount) {
+    protected AbstractPlaylist(long id, String name, int trackCount) {
         super(id, name);
         mTracksCount = trackCount;
     }
 
-    abstract public AMediaWrapper[] getTracks();
-    abstract public AMediaWrapper[] getPagedTracks(int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] getTracks();
+    abstract public AbstractMediaWrapper[] getPagedTracks(int nbItems, int offset);
     abstract public int getRealTracksCount();
     abstract public boolean append(long mediaId);
     abstract public boolean append(long[] mediaIds);
@@ -27,7 +27,7 @@ public abstract class APlaylist extends MediaLibraryItem {
     abstract public boolean move(int oldPosition, int newPosition);
     abstract public boolean remove(int position);
     abstract public boolean delete();
-    abstract public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset);
+    abstract public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset);
     abstract public int searchTracksCount(String query);
 
     @Override
@@ -41,16 +41,16 @@ public abstract class APlaylist extends MediaLibraryItem {
     }
 
 
-    public static Parcelable.Creator<APlaylist> CREATOR
-            = new Parcelable.Creator<APlaylist>() {
+    public static Parcelable.Creator<AbstractPlaylist> CREATOR
+            = new Parcelable.Creator<AbstractPlaylist>() {
         @Override
-        public APlaylist createFromParcel(Parcel in) {
-            return MLServiceLocator.getAPlaylist(in);
+        public AbstractPlaylist createFromParcel(Parcel in) {
+            return MLServiceLocator.getAbstractPlaylist(in);
         }
 
         @Override
-        public APlaylist[] newArray(int size) {
-            return new APlaylist[size];
+        public AbstractPlaylist[] newArray(int size) {
+            return new AbstractPlaylist[size];
         }
     };
 
@@ -60,7 +60,7 @@ public abstract class APlaylist extends MediaLibraryItem {
         parcel.writeInt(mTracksCount);
     }
 
-    public APlaylist(Parcel in) {
+    public AbstractPlaylist(Parcel in) {
         super(in);
         this.mTracksCount = in.readInt();
     }
diff --git a/medialibrary/src/org/videolan/medialibrary/media/Album.java b/medialibrary/src/org/videolan/medialibrary/media/Album.java
index f5f344639f..dd546908a4 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/Album.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/Album.java
@@ -2,13 +2,13 @@ package org.videolan.medialibrary.media;
 
 import android.os.Parcel;
 
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 @SuppressWarnings("JniMissingFunction")
-public class Album extends AAlbum {
+public class Album extends AbstractAlbum {
     public static final String TAG = "VLC/Album";
 
     public Album(long id, String title, int releaseYear, String artworkMrl, String albumArtist, long albumArtistId, int nbTracks, int duration) {
@@ -20,38 +20,38 @@ public class Album extends AAlbum {
     }
 
     public int getRealTracksCount() {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetTracksCount(ml, mId) : 0;
     }
 
-    public AMediaWrapper[] getTracks(int sort, boolean desc) {
-        AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetTracks(ml, mId, sort, desc) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] getTracks(int sort, boolean desc) {
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetTracks(ml, mId, sort, desc) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
-    public AMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetPagedTracks(ml, mId, sort, desc, nbItems, offset) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetPagedTracks(ml, mId, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
-    public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeSearch(ml, mId, query, sort, desc, nbItems, offset) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeSearch(ml, mId, query, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     public int searchTracksCount(String query) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetSearchCount(ml, mId, query) : 0;
     }
 
-    public AArtist getAlbumArtist() {
+    public AbstractArtist getAlbumArtist() {
         //TODO
         return null;
     }
 
-    private native AMediaWrapper[] nativeGetTracks(AMedialibrary ml, long mId, int sort, boolean desc);
-    private native AMediaWrapper[] nativeGetPagedTracks(AMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
-    private native AMediaWrapper[] nativeSearch(AMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
-    private native int nativeGetTracksCount(AMedialibrary ml, long id);
-    private native int nativeGetSearchCount(AMedialibrary ml, long mId, String query);
+    private native AbstractMediaWrapper[] nativeGetTracks(AbstractMedialibrary ml, long mId, int sort, boolean desc);
+    private native AbstractMediaWrapper[] nativeGetPagedTracks(AbstractMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractMediaWrapper[] nativeSearch(AbstractMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
+    private native int nativeGetTracksCount(AbstractMedialibrary ml, long id);
+    private native int nativeGetSearchCount(AbstractMedialibrary ml, long mId, String query);
 }
diff --git a/medialibrary/src/org/videolan/medialibrary/media/Artist.java b/medialibrary/src/org/videolan/medialibrary/media/Artist.java
index c227aedb8e..08c5d1ab74 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/Artist.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/Artist.java
@@ -2,15 +2,15 @@ package org.videolan.medialibrary.media;
 
 import android.os.Parcel;
 
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 import androidx.annotation.NonNull;
 
 @SuppressWarnings("JniMissingFunction")
-public class Artist extends AArtist {
+public class Artist extends AbstractArtist {
 
     public Artist(long id, String name, String shortBio, String artworkMrl, String musicBrainzId) {
         super(id, name, shortBio, artworkMrl, musicBrainzId);
@@ -20,66 +20,66 @@ public class Artist extends AArtist {
         super(in);
     }
 
-    public AAlbum[] getAlbums(int sort, boolean desc) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetAlbums(ml, mId, sort, desc) : new AAlbum[0];
+    public AbstractAlbum[] getAlbums(int sort, boolean desc) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetAlbums(ml, mId, sort, desc) : new AbstractAlbum[0];
     }
 
     @NonNull
-    public AAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetPagedAlbums(ml, mId, sort, desc, nbItems, offset) : new AAlbum[0];
+    public AbstractAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetPagedAlbums(ml, mId, sort, desc, nbItems, offset) : new AbstractAlbum[0];
     }
 
-    public AAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeSearchAlbums(ml, mId, query, sort, desc, nbItems, offset) : new AAlbum[0];
+    public AbstractAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeSearchAlbums(ml, mId, query, sort, desc, nbItems, offset) : new AbstractAlbum[0];
     }
 
     public int searchAlbumsCount(String query) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetSearchAlbumCount(ml, mId, query) : 0;
     }
 
-    public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeSearch(ml, mId, query, sort, desc, nbItems, offset) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeSearch(ml, mId, query, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     public int searchTracksCount(String query) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetSearchCount(ml, mId, query) : 0;
     }
 
     public int getAlbumsCount() {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetAlbumsCount(ml, mId) : 0;
     }
 
-    public AMediaWrapper[] getTracks(int sort, boolean desc) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetMedia(ml, mId, sort, desc) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] getTracks(int sort, boolean desc) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetMedia(ml, mId, sort, desc) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
-    public AMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetPagedMedia(ml, mId, sort, desc, nbItems, offset) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetPagedMedia(ml, mId, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     @Override
     public int getTracksCount() {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetTracksCount(ml, mId) : 0;
     }
 
-    private native AAlbum[] nativeGetAlbums(AMedialibrary ml, long mId, int sort, boolean desc);
-    private native AMediaWrapper[] nativeGetMedia(AMedialibrary ml, long mId, int sort, boolean desc);
-    private native AAlbum[] nativeGetPagedAlbums(AMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
-    private native AMediaWrapper[] nativeGetPagedMedia(AMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
-    private native AAlbum[] nativeSearchAlbums(AMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
-    private native AMediaWrapper[] nativeSearch(AMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
-    private native int nativeGetTracksCount(AMedialibrary ml, long mId);
-    private native int nativeGetAlbumsCount(AMedialibrary ml, long mId);
-    private native int nativeGetSearchCount(AMedialibrary ml, long mId, String query);
-    private native int nativeGetSearchAlbumCount(AMedialibrary ml, long mId, String query);
+    private native AbstractAlbum[] nativeGetAlbums(AbstractMedialibrary ml, long mId, int sort, boolean desc);
+    private native AbstractMediaWrapper[] nativeGetMedia(AbstractMedialibrary ml, long mId, int sort, boolean desc);
+    private native AbstractAlbum[] nativeGetPagedAlbums(AbstractMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractMediaWrapper[] nativeGetPagedMedia(AbstractMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractAlbum[] nativeSearchAlbums(AbstractMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractMediaWrapper[] nativeSearch(AbstractMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
+    private native int nativeGetTracksCount(AbstractMedialibrary ml, long mId);
+    private native int nativeGetAlbumsCount(AbstractMedialibrary ml, long mId);
+    private native int nativeGetSearchCount(AbstractMedialibrary ml, long mId, String query);
+    private native int nativeGetSearchAlbumCount(AbstractMedialibrary ml, long mId, String query);
 }
diff --git a/medialibrary/src/org/videolan/medialibrary/media/DummyItem.java b/medialibrary/src/org/videolan/medialibrary/media/DummyItem.java
index 61dd6acc1a..0d8ed79cc2 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/DummyItem.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/DummyItem.java
@@ -4,8 +4,8 @@ import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
 
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 public class DummyItem extends MediaLibraryItem {
 
@@ -21,8 +21,8 @@ public class DummyItem extends MediaLibraryItem {
     }
 
     @Override
-    public AMediaWrapper[] getTracks() {
-        return AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] getTracks() {
+        return AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     @Override
diff --git a/medialibrary/src/org/videolan/medialibrary/media/Folder.java b/medialibrary/src/org/videolan/medialibrary/media/Folder.java
index 3494911446..89b22bd848 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/Folder.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/Folder.java
@@ -2,12 +2,12 @@ package org.videolan.medialibrary.media;
 
 import android.os.Parcel;
 
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AFolder;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractFolder;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 @SuppressWarnings("JniMissingFunction")
-public class Folder extends AFolder {
+public class Folder extends AbstractFolder {
 
     public Folder(long id, String name, String mrl) {
         super(id, name, mrl);
@@ -17,42 +17,42 @@ public class Folder extends AFolder {
         super(in);
     }
 
-    public AMediaWrapper[] media(int type, int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeMedia(ml, mId, type, sort, desc, nbItems, offset) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] media(int type, int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeMedia(ml, mId, type, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     public int mediaCount(int type) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeMediaCount(ml, mId, type) : 0;
     }
 
-    public AFolder[] subfolders(int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+    public AbstractFolder[] subfolders(int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeSubfolders(ml, mId, sort, desc, nbItems, offset) : new Folder[0];
     }
 
     public int subfoldersCount(int type) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeSubfoldersCount(ml, mId, type) : 0;
     }
 
-    public AMediaWrapper[] searchTracks(String query, int mediaType, int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeSearch(ml, mId, query, mediaType, sort, desc, nbItems, offset) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] searchTracks(String query, int mediaType, int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeSearch(ml, mId, query, mediaType, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     public int searchTracksCount(String query, int mediaType) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetSearchCount(ml, mId, query, mediaType) : 0;
     }
 
-    //    private native AMediaWrapper[] nativeGetTracks();
+    //    private native AbstractMediaWrapper[] nativeGetTracks();
 //    private native int nativeGetTracksCount();
-    private native AMediaWrapper[] nativeMedia(AMedialibrary ml, long mId, int type, int sort, boolean desc, int nbItems, int offset);
-    private native int nativeMediaCount(AMedialibrary ml, long mId, int type);
-    private native AFolder[] nativeSubfolders(AMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
-    private native int nativeSubfoldersCount(AMedialibrary ml, long mId, int type);
-    private native AMediaWrapper[] nativeSearch(AMedialibrary ml, long mId, String query, int mediaType, int sort, boolean desc, int nbItems, int offset);
-    private native int nativeGetSearchCount(AMedialibrary ml, long mId, String query, int mediaType);
+    private native AbstractMediaWrapper[] nativeMedia(AbstractMedialibrary ml, long mId, int type, int sort, boolean desc, int nbItems, int offset);
+    private native int nativeMediaCount(AbstractMedialibrary ml, long mId, int type);
+    private native AbstractFolder[] nativeSubfolders(AbstractMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
+    private native int nativeSubfoldersCount(AbstractMedialibrary ml, long mId, int type);
+    private native AbstractMediaWrapper[] nativeSearch(AbstractMedialibrary ml, long mId, String query, int mediaType, int sort, boolean desc, int nbItems, int offset);
+    private native int nativeGetSearchCount(AbstractMedialibrary ml, long mId, String query, int mediaType);
 }
diff --git a/medialibrary/src/org/videolan/medialibrary/media/Genre.java b/medialibrary/src/org/videolan/medialibrary/media/Genre.java
index 09e4a8a1f9..2ee356f8d5 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/Genre.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/Genre.java
@@ -2,93 +2,93 @@ package org.videolan.medialibrary.media;
 
 import android.os.Parcel;
 
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AGenre;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractGenre;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 import androidx.annotation.NonNull;
 
 @SuppressWarnings("JniMissingFunction")
-public class Genre extends AGenre {
+public class Genre extends AbstractGenre {
 
     public Genre(long id, String title) {
         super(id, title);
     }
 
 
-    public AAlbum[] getAlbums(int sort, boolean desc) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetAlbums(ml, mId, sort, desc) : new AAlbum[0];
+    public AbstractAlbum[] getAlbums(int sort, boolean desc) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetAlbums(ml, mId, sort, desc) : new AbstractAlbum[0];
     }
 
     @NonNull
-    public AAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetPagedAlbums(ml, mId, sort, desc, nbItems, offset) : new AAlbum[0];
+    public AbstractAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetPagedAlbums(ml, mId, sort, desc, nbItems, offset) : new AbstractAlbum[0];
     }
 
-    public AArtist[] getArtists(int sort, boolean desc) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetArtists(ml, mId, sort, desc) : new AArtist[0];
+    public AbstractArtist[] getArtists(int sort, boolean desc) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetArtists(ml, mId, sort, desc) : new AbstractArtist[0];
     }
 
-    public AMediaWrapper[] getTracks(int sort, boolean desc) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetTracks(ml, mId, sort, desc) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] getTracks(int sort, boolean desc) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetTracks(ml, mId, sort, desc) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
-    public AMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetPagedTracks(ml, mId, sort, desc, nbItems, offset) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetPagedTracks(ml, mId, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     @Override
     public int getTracksCount() {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetTracksCount(ml, mId) : 0;
     }
 
     public int getAlbumsCount() {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetAlbumsCount(ml, mId) : 0;
     }
 
-    public AAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeSearchAlbums(ml, mId, query, sort, desc, nbItems, offset) : new AAlbum[0];
+    public AbstractAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeSearchAlbums(ml, mId, query, sort, desc, nbItems, offset) : new AbstractAlbum[0];
     }
 
     public int searchAlbumsCount(String query) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetSearchAlbumCount(ml, mId, query) : 0;
     }
 
-    public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeSearch(ml, mId, query, sort, desc, nbItems, offset) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeSearch(ml, mId, query, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     public int searchTracksCount(String query) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetSearchCount(ml, mId, query) : 0;
     }
 
-    private native AAlbum[] nativeGetAlbums(AMedialibrary ml, long mId, int sort, boolean desc);
-    private native AArtist[] nativeGetArtists(AMedialibrary ml, long mId, int sort, boolean desc);
-    private native AMediaWrapper[] nativeGetTracks(AMedialibrary ml, long mId, int sort, boolean desc);
-
-    private native AAlbum[] nativeGetPagedAlbums(AMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
-    private native AArtist[] nativeGetPagedArtists(AMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
-    private native AMediaWrapper[] nativeGetPagedTracks(AMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
-    private native int nativeGetTracksCount(AMedialibrary ml, long id);
-    private native int nativeGetAlbumsCount(AMedialibrary ml, long mId);
-    private native int nativeGetArtistsCount(AMedialibrary ml, long mId);
-    private native AAlbum[] nativeSearchAlbums(AMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
-    private native AMediaWrapper[] nativeSearch(AMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
-    private native int nativeGetSearchCount(AMedialibrary ml, long mId, String query);
-    private native int nativeGetSearchAlbumCount(AMedialibrary ml, long mId, String query);
+    private native AbstractAlbum[] nativeGetAlbums(AbstractMedialibrary ml, long mId, int sort, boolean desc);
+    private native AbstractArtist[] nativeGetArtists(AbstractMedialibrary ml, long mId, int sort, boolean desc);
+    private native AbstractMediaWrapper[] nativeGetTracks(AbstractMedialibrary ml, long mId, int sort, boolean desc);
+
+    private native AbstractAlbum[] nativeGetPagedAlbums(AbstractMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractArtist[] nativeGetPagedArtists(AbstractMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractMediaWrapper[] nativeGetPagedTracks(AbstractMedialibrary ml, long mId, int sort, boolean desc, int nbItems, int offset);
+    private native int nativeGetTracksCount(AbstractMedialibrary ml, long id);
+    private native int nativeGetAlbumsCount(AbstractMedialibrary ml, long mId);
+    private native int nativeGetArtistsCount(AbstractMedialibrary ml, long mId);
+    private native AbstractAlbum[] nativeSearchAlbums(AbstractMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
+    private native AbstractMediaWrapper[] nativeSearch(AbstractMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
+    private native int nativeGetSearchCount(AbstractMedialibrary ml, long mId, String query);
+    private native int nativeGetSearchAlbumCount(AbstractMedialibrary ml, long mId, String query);
 
     public Genre(Parcel in) {
         super(in);
diff --git a/medialibrary/src/org/videolan/medialibrary/media/HistoryItem.java b/medialibrary/src/org/videolan/medialibrary/media/HistoryItem.java
index 252066a783..048c3ca716 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/HistoryItem.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/HistoryItem.java
@@ -6,7 +6,7 @@ import android.os.Parcel;
 import android.os.Parcelable;
 
 import org.videolan.medialibrary.MLServiceLocator;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 import java.util.Date;
 
@@ -22,15 +22,15 @@ public class HistoryItem extends MediaLibraryItem {
         this.insertionDate = insertionDate;
     }
 
-    public AMediaWrapper getMedia() {
-        AMediaWrapper mw = MLServiceLocator.getAMediaWrapper(Uri.parse(mrl));
+    public AbstractMediaWrapper getMedia() {
+        AbstractMediaWrapper mw = MLServiceLocator.getAbstractMediaWrapper(Uri.parse(mrl));
         mw.setTitle(title);
-        mw.setType(AMediaWrapper.TYPE_STREAM);
+        mw.setType(AbstractMediaWrapper.TYPE_STREAM);
         return mw;
     }
     @Override
-    public AMediaWrapper[] getTracks() {
-        return new AMediaWrapper[]{getMedia()};
+    public AbstractMediaWrapper[] getTracks() {
+        return new AbstractMediaWrapper[]{getMedia()};
     }
 
     @Override
diff --git a/medialibrary/src/org/videolan/medialibrary/media/MediaLibraryItem.java b/medialibrary/src/org/videolan/medialibrary/media/MediaLibraryItem.java
index 7c4b976951..8e215d622b 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/MediaLibraryItem.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/MediaLibraryItem.java
@@ -4,7 +4,7 @@ import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
 
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 public abstract class MediaLibraryItem implements Parcelable {
 
@@ -31,7 +31,7 @@ public abstract class MediaLibraryItem implements Parcelable {
         Stream,
     }
 
-    public abstract AMediaWrapper[] getTracks();
+    public abstract AbstractMediaWrapper[] getTracks();
     public abstract int getTracksCount();
     public abstract int getItemType();
 
@@ -123,7 +123,7 @@ public abstract class MediaLibraryItem implements Parcelable {
         if (getItemType() == TYPE_DUMMY) return TextUtils.equals(getTitle(), other.getTitle());
         if (mId != 0) return mId == other.getId();
         if (getItemType() == TYPE_MEDIA)
-            return TextUtils.equals(((AMediaWrapper)this).getLocation(), ((AMediaWrapper)other).getLocation());
+            return TextUtils.equals(((AbstractMediaWrapper)this).getLocation(), ((AbstractMediaWrapper)other).getLocation());
         if (getItemType() == TYPE_STORAGE)
             return TextUtils.equals(((Storage)this).getName(), ((Storage)other).getName());
         return false;
diff --git a/medialibrary/src/org/videolan/medialibrary/media/MediaWrapper.java b/medialibrary/src/org/videolan/medialibrary/media/MediaWrapper.java
index 8e514fbc28..f320c40e42 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/MediaWrapper.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/MediaWrapper.java
@@ -27,17 +27,15 @@ import android.net.Uri;
 import android.os.Parcel;
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
-
 import org.videolan.libvlc.Media;
 import org.videolan.medialibrary.Tools;
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 import java.util.Locale;
 
 @SuppressWarnings("JniMissingFunction")
-public class MediaWrapper extends AMediaWrapper {
+public class MediaWrapper extends AbstractMediaWrapper {
     public final static String TAG = "VLC/MediaWrapper";
 
     public MediaWrapper(long id, String mrl, long time, long length, int type, String title,
@@ -63,13 +61,13 @@ public class MediaWrapper extends AMediaWrapper {
     public MediaWrapper(Parcel in) { super(in); }
 
     public void rename(String name) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         if (mId != 0 && ml.isInitiated()) nativeSetMediaTitle(ml, mId, name);
     }
 
     public void removeFromHistory() {
         if (mId != 0L) {
-            final AMedialibrary ml = AMedialibrary.getInstance();
+            final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
             if (ml.isInitiated()) nativeRemoveFromHistory(ml, mId);
         }
     }
@@ -220,24 +218,24 @@ public class MediaWrapper extends AMediaWrapper {
     }
 
     public long getMetaLong(int metaDataType) {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return mId == 0 || !ml.isInitiated() ? 0L : nativeGetMediaLongMetadata(ml, mId, metaDataType);
     }
 
     public String getMetaString(int metaDataType) {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return mId == 0 || !ml.isInitiated() ? null : nativeGetMediaStringMetadata(ml, mId, metaDataType);
     }
 
     public boolean setLongMeta(int metaDataType, long metadataValue) {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         if (mId != 0 && ml.isInitiated())
             nativeSetMediaLongMetadata(ml, mId, metaDataType, metadataValue);
         return mId != 0;
     }
 
     public boolean setStringMeta(int metaDataType, String metadataValue) {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         if (mId != 0 && ml.isInitiated())
             nativeSetMediaStringMetadata(ml, mId, metaDataType, metadataValue);
         return mId != 0;
@@ -245,15 +243,15 @@ public class MediaWrapper extends AMediaWrapper {
 
     public void setThumbnail(String mrl) {
         mArtworkURL = mrl;
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         if (mId != 0 && ml.isInitiated()) nativeSetMediaThumbnail(ml, mId, Tools.encodeVLCMrl(mrl));
     }
 
-    private native long nativeGetMediaLongMetadata(AMedialibrary ml, long id, int metaDataType);
-    private native String nativeGetMediaStringMetadata(AMedialibrary ml, long id, int metaDataType);
-    private native void nativeSetMediaStringMetadata(AMedialibrary ml, long id, int metaDataType, String metadataValue);
-    private native void nativeSetMediaLongMetadata(AMedialibrary ml, long id, int metaDataType, long metadataValue);
-    private native void nativeSetMediaThumbnail(AMedialibrary ml, long id, String mrl);
-    private native void nativeSetMediaTitle(AMedialibrary ml, long id, String name);
-    private native void nativeRemoveFromHistory(AMedialibrary ml, long id);
+    private native long nativeGetMediaLongMetadata(AbstractMedialibrary ml, long id, int metaDataType);
+    private native String nativeGetMediaStringMetadata(AbstractMedialibrary ml, long id, int metaDataType);
+    private native void nativeSetMediaStringMetadata(AbstractMedialibrary ml, long id, int metaDataType, String metadataValue);
+    private native void nativeSetMediaLongMetadata(AbstractMedialibrary ml, long id, int metaDataType, long metadataValue);
+    private native void nativeSetMediaThumbnail(AbstractMedialibrary ml, long id, String mrl);
+    private native void nativeSetMediaTitle(AbstractMedialibrary ml, long id, String name);
+    private native void nativeRemoveFromHistory(AbstractMedialibrary ml, long id);
 }
diff --git a/medialibrary/src/org/videolan/medialibrary/media/Playlist.java b/medialibrary/src/org/videolan/medialibrary/media/Playlist.java
index 088249709e..a5003a8f37 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/Playlist.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/Playlist.java
@@ -2,14 +2,14 @@ package org.videolan.medialibrary.media;
 
 import android.os.Parcel;
 
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
-import org.videolan.medialibrary.interfaces.media.APlaylist;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
 
 import java.util.List;
 
 @SuppressWarnings("JniMissingFunction")
-public class Playlist extends APlaylist {
+public class Playlist extends AbstractPlaylist {
 
     public Playlist(long id, String name, int trackCount) {
         super(id, name, trackCount);
@@ -20,34 +20,34 @@ public class Playlist extends APlaylist {
     }
 
     @Override
-    public AMediaWrapper[] getTracks() {
-        AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetTracks(ml, mId) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] getTracks() {
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetTracks(ml, mId) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
-    public AMediaWrapper[] getPagedTracks(int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeGetPagedTracks(ml, mId, nbItems, offset) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] getPagedTracks(int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeGetPagedTracks(ml, mId, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     public int getRealTracksCount() {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetTracksCount(ml, mId) : 0;
     }
 
 
     public boolean append(long mediaId) {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() && nativePlaylistAppend(ml, mId, mediaId);
     }
 
     public boolean append(long[] mediaIds) {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() && nativePlaylistAppendGroup(ml, mId, mediaIds);
     }
 
     public boolean append(List<Long> mediaIds) {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         if (ml == null || !ml.isInitiated())
             return false;
         long[] ids = new long[mediaIds.size()];
@@ -57,46 +57,46 @@ public class Playlist extends APlaylist {
     }
 
     public boolean add(long mediaId, int position) {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() && nativePlaylistAdd(ml, mId, mediaId, position);
     }
 
     public boolean move(int oldPosition, int newPosition) {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() && nativePlaylistMove(ml, mId, oldPosition, newPosition);
     }
 
     public boolean remove(int position) {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() && nativePlaylistRemove(ml, mId, position);
     }
 
     public boolean delete() {
-        AMedialibrary ml = AMedialibrary.getInstance();
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() && nativePlaylistDelete(ml, mId);
     }
 
-    public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
-        return ml.isInitiated() ? nativeSearch(ml, mId, query, sort, desc, nbItems, offset) : AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
+        return ml.isInitiated() ? nativeSearch(ml, mId, query, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     public int searchTracksCount(String query) {
-        final AMedialibrary ml = AMedialibrary.getInstance();
+        final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.isInitiated() ? nativeGetSearchCount(ml, mId, query) : 0;
     }
 
-    private native AMediaWrapper[] nativeGetTracks(AMedialibrary ml, long id);
-    private native AMediaWrapper[] nativeGetPagedTracks(AMedialibrary ml, long id, int nbItems, int offset);
-    private native int nativeGetTracksCount(AMedialibrary ml, long id);
-    private native AMediaWrapper[] nativeSearch(AMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
-    private native int nativeGetSearchCount(AMedialibrary ml, long mId, String query);
-    private native boolean nativePlaylistAppend(AMedialibrary ml, long id, long mediaId);
-    private native boolean nativePlaylistAppendGroup(AMedialibrary ml, long id, long[] mediaIds);
-    private native boolean nativePlaylistAdd(AMedialibrary ml, long id, long mediaId, int position);
+    private native AbstractMediaWrapper[] nativeGetTracks(AbstractMedialibrary ml, long id);
+    private native AbstractMediaWrapper[] nativeGetPagedTracks(AbstractMedialibrary ml, long id, int nbItems, int offset);
+    private native int nativeGetTracksCount(AbstractMedialibrary ml, long id);
+    private native AbstractMediaWrapper[] nativeSearch(AbstractMedialibrary ml, long mId, String query, int sort, boolean desc, int nbItems, int offset);
+    private native int nativeGetSearchCount(AbstractMedialibrary ml, long mId, String query);
+    private native boolean nativePlaylistAppend(AbstractMedialibrary ml, long id, long mediaId);
+    private native boolean nativePlaylistAppendGroup(AbstractMedialibrary ml, long id, long[] mediaIds);
+    private native boolean nativePlaylistAdd(AbstractMedialibrary ml, long id, long mediaId, int position);
 
-    private native boolean nativePlaylistMove(AMedialibrary ml, long id, int oldPosition, int position);
+    private native boolean nativePlaylistMove(AbstractMedialibrary ml, long id, int oldPosition, int position);
 
-    private native boolean nativePlaylistRemove(AMedialibrary ml, long id, int position);
-    private native boolean nativePlaylistDelete(AMedialibrary ml, long id);
+    private native boolean nativePlaylistRemove(AbstractMedialibrary ml, long id, int position);
+    private native boolean nativePlaylistDelete(AbstractMedialibrary ml, long id);
 }
diff --git a/medialibrary/src/org/videolan/medialibrary/media/SearchAggregate.java b/medialibrary/src/org/videolan/medialibrary/media/SearchAggregate.java
index 4384ec7e2d..ee64c9783a 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/SearchAggregate.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/SearchAggregate.java
@@ -1,21 +1,21 @@
 package org.videolan.medialibrary.media;
 
 import org.videolan.medialibrary.Tools;
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AGenre;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
-import org.videolan.medialibrary.interfaces.media.APlaylist;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractGenre;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
 
 public class SearchAggregate {
     private static final String TAG = "VLC/SearchAggregate";
 
-    private final AAlbum[] albums;
-    private final AArtist[] artists;
-    private final AGenre[] genres;
-    private final AMediaWrapper[] videos;
-    private final AMediaWrapper[] tracks;
-    private final APlaylist[] playlists;
+    private final AbstractAlbum[] albums;
+    private final AbstractArtist[] artists;
+    private final AbstractGenre[] genres;
+    private final AbstractMediaWrapper[] videos;
+    private final AbstractMediaWrapper[] tracks;
+    private final AbstractPlaylist[] playlists;
 
     public SearchAggregate() {
         this.albums = null;
@@ -26,7 +26,7 @@ public class SearchAggregate {
         this.playlists = null;
     }
 
-    public SearchAggregate(AAlbum[] albums, AArtist[] artists, AGenre[] genres, AMediaWrapper[] videos, AMediaWrapper[] tracks, APlaylist[] playlists) {
+    public SearchAggregate(AbstractAlbum[] albums, AbstractArtist[] artists, AbstractGenre[] genres, AbstractMediaWrapper[] videos, AbstractMediaWrapper[] tracks, AbstractPlaylist[] playlists) {
         this.albums = albums;
         this.artists = artists;
         this.genres = genres;
@@ -35,27 +35,27 @@ public class SearchAggregate {
         this.playlists = playlists;
     }
 
-    public AAlbum[] getAlbums() {
+    public AbstractAlbum[] getAlbums() {
         return albums;
     }
 
-    public AArtist[] getArtists() {
+    public AbstractArtist[] getArtists() {
         return artists;
     }
 
-    public AGenre[] getGenres() {
+    public AbstractGenre[] getGenres() {
         return genres;
     }
 
-    public AMediaWrapper[] getVideos() {
+    public AbstractMediaWrapper[] getVideos() {
         return videos;
     }
 
-    public AMediaWrapper[] getTracks() {
+    public AbstractMediaWrapper[] getTracks() {
         return tracks;
     }
 
-    public APlaylist[] getPlaylists() {
+    public AbstractPlaylist[] getPlaylists() {
         return playlists;
     }
 
@@ -68,32 +68,32 @@ public class SearchAggregate {
         StringBuilder sb = new StringBuilder();
         if (albums.length > 0) {
             sb.append("Albums:\n");
-            for (AAlbum album : albums)
+            for (AbstractAlbum album : albums)
                 sb.append(album.getTitle()).append("\n");
         }
         if (artists.length > 0) {
             sb.append("Artists:\n");
-            for (AArtist artist : artists)
+            for (AbstractArtist artist : artists)
                 sb.append(artist.getTitle()).append("\n");
         }
         if (genres.length > 0) {
             sb.append("Genres:\n");
-            for (AGenre genre : genres)
+            for (AbstractGenre genre : genres)
                 sb.append(genre.getTitle()).append("\n");
         }
         if (tracks.length > 0) {
             sb.append("Tracks:\n");
-            for (AMediaWrapper m : tracks)
+            for (AbstractMediaWrapper m : tracks)
                 sb.append(m.getTitle()).append("\n");
         }
         if (videos.length > 0) {
             sb.append("Videos:\n");
-            for (AMediaWrapper m : videos)
+            for (AbstractMediaWrapper m : videos)
                 sb.append(m.getTitle()).append("\n");
         }
         if (playlists.length > 0) {
             sb.append("Playlists:\n");
-            for (APlaylist playlist : playlists)
+            for (AbstractPlaylist playlist : playlists)
                 sb.append(playlist.getTitle()).append("\n");
         }
         return sb.toString();
diff --git a/medialibrary/src/org/videolan/medialibrary/media/Storage.java b/medialibrary/src/org/videolan/medialibrary/media/Storage.java
index d78ba38f1d..0799cead8f 100644
--- a/medialibrary/src/org/videolan/medialibrary/media/Storage.java
+++ b/medialibrary/src/org/videolan/medialibrary/media/Storage.java
@@ -6,8 +6,8 @@ import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
 
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 public class Storage extends MediaLibraryItem {
 
@@ -15,8 +15,8 @@ public class Storage extends MediaLibraryItem {
     String description;
 
     @Override
-    public AMediaWrapper[] getTracks() {
-        return AMedialibrary.EMPTY_COLLECTION;
+    public AbstractMediaWrapper[] getTracks() {
+        return AbstractMedialibrary.EMPTY_COLLECTION;
     }
 
     @Override
diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubAlbum.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubAlbum.java
index 7f753d4d4e..a9c67d411b 100644
--- a/medialibrary/src/org/videolan/medialibrary/stubs/StubAlbum.java
+++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubAlbum.java
@@ -2,14 +2,14 @@ package org.videolan.medialibrary.stubs;
 
 import android.os.Parcel;
 
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 import java.util.ArrayList;
 
-public class StubAlbum extends AAlbum {
+public class StubAlbum extends AbstractAlbum {
 
     private StubDataSource dt = StubDataSource.getInstance();
 
@@ -23,36 +23,36 @@ public class StubAlbum extends AAlbum {
 
     public int getRealTracksCount() {
         int count = 0;
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getAlbum().equals(this.getTitle())) count++;
         }
         return count;
     }
 
-    public AArtist getAlbumArtist() {
-        AMedialibrary ml = AMedialibrary.getInstance();
+    public AbstractArtist getAlbumArtist() {
+        AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
         return ml.getArtist(this.albumArtistId);
     }
 
-    private ArrayList<AMediaWrapper> getAlbumTracks() {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    private ArrayList<AbstractMediaWrapper> getAlbumTracks() {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getAlbum().equals(this.getTitle())) results.add(media);
         }
         return results;
     }
 
-    public AMediaWrapper[] getTracks(int sort, boolean desc) {
+    public AbstractMediaWrapper[] getTracks(int sort, boolean desc) {
         return dt.sortMedia(getAlbumTracks(), sort, desc);
     }
 
-    public AMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
+    public AbstractMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
         return dt.sortMedia(dt.secureSublist(getAlbumTracks(), offset, offset + nbItems), sort, desc);
     }
 
-    public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getAlbum().equals(this.getTitle()) ||
                     media.getTitle().contains(query)) {
                 results.add(media);
@@ -63,7 +63,7 @@ public class StubAlbum extends AAlbum {
 
     public int searchTracksCount(String query) {
         int count = 0;
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getAlbum().equals(this.getTitle()) ||
                     media.getTitle().contains(query)) {
                 count++;
diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubArtist.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubArtist.java
index 834fe452ec..46f7cbb6d4 100644
--- a/medialibrary/src/org/videolan/medialibrary/stubs/StubArtist.java
+++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubArtist.java
@@ -2,14 +2,14 @@ package org.videolan.medialibrary.stubs;
 
 import android.os.Parcel;
 
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 
-public class StubArtist extends AArtist {
+public class StubArtist extends AbstractArtist {
 
     private StubDataSource dt = StubDataSource.getInstance();
 
@@ -21,9 +21,9 @@ public class StubArtist extends AArtist {
         super(in);
     }
 
-    public AAlbum[] getAlbums(int sort, boolean desc) {
-        ArrayList<AAlbum> results = new ArrayList<>();
-        for (AAlbum album : dt.mAlbums) {
+    public AbstractAlbum[] getAlbums(int sort, boolean desc) {
+        ArrayList<AbstractAlbum> results = new ArrayList<>();
+        for (AbstractAlbum album : dt.mAlbums) {
             if (album.getDescription().equals(this.getTitle())) results.add(album);
         }
         return dt.sortAlbum(results, sort, desc);
@@ -31,20 +31,20 @@ public class StubArtist extends AArtist {
 
     public int getAlbumsCount() {
         int count = 0;
-        for (AAlbum album : dt.mAlbums) {
+        for (AbstractAlbum album : dt.mAlbums) {
             if (album.getDescription().equals(this.getTitle())) count++;
         }
         return count;
     }
 
-    public AAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AAlbum> results = new ArrayList<>(Arrays.asList(getAlbums(sort, desc)));
-        return results.toArray(new AAlbum[0]);
+    public AbstractAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractAlbum> results = new ArrayList<>(Arrays.asList(getAlbums(sort, desc)));
+        return results.toArray(new AbstractAlbum[0]);
     }
 
-    public AAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AAlbum> results = new ArrayList<>();
-        for (AAlbum album : dt.mAlbums) {
+    public AbstractAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractAlbum> results = new ArrayList<>();
+        for (AbstractAlbum album : dt.mAlbums) {
             if (album.getDescription().equals(this.getTitle()) ||
                     album.getTitle().equals(query)) {
                 results.add(album);
@@ -55,7 +55,7 @@ public class StubArtist extends AArtist {
 
     public int searchAlbumsCount(String query) {
         int count = 0;
-        for (AAlbum album : dt.mAlbums) {
+        for (AbstractAlbum album : dt.mAlbums) {
             if (album.getDescription().equals(this.getTitle()) ||
                     album.getTitle().equals(query)) {
                 count++;
@@ -67,7 +67,7 @@ public class StubArtist extends AArtist {
     //TODO checkout if query is on artist or albumArtist or both
     public int searchTracksCount(String query) {
         int count = 0;
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getArtist().equals(this.getTitle()) ||
                     media.getAlbumArtist().equals(this.getTitle()) ||
                     media.getTitle().contains(query)) {
@@ -78,9 +78,9 @@ public class StubArtist extends AArtist {
     }
 
     //TODO checkout if query is on artist or albumArtist or both (same as above)
-    public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getArtist().equals(this.getTitle()) ||
                     media.getAlbumArtist().equals(this.getTitle()) ||
                     media.getTitle().contains(query)) {
@@ -90,9 +90,9 @@ public class StubArtist extends AArtist {
         return dt.sortMedia(dt.secureSublist(results, offset, offset + nbItems), sort, desc);
     }
 
-    public AMediaWrapper[] getTracks(int sort, boolean desc) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractMediaWrapper[] getTracks(int sort, boolean desc) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getArtist().equals(this.getTitle()) ||
                     media.getAlbumArtist().equals(this.getTitle())) {
                 results.add(media);
@@ -101,9 +101,9 @@ public class StubArtist extends AArtist {
         return dt.sortMedia(results, sort, desc);
     }
 
-    public AMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getArtist().equals(this.getTitle()) ||
                     media.getAlbumArtist().equals(this.getTitle())) {
                 results.add(media);
@@ -114,7 +114,7 @@ public class StubArtist extends AArtist {
 
     public int getTracksCount() {
         int count = 0;
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getArtist().equals(this.getTitle()) ||
                     media.getAlbumArtist().equals(this.getTitle())) {
                 count++;
diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubDataSource.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubDataSource.java
index 38ba041b03..a7d50eb3e3 100644
--- a/medialibrary/src/org/videolan/medialibrary/stubs/StubDataSource.java
+++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubDataSource.java
@@ -3,12 +3,12 @@ package org.videolan.medialibrary.stubs;
 import android.text.TextUtils;
 
 import org.videolan.medialibrary.MLServiceLocator;
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AFolder;
-import org.videolan.medialibrary.interfaces.media.AGenre;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
-import org.videolan.medialibrary.interfaces.media.APlaylist;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractFolder;
+import org.videolan.medialibrary.interfaces.media.AbstractGenre;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
 import org.videolan.medialibrary.media.MediaLibraryItem;
 
 import java.util.ArrayList;
@@ -17,28 +17,28 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
-import static org.videolan.medialibrary.interfaces.AMedialibrary.SORT_ALBUM;
-import static org.videolan.medialibrary.interfaces.AMedialibrary.SORT_ALPHA;
-import static org.videolan.medialibrary.interfaces.AMedialibrary.SORT_ARTIST;
-import static org.videolan.medialibrary.interfaces.AMedialibrary.SORT_DEFAULT;
-import static org.videolan.medialibrary.interfaces.AMedialibrary.SORT_DURATION;
-import static org.videolan.medialibrary.interfaces.AMedialibrary.SORT_FILENAME;
-import static org.videolan.medialibrary.interfaces.AMedialibrary.SORT_INSERTIONDATE;
-import static org.videolan.medialibrary.interfaces.AMedialibrary.SORT_LASTMODIFICATIONDATE;
-import static org.videolan.medialibrary.interfaces.AMedialibrary.SORT_RELEASEDATE;
+import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_ALBUM;
+import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_ALPHA;
+import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_ARTIST;
+import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_DEFAULT;
+import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_DURATION;
+import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_FILENAME;
+import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_INSERTIONDATE;
+import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_LASTMODIFICATIONDATE;
+import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_RELEASEDATE;
 
 public class StubDataSource {
 
-    ArrayList<AMediaWrapper> mVideoMediaWrappers = new ArrayList<>();
-    ArrayList<AMediaWrapper> mAudioMediaWrappers = new ArrayList<>();
-    ArrayList<AMediaWrapper> mStreamMediaWrappers = new ArrayList<>();
-    ArrayList<AMediaWrapper> mHistory = new ArrayList<>();
-    ArrayList<AAlbum> mAlbums = new ArrayList<>();
-    ArrayList<AArtist> mArtists = new ArrayList<>();
-    ArrayList<AGenre> mGenres = new ArrayList<>();
-    ArrayList<APlaylist> mPlaylists = new ArrayList<>();
+    ArrayList<AbstractMediaWrapper> mVideoMediaWrappers = new ArrayList<>();
+    ArrayList<AbstractMediaWrapper> mAudioMediaWrappers = new ArrayList<>();
+    ArrayList<AbstractMediaWrapper> mStreamMediaWrappers = new ArrayList<>();
+    ArrayList<AbstractMediaWrapper> mHistory = new ArrayList<>();
+    ArrayList<AbstractAlbum> mAlbums = new ArrayList<>();
+    ArrayList<AbstractArtist> mArtists = new ArrayList<>();
+    ArrayList<AbstractGenre> mGenres = new ArrayList<>();
+    ArrayList<AbstractPlaylist> mPlaylists = new ArrayList<>();
     ArrayList<String> mBannedFolders = new ArrayList<>();
-    ArrayList<AFolder> mFolders = new ArrayList<>();
+    ArrayList<AbstractFolder> mFolders = new ArrayList<>();
     ArrayList<String> mDevices = new ArrayList<>();
 
     private static long uuid = 2;
@@ -56,25 +56,25 @@ public class StubDataSource {
 
     public void init() {
         String baseMrl = "/storage/emulated/0/Movies/";
-        AMediaWrapper media;
+        AbstractMediaWrapper media;
 
         // Video
         String fileName = "058_foar_everywun_frum_boxxy.flv";
-        media = MLServiceLocator.getAMediaWrapper(getUUID(), baseMrl + fileName, 0L, 18820L, 0,
+        media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 18820L, 0,
                 fileName, fileName, "", "",
                 "", "", 416, 304, "", 0, -2,
                 0, 0, 1509466228L, 0L, true);
         addVideo(media);
 
         fileName = "FMA - MultiChapter.mkv";
-        media = MLServiceLocator.getAMediaWrapper(getUUID(), baseMrl + fileName, 0L, 1467383L, 0,
+        media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 1467383L, 0,
                 "Encoded with MiniCoder", fileName, "", "",
                 "", "", 1280, 720, "", 0,
                 -2, 0, 0, 1512396147L, 0L, true);
         addVideo(media);
 
         fileName = "114_My_Heart_Will_Go_On.avi";
-        media = MLServiceLocator.getAMediaWrapper(getUUID(), baseMrl + fileName, 0L, 20000L, 0,
+        media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 20000L, 0,
                 "My Heart Will Go On - Celine Dion", fileName, "", "",
                 "", "", 352, 220, "", 0,
                 -2, 0, 0, 1509465852L, 0L, true);
@@ -84,7 +84,7 @@ public class StubDataSource {
 
         fileName = "01-Show Me The Way.mp3";
         baseMrl = "/storage/emulated/0/Music/Peter Frampton/Shine On - CD2/";
-        media = MLServiceLocator.getAMediaWrapper(getUUID(), baseMrl + fileName, 0L, 280244L, 1,
+        media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 280244L, 1,
                 "01-Show Me The Way", fileName, "Peter Frampton", "Rock",
                 "Shine On CD2", "Peter Frampton",
                 0, 0, "/storage/emulated/0/Music/Peter Frampton/Shine On - CD2/Folder.jpg",
@@ -94,7 +94,7 @@ public class StubDataSource {
 
         fileName = "01-Wind Of Change.mp3";
         baseMrl = "/storage/emulated/0/Music/Peter Frampton/Shine On - CD1/";
-        media = MLServiceLocator.getAMediaWrapper(getUUID(), baseMrl + fileName, 0L, 184271L, 1,
+        media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 184271L, 1,
                 "01-Wind Of Change", fileName, "Peter Frampton", "Rock",
                 "Shine On CD1", "Peter Frampton",
                 0, 0, "/storage/emulated/0/Music/Peter Frampton/Shine On - CD1/Folder.jpg",
@@ -104,7 +104,7 @@ public class StubDataSource {
 
         fileName = "03 Bloody Well Right.wma";
         baseMrl = "/storage/emulated/0/Music/Supertramp/Best of/";
-        media = MLServiceLocator.getAMediaWrapper(getUUID(), baseMrl + fileName, 0L, 257199L, 1,
+        media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 257199L, 1,
                 "Bloody Well Right", fileName, "Supertramp", "Rock",
                 "The Autobiography of Supertramp", "Supertramp",
                 0, 0, "/storage/emulated/0/Music/Supertramp/Best of/Folder.jpg", 0,
@@ -121,12 +121,12 @@ public class StubDataSource {
         return list.subList(secureOffset, secureEnd);
     }
 
-    class MediaComparator implements Comparator<AMediaWrapper> {
+    class MediaComparator implements Comparator<AbstractMediaWrapper> {
         private int sort;
         MediaComparator(int sort) { this.sort = sort; }
 
         @Override //TODO checkout if types of sort are verified before being used in native
-        public int compare(AMediaWrapper o1, AMediaWrapper o2) {
+        public int compare(AbstractMediaWrapper o1, AbstractMediaWrapper o2) {
             switch(sort) {
                 case SORT_DEFAULT:
                 case SORT_ALPHA: return o1.getTitle().compareTo(o2.getTitle());
@@ -140,12 +140,12 @@ public class StubDataSource {
         }
     }
 
-    class ArtistComparator implements Comparator<AArtist> {
+    class ArtistComparator implements Comparator<AbstractArtist> {
         private int sort;
         ArtistComparator(int sort) { this.sort = sort; }
 
         @Override
-        public int compare(AArtist o1, AArtist o2) {
+        public int compare(AbstractArtist o1, AbstractArtist o2) {
             switch(sort) {
                 case SORT_DEFAULT:
                 case SORT_ARTIST: return o1.getTitle().compareTo(o2.getTitle());
@@ -154,12 +154,12 @@ public class StubDataSource {
         }
     }
 
-    class AlbumComparator implements Comparator<AAlbum> {
+    class AlbumComparator implements Comparator<AbstractAlbum> {
         private int sort;
         AlbumComparator(int sort) { this.sort = sort; }
 
         @Override
-        public int compare(AAlbum o1, AAlbum o2) {
+        public int compare(AbstractAlbum o1, AbstractAlbum o2) {
             switch (sort) {
                 case SORT_DEFAULT:
                 case SORT_ALBUM: return o1.getTitle().compareTo(o2.getTitle());
@@ -170,12 +170,12 @@ public class StubDataSource {
         }
     }
 
-    class GenreComparator implements Comparator<AGenre> {
+    class GenreComparator implements Comparator<AbstractGenre> {
         private int sort;
         GenreComparator(int sort) { this.sort = sort; }
 
         @Override
-        public int compare(AGenre o1, AGenre o2) {
+        public int compare(AbstractGenre o1, AbstractGenre o2) {
             switch(sort) {
                 case SORT_DEFAULT:
                 case SORT_ALPHA: return o1.getTitle().compareTo(o2.getTitle());
@@ -184,12 +184,12 @@ public class StubDataSource {
         }
     }
 
-    class PlaylistComparator implements Comparator<APlaylist> {
+    class PlaylistComparator implements Comparator<AbstractPlaylist> {
         private int sort;
         PlaylistComparator(int sort) { this.sort = sort; }
 
         @Override
-        public int compare(APlaylist o1, APlaylist o2) {
+        public int compare(AbstractPlaylist o1, AbstractPlaylist o2) {
             switch (sort) {
                 case SORT_DEFAULT:
                 case SORT_ALPHA: return o1.getTitle().compareTo(o2.getTitle());
@@ -199,12 +199,12 @@ public class StubDataSource {
         }
     }
 
-    class FolderComparator implements Comparator<AFolder> {
+    class FolderComparator implements Comparator<AbstractFolder> {
         private int sort;
         FolderComparator(int sort) { this.sort = sort; }
 
         @Override
-        public int compare(AFolder o1, AFolder o2) {
+        public int compare(AbstractFolder o1, AbstractFolder o2) {
             switch (sort) {
                 case SORT_DEFAULT:
                 case SORT_ALPHA: return o1.getTitle().compareTo(o2.getTitle());
@@ -213,52 +213,52 @@ public class StubDataSource {
         }
     }
 
-    AMediaWrapper[] sortMedia(List<AMediaWrapper> arrayList, int sort, boolean desc) {
-        List<AMediaWrapper> array = new ArrayList<>(arrayList);
+    AbstractMediaWrapper[] sortMedia(List<AbstractMediaWrapper> arrayList, int sort, boolean desc) {
+        List<AbstractMediaWrapper> array = new ArrayList<>(arrayList);
         Collections.sort(array, new MediaComparator(sort));
         if (desc)
             Collections.reverse(array);
-        return array.toArray(new AMediaWrapper[0]);
+        return array.toArray(new AbstractMediaWrapper[0]);
     }
 
-    AAlbum[] sortAlbum(List<AAlbum> arrayList, int sort, boolean desc) {
-        List<AAlbum> array = new ArrayList<>(arrayList);
+    AbstractAlbum[] sortAlbum(List<AbstractAlbum> arrayList, int sort, boolean desc) {
+        List<AbstractAlbum> array = new ArrayList<>(arrayList);
         Collections.sort(array, new AlbumComparator(sort));
         if (desc)
             Collections.reverse(array);
-        return array.toArray(new AAlbum[0]);
+        return array.toArray(new AbstractAlbum[0]);
     }
 
-    AArtist[] sortArtist(List<AArtist> arrayList, int sort, boolean desc) {
-        List<AArtist> array = new ArrayList<>(arrayList);
+    AbstractArtist[] sortArtist(List<AbstractArtist> arrayList, int sort, boolean desc) {
+        List<AbstractArtist> array = new ArrayList<>(arrayList);
         Collections.sort(array, new ArtistComparator(sort));
         if (desc)
             Collections.reverse(array);
-        return array.toArray(new AArtist[0]);
+        return array.toArray(new AbstractArtist[0]);
     }
 
-    AGenre[] sortGenre(List<AGenre> arrayList, int sort, boolean desc) {
-        List<AGenre> array = new ArrayList<>(arrayList);
+    AbstractGenre[] sortGenre(List<AbstractGenre> arrayList, int sort, boolean desc) {
+        List<AbstractGenre> array = new ArrayList<>(arrayList);
         Collections.sort(array, new GenreComparator(sort));
         if (desc)
             Collections.reverse(array);
-        return array.toArray(new AGenre[0]);
+        return array.toArray(new AbstractGenre[0]);
     }
 
-    APlaylist[] sortPlaylist(List<APlaylist> arrayList, int sort, boolean desc) {
-        List<APlaylist> array = new ArrayList<>(arrayList);
+    AbstractPlaylist[] sortPlaylist(List<AbstractPlaylist> arrayList, int sort, boolean desc) {
+        List<AbstractPlaylist> array = new ArrayList<>(arrayList);
         Collections.sort(array, new PlaylistComparator(sort));
         if (desc)
             Collections.reverse(array);
-        return array.toArray(new APlaylist[0]);
+        return array.toArray(new AbstractPlaylist[0]);
     }
 
-    AFolder[] sortFolder(List<AFolder> arrayList, int sort, boolean desc) {
-        List<AFolder> array = new ArrayList<>(arrayList);
+    AbstractFolder[] sortFolder(List<AbstractFolder> arrayList, int sort, boolean desc) {
+        List<AbstractFolder> array = new ArrayList<>(arrayList);
         Collections.sort(array, new FolderComparator(sort));
         if (desc)
             Collections.reverse(array);
-        return array.toArray(new AFolder[0]);
+        return array.toArray(new AbstractFolder[0]);
     }
 
     private boolean checkUuidForMatches(long id) {
@@ -296,49 +296,49 @@ public class StubDataSource {
         return uuid;
     }
 
-    private void addAudio(AMediaWrapper media, String shortBio, int releaseYear, int albumDuration) {
+    private void addAudio(AbstractMediaWrapper media, String shortBio, int releaseYear, int albumDuration) {
         addFolders(media);
         mAudioMediaWrappers.add(media);
-        AArtist artist = MLServiceLocator.getAArtist(getUUID(), media.getArtist(), shortBio, media.getArtworkMrl(), "");
+        AbstractArtist artist = MLServiceLocator.getAbstractArtist(getUUID(), media.getArtist(), shortBio, media.getArtworkMrl(), "");
         mArtists.add(artist);
-        AArtist albumArtist = null;
+        AbstractArtist albumArtist = null;
         if (!media.getArtist().equals(media.getAlbumArtist())) {
-            albumArtist = MLServiceLocator.getAArtist(getUUID(), media.getAlbumArtist(), "", media.getArtworkMrl(), "");
+            albumArtist = MLServiceLocator.getAbstractArtist(getUUID(), media.getAlbumArtist(), "", media.getArtworkMrl(), "");
             mArtists.add(albumArtist);
         }
-        AAlbum album;
+        AbstractAlbum album;
         if (albumArtist == null)
-            album = MLServiceLocator.getAAlbum(getUUID(), media.getAlbum(), releaseYear,
+            album = MLServiceLocator.getAbstractAlbum(getUUID(), media.getAlbum(), releaseYear,
                     media.getArtworkMrl(), artist.getTitle(),
                     artist.getId(), media.getTracks().length, albumDuration);
         else
-            album = MLServiceLocator.getAAlbum(getUUID(), media.getAlbum(), releaseYear,
+            album = MLServiceLocator.getAbstractAlbum(getUUID(), media.getAlbum(), releaseYear,
                     media.getArtworkMrl(), albumArtist.getTitle(),
                     albumArtist.getId(), media.getTracks().length, albumDuration);
         mAlbums.add(album);
         ArrayList genreStrings = new ArrayList<>();
 //        if (!getGenresString())
-        mGenres.add(MLServiceLocator.getAGenre(getUUID(), media.getGenre()));
+        mGenres.add(MLServiceLocator.getAbstractGenre(getUUID(), media.getGenre()));
     }
 
-    private void addVideo(AMediaWrapper media) {
+    private void addVideo(AbstractMediaWrapper media) {
         addFolders(media);
         mVideoMediaWrappers.add(media);
     }
 
     private String[] getGenresString() {
         ArrayList<String> results = new ArrayList<>();
-        for (AGenre genre : mGenres) { results.add(genre.getTitle()); }
+        for (AbstractGenre genre : mGenres) { results.add(genre.getTitle()); }
         return results.toArray(new String[0]);
     }
 
     private String[] getFoldersString() {
         ArrayList<String> results = new ArrayList<>();
-        for (AFolder folder : mFolders) { results.add(folder.getTitle()); }
+        for (AbstractFolder folder : mFolders) { results.add(folder.getTitle()); }
         return results.toArray(new String[0]);
     }
 
-    private void addFolders(AMediaWrapper media) {
+    private void addFolders(AbstractMediaWrapper media) {
         String path = media.getUri().getPath();
         if (path == null)
             return;
@@ -349,7 +349,7 @@ public class StubDataSource {
             ArrayList<String> mlFolders = new ArrayList<>(Arrays.asList(getFoldersString()));
             if (!mlFolders.contains(mrl)) {
                 final String name = folderArray[folderArray.length - 1];
-                mFolders.add(MLServiceLocator.getAFolder(getUUID(), name, mrl));
+                mFolders.add(MLServiceLocator.getAbstractFolder(getUUID(), name, mrl));
             }
         }
     }
diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubFolder.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubFolder.java
index 004512a72e..13471c3aff 100644
--- a/medialibrary/src/org/videolan/medialibrary/stubs/StubFolder.java
+++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubFolder.java
@@ -2,14 +2,14 @@ package org.videolan.medialibrary.stubs;
 
 import android.os.Parcel;
 
-import org.videolan.medialibrary.interfaces.media.AFolder;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractFolder;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 
-public class StubFolder extends AFolder {
+public class StubFolder extends AbstractFolder {
 
     private StubDataSource dt = StubDataSource.getInstance();
 
@@ -29,71 +29,71 @@ public class StubFolder extends AFolder {
     }
 
     //TODO WTF would media be null ??
-    public AMediaWrapper[] media(int type, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        ArrayList<AMediaWrapper> source;
+    public AbstractMediaWrapper[] media(int type, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        ArrayList<AbstractMediaWrapper> source;
         if (type == TYPE_FOLDER_VIDEO) source = dt.mVideoMediaWrappers;
         else if (type == TYPE_FOLDER_AUDIO) source = dt.mAudioMediaWrappers;
         else return null;
-        for (AMediaWrapper media : source) {
+        for (AbstractMediaWrapper media : source) {
             if (isParentFolder(this.mMrl, media.getUri().getPath())) results.add(media);
         }
         results = new ArrayList<>(Arrays.asList(dt.sortMedia(results, sort, desc)));
-        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AMediaWrapper[0]);
+        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AbstractMediaWrapper[0]);
     }
 
     public int mediaCount(int type) {
         int count = 0;
-        ArrayList<AMediaWrapper> source;
+        ArrayList<AbstractMediaWrapper> source;
         if (type == TYPE_FOLDER_VIDEO) source = dt.mVideoMediaWrappers;
         else if (type == TYPE_FOLDER_AUDIO) source = dt.mAudioMediaWrappers;
         else return 0;
-        for (AMediaWrapper media : source) {
+        for (AbstractMediaWrapper media : source) {
             if (isParentFolder(this.mMrl, media.getUri().getPath())) count++;
         }
         return count;
     }
 
-    public AFolder[] subfolders(int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AFolder> results = new ArrayList<>();
-        for (AFolder folder : dt.mFolders) {
+    public AbstractFolder[] subfolders(int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractFolder> results = new ArrayList<>();
+        for (AbstractFolder folder : dt.mFolders) {
             if (isParentFolder(this.mMrl, folder.mMrl)) results.add(folder);
         }
         results = new ArrayList<>(Arrays.asList(dt.sortFolder(results, sort, desc)));
-        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AFolder[0]);
+        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AbstractFolder[0]);
     }
 
     public int subfoldersCount(int type) {
         int count = 0;
-        for (AFolder folder : dt.mFolders) {
+        for (AbstractFolder folder : dt.mFolders) {
             if (isParentFolder(this.mMrl, folder.mMrl)) count++;
         }
         return count;
     }
 
-    public AMediaWrapper[] searchTracks(String query, int mediaType, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        ArrayList<AMediaWrapper> source;
+    public AbstractMediaWrapper[] searchTracks(String query, int mediaType, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        ArrayList<AbstractMediaWrapper> source;
         if (mediaType == TYPE_FOLDER_VIDEO) source = dt.mVideoMediaWrappers;
         else if (mediaType == TYPE_FOLDER_AUDIO) source = dt.mAudioMediaWrappers;
         else return null;
-        for (AMediaWrapper media : source) {
+        for (AbstractMediaWrapper media : source) {
             if (media.getTitle().contains(query) &&
                     isParentFolder(this.mMrl, media.getUri().getPath())) {
                 results.add(media);
             }
         }
         results = new ArrayList<>(Arrays.asList(dt.sortMedia(results, sort, desc)));
-        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AMediaWrapper[0]);
+        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AbstractMediaWrapper[0]);
     }
 
     public int searchTracksCount(String query, int mediaType) {
         int count = 0;
-        ArrayList<AMediaWrapper> source;
+        ArrayList<AbstractMediaWrapper> source;
         if (mediaType == TYPE_FOLDER_VIDEO) source = dt.mVideoMediaWrappers;
         else if (mediaType == TYPE_FOLDER_AUDIO) source = dt.mAudioMediaWrappers;
         else return 0;
-        for (AMediaWrapper media : source) {
+        for (AbstractMediaWrapper media : source) {
             if (media.getTitle().contains(query) &&
                     isParentFolder(this.mMrl, media.getUri().getPath())) count++;
         }
diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubGenre.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubGenre.java
index 3bd862e5ad..f89d11c9eb 100644
--- a/medialibrary/src/org/videolan/medialibrary/stubs/StubGenre.java
+++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubGenre.java
@@ -2,26 +2,26 @@ package org.videolan.medialibrary.stubs;
 
 import android.os.Parcel;
 
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AGenre;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractGenre;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 
-public class StubGenre extends AGenre {
+public class StubGenre extends AbstractGenre {
 
     private StubDataSource dt = StubDataSource.getInstance();
 
     public StubGenre(long id, String title) { super(id, title); }
     public StubGenre(Parcel in) { super(in); }
 
-    public AAlbum[] getAlbums(int sort, boolean desc) {
-        ArrayList<AAlbum> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractAlbum[] getAlbums(int sort, boolean desc) {
+        ArrayList<AbstractAlbum> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getGenre().equals(this.getTitle())) {
-                for (AAlbum album : dt.mAlbums) {
+                for (AbstractAlbum album : dt.mAlbums) {
                     if (album.getTitle().equals(media.getAlbum()) &&
                             !results.contains(album)) {
                         results.add(album);
@@ -32,9 +32,9 @@ public class StubGenre extends AGenre {
         return dt.sortAlbum(results, sort, desc);
     }
 
-    public AAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AAlbum> results = new ArrayList<>(Arrays.asList(getAlbums(sort, desc)));
-        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AAlbum[0]);
+    public AbstractAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractAlbum> results = new ArrayList<>(Arrays.asList(getAlbums(sort, desc)));
+        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AbstractAlbum[0]);
     }
 
     @Override
@@ -42,12 +42,12 @@ public class StubGenre extends AGenre {
         return getAlbums().length;
     }
 
-    public AAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AAlbum> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractAlbum[] searchAlbums(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractAlbum> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getGenre().equals(this.getTitle()) &&
                     media.getTitle().contains(query)) {
-                for (AAlbum album : dt.mAlbums) {
+                for (AbstractAlbum album : dt.mAlbums) {
                     if (album.getTitle().equals(media.getAlbum()) &&
                             !results.contains(album)) {
                         results.add(album);
@@ -56,15 +56,15 @@ public class StubGenre extends AGenre {
             }
         }
         results = new ArrayList<>(Arrays.asList(dt.sortAlbum(results, sort, desc)));
-        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AAlbum[0]);
+        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AbstractAlbum[0]);
     }
 
     public int searchAlbumsCount(String query) {
-        ArrayList<AAlbum> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        ArrayList<AbstractAlbum> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getGenre().equals(this.getTitle()) &&
                     media.getTitle().contains(query)) {
-                for (AAlbum album : dt.mAlbums) {
+                for (AbstractAlbum album : dt.mAlbums) {
                     if (album.getTitle().equals(media.getAlbum()) &&
                             !results.contains(album)) {
                         results.add(album);
@@ -75,11 +75,11 @@ public class StubGenre extends AGenre {
         return results.size();
     }
 
-    public AArtist[] getArtists(int sort, boolean desc) {
-        ArrayList<AArtist> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractArtist[] getArtists(int sort, boolean desc) {
+        ArrayList<AbstractArtist> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getGenre().equals(this.getTitle())) {
-                for (AArtist artist : dt.mArtists) {
+                for (AbstractArtist artist : dt.mArtists) {
                     if ((artist.getTitle().equals(media.getArtist()) ||
                             artist.getTitle().equals(media.getAlbumArtist())) &&
                             !results.contains(artist)) {
@@ -92,17 +92,17 @@ public class StubGenre extends AGenre {
         return dt.sortArtist(results, sort, desc);
     }
 
-    public AMediaWrapper[] getTracks(int sort, boolean desc) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractMediaWrapper[] getTracks(int sort, boolean desc) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getGenre().equals(this.getTitle())) results.add(media);
         }
         return dt.sortMedia(results, sort, desc);
     }
 
-    public AMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractMediaWrapper[] getPagedTracks(int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getGenre().equals(this.getTitle())) results.add(media);
         }
         return dt.sortMedia(dt.secureSublist(results, offset, offset + nbItems), sort, desc);
@@ -110,16 +110,16 @@ public class StubGenre extends AGenre {
 
     public int getTracksCount() {
         int count = 0;
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getGenre().equals(this.getTitle())) count++;
         }
         return count;
     }
 
 
-    public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getGenre().equals(this.getTitle()) &&
                     media.getTitle().contains(query)) {
                 results.add(media);
@@ -130,7 +130,7 @@ public class StubGenre extends AGenre {
 
     public int searchTracksCount(String query) {
         int count = 0;
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getGenre().equals(this.getTitle()) &&
                     media.getTitle().contains(query)) {
                 count++;
diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubMediaWrapper.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubMediaWrapper.java
index 3478136717..6c35c93b63 100644
--- a/medialibrary/src/org/videolan/medialibrary/stubs/StubMediaWrapper.java
+++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubMediaWrapper.java
@@ -6,9 +6,9 @@ import android.os.Parcel;
 import android.util.SparseArray;
 
 import org.videolan.libvlc.Media;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 
-public class StubMediaWrapper extends AMediaWrapper {
+public class StubMediaWrapper extends AbstractMediaWrapper {
     public StubMediaWrapper(long id, String mrl, long time, long length, int type, String title,
                         String filename, String artist, String genre, String album, String albumArtist,
                         int width, int height, String artworkURL, int audio, int spu, int trackNumber,
diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubMedialibrary.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubMedialibrary.java
index 113e7008be..c095083e23 100644
--- a/medialibrary/src/org/videolan/medialibrary/stubs/StubMedialibrary.java
+++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubMedialibrary.java
@@ -7,19 +7,19 @@ import android.util.Log;
 import androidx.annotation.NonNull;
 
 import org.videolan.medialibrary.MLServiceLocator;
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AAlbum;
-import org.videolan.medialibrary.interfaces.media.AArtist;
-import org.videolan.medialibrary.interfaces.media.AFolder;
-import org.videolan.medialibrary.interfaces.media.AGenre;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
-import org.videolan.medialibrary.interfaces.media.APlaylist;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
+import org.videolan.medialibrary.interfaces.media.AbstractArtist;
+import org.videolan.medialibrary.interfaces.media.AbstractFolder;
+import org.videolan.medialibrary.interfaces.media.AbstractGenre;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
 import org.videolan.medialibrary.media.SearchAggregate;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 
-public class StubMedialibrary extends AMedialibrary {
+public class StubMedialibrary extends AbstractMedialibrary {
 
     private StubDataSource dt = StubDataSource.getInstance();
     private String TAG = this.getClass().getName();
@@ -72,50 +72,50 @@ public class StubMedialibrary extends AMedialibrary {
 
     public String[] getFoldersList() {
         ArrayList<String> results = new ArrayList<>();
-        for (AFolder folder : dt.mFolders) {
+        for (AbstractFolder folder : dt.mFolders) {
             results.add(folder.getTitle());
         }
         return results.toArray(new String[0]);
     }
-    public AMediaWrapper[] getVideos() {
+    public AbstractMediaWrapper[] getVideos() {
         return getVideos(SORT_DEFAULT, false);
     }
 
     //TODO sublist of sorted result ...
-    public AMediaWrapper[] getPagedVideos(int sort, boolean desc, int nbItems, int offset) {
+    public AbstractMediaWrapper[] getPagedVideos(int sort, boolean desc, int nbItems, int offset) {
         return dt.sortMedia(dt.secureSublist(dt.mVideoMediaWrappers, offset, offset + nbItems), sort, desc);
     }
 
-    public AMediaWrapper[] getVideos(int sort, boolean desc) {
+    public AbstractMediaWrapper[] getVideos(int sort, boolean desc) {
         return dt.sortMedia(dt.mVideoMediaWrappers, sort, desc);
     }
 
-    public AMediaWrapper[] getRecentVideos() {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mVideoMediaWrappers) {
-            if (media.getItemType() == AMediaWrapper.TYPE_VIDEO) results.add(media);
+    public AbstractMediaWrapper[] getRecentVideos() {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mVideoMediaWrappers) {
+            if (media.getItemType() == AbstractMediaWrapper.TYPE_VIDEO) results.add(media);
         }
-        return results.toArray(new AMediaWrapper[0]);
+        return results.toArray(new AbstractMediaWrapper[0]);
     }
 
-    public AMediaWrapper[] getAudio() {
+    public AbstractMediaWrapper[] getAudio() {
         return getAudio(SORT_DEFAULT, false);
     }
 
-    public AMediaWrapper[] getAudio(int sort, boolean desc) {
+    public AbstractMediaWrapper[] getAudio(int sort, boolean desc) {
         return dt.sortMedia(dt.mAudioMediaWrappers, sort, desc);
     }
 
-    public AMediaWrapper[] getPagedAudio(int sort, boolean desc, int nbitems, int offset) {
+    public AbstractMediaWrapper[] getPagedAudio(int sort, boolean desc, int nbitems, int offset) {
         return dt.sortMedia(dt.secureSublist(dt.mAudioMediaWrappers, offset, offset + nbitems), sort, desc);
     }
 
-    public AMediaWrapper[] getRecentAudio() {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mVideoMediaWrappers) {
-            if (media.getItemType() == AMediaWrapper.TYPE_AUDIO) results.add(media);
+    public AbstractMediaWrapper[] getRecentAudio() {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mVideoMediaWrappers) {
+            if (media.getItemType() == AbstractMediaWrapper.TYPE_AUDIO) results.add(media);
         }
-        return results.toArray(new AMediaWrapper[0]);
+        return results.toArray(new AbstractMediaWrapper[0]);
     }
 
     public int getVideoCount() {
@@ -126,15 +126,15 @@ public class StubMedialibrary extends AMedialibrary {
         return dt.mAudioMediaWrappers.size();
     }
 
-    public AAlbum[] getAlbums() {
+    public AbstractAlbum[] getAlbums() {
         return getAlbums(SORT_DEFAULT, false);
     }
 
-    public AAlbum[] getAlbums(int sort, boolean desc) {
+    public AbstractAlbum[] getAlbums(int sort, boolean desc) {
         return dt.sortAlbum(dt.mAlbums, sort, desc);
     }
 
-    public AAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
+    public AbstractAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset) {
         return dt.sortAlbum(dt.secureSublist(dt.mAlbums, offset, offset + nbItems), sort, desc);
     }
 
@@ -144,40 +144,40 @@ public class StubMedialibrary extends AMedialibrary {
 
     public int getAlbumsCount(String query) {
         int count = 0;
-        for (AAlbum album : dt.mAlbums) {
+        for (AbstractAlbum album : dt.mAlbums) {
             if (album.getTitle().contains(query)) count++;
         }
         return count;
     }
 
-    public AAlbum getAlbum(long albumId) {
-        for (AAlbum album : dt.mAlbums) {
+    public AbstractAlbum getAlbum(long albumId) {
+        for (AbstractAlbum album : dt.mAlbums) {
             if (album.getId() == albumId) return album;
         }
         return null;
     }
 
-    public AArtist[] getArtists(boolean all) {
+    public AbstractArtist[] getArtists(boolean all) {
         return getArtists(all, SORT_DEFAULT, false);
     }
 
-    private AArtist[] getAlbumArtists() {
-        ArrayList<AArtist> results = new ArrayList<>();
-        for (AAlbum album : dt.mAlbums) {
+    private AbstractArtist[] getAlbumArtists() {
+        ArrayList<AbstractArtist> results = new ArrayList<>();
+        for (AbstractAlbum album : dt.mAlbums) {
             results.add(album.getAlbumArtist());
         }
-        return results.toArray(new AArtist[0]);
+        return results.toArray(new AbstractArtist[0]);
     }
 
-    public AArtist[] getArtists(boolean all, int sort, boolean desc) {
-        ArrayList<AArtist> results;
+    public AbstractArtist[] getArtists(boolean all, int sort, boolean desc) {
+        ArrayList<AbstractArtist> results;
         if (all) results = dt.mArtists;
         else results = new ArrayList<>(Arrays.asList(getAlbumArtists()));
         return dt.sortArtist(results, sort, desc);
     }
 
-    public AArtist[] getPagedArtists(boolean all, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AArtist> results;
+    public AbstractArtist[] getPagedArtists(boolean all, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractArtist> results;
         if (all) results = dt.mArtists;
         else results = new ArrayList<>(Arrays.asList(getAlbumArtists()));
         return dt.sortArtist(dt.secureSublist(results, offset, offset + nbItems), sort, desc);
@@ -192,28 +192,28 @@ public class StubMedialibrary extends AMedialibrary {
 
     public int getArtistsCount(String query) {
         int count = 0;
-        for (AArtist artist : dt.mArtists) {
+        for (AbstractArtist artist : dt.mArtists) {
             if (artist.getTitle().contains(query)) count++;
         }
         return count;
     }
 
-    public AArtist getArtist(long artistId) {
-        for (AArtist artist : dt.mArtists) {
+    public AbstractArtist getArtist(long artistId) {
+        for (AbstractArtist artist : dt.mArtists) {
             if (artist.getId() == artistId) return artist;
         }
         return null;
     }
 
-    public AGenre[] getGenres() {
-        return dt.mGenres.toArray(new AGenre[0]);
+    public AbstractGenre[] getGenres() {
+        return dt.mGenres.toArray(new AbstractGenre[0]);
     }
 
-    public AGenre[] getGenres(int sort, boolean desc) {
+    public AbstractGenre[] getGenres(int sort, boolean desc) {
         return dt.sortGenre(dt.mGenres, sort, desc);
     }
 
-    public AGenre[] getPagedGenres(int sort, boolean desc, int nbItems, int offset) {
+    public AbstractGenre[] getPagedGenres(int sort, boolean desc, int nbItems, int offset) {
         return dt.sortGenre(dt.secureSublist(dt.mGenres, offset, offset + nbItems), sort, desc);
     }
 
@@ -223,28 +223,28 @@ public class StubMedialibrary extends AMedialibrary {
 
     public int getGenresCount(String query) {
         int count = 0;
-        for (AGenre genre : dt.mGenres) {
+        for (AbstractGenre genre : dt.mGenres) {
             if (genre.getTitle().contains(query)) count++;
         }
         return count;
     }
 
-    public AGenre getGenre(long genreId) {
-        for (AGenre genre : dt.mGenres) {
+    public AbstractGenre getGenre(long genreId) {
+        for (AbstractGenre genre : dt.mGenres) {
             if (genre.getId() == genreId) return genre;
         }
         return null;
     }
 
-    public APlaylist[] getPlaylists() {
-        return dt.mPlaylists.toArray(new APlaylist[0]);
+    public AbstractPlaylist[] getPlaylists() {
+        return dt.mPlaylists.toArray(new AbstractPlaylist[0]);
     }
 
-    public APlaylist[] getPlaylists(int sort, boolean desc) {
+    public AbstractPlaylist[] getPlaylists(int sort, boolean desc) {
         return dt.sortPlaylist(dt.mPlaylists, sort, desc);
     }
 
-    public APlaylist[] getPagedPlaylists(int sort, boolean desc, int nbItems, int offset) {
+    public AbstractPlaylist[] getPagedPlaylists(int sort, boolean desc, int nbItems, int offset) {
         return dt.sortPlaylist(dt.secureSublist(dt.mPlaylists, offset, offset + nbItems), sort, desc);
     }
 
@@ -254,21 +254,21 @@ public class StubMedialibrary extends AMedialibrary {
 
     public int getPlaylistsCount(String query) {
         int count = 0;
-        for (APlaylist playlist : dt.mPlaylists) {
+        for (AbstractPlaylist playlist : dt.mPlaylists) {
             if (playlist.getTitle().contains(query)) count ++;
         }
         return count;
     }
 
-    public APlaylist getPlaylist(long playlistId) {
-        for (APlaylist playlist : dt.mPlaylists) {
+    public AbstractPlaylist getPlaylist(long playlistId) {
+        for (AbstractPlaylist playlist : dt.mPlaylists) {
             if (playlist.getId() == playlistId) return playlist;
         }
         return null;
     }
 
-    public APlaylist createPlaylist(String name) {
-        APlaylist playlist = MLServiceLocator.getAPlaylist(dt.getUUID(), name, 0);
+    public AbstractPlaylist createPlaylist(String name) {
+        AbstractPlaylist playlist = MLServiceLocator.getAbstractPlaylist(dt.getUUID(), name, 0);
         dt.mPlaylists.add(playlist);
         onPlaylistsAdded();
         return playlist;
@@ -289,25 +289,25 @@ public class StubMedialibrary extends AMedialibrary {
     public void forceParserRetry() {}
     public void forceRescan() {}
 
-    public AMediaWrapper[] lastMediaPlayed() {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mHistory) {
-            if (media.getItemType() == AMediaWrapper.TYPE_VIDEO ||
-                media.getItemType() == AMediaWrapper.TYPE_AUDIO) results.add(media);
+    public AbstractMediaWrapper[] lastMediaPlayed() {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mHistory) {
+            if (media.getItemType() == AbstractMediaWrapper.TYPE_VIDEO ||
+                media.getItemType() == AbstractMediaWrapper.TYPE_AUDIO) results.add(media);
             // the native method specifies an nbItems of 100, offset 0
             if (results.size() >= 100) break;
         }
-        return results.toArray(new AMediaWrapper[0]);
+        return results.toArray(new AbstractMediaWrapper[0]);
     }
 
-    public AMediaWrapper[] lastStreamsPlayed() {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mHistory) {
-            if (media.getItemType() == AMediaWrapper.TYPE_STREAM) results.add(media);
+    public AbstractMediaWrapper[] lastStreamsPlayed() {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mHistory) {
+            if (media.getItemType() == AbstractMediaWrapper.TYPE_STREAM) results.add(media);
             // the native method specifies an nbItems of 100, offset 0
             if (results.size() >= 100) break;
         }
-        return results.toArray(new AMediaWrapper[0]);
+        return results.toArray(new AbstractMediaWrapper[0]);
     }
 
     //TODO see when it would return false
@@ -319,7 +319,7 @@ public class StubMedialibrary extends AMedialibrary {
     //TODO what if two files have the same name ??
     // TODO what happens in case of false return
     public boolean addToHistory(String mrl, String title) {
-        AMediaWrapper media = getMedia(mrl, title);
+        AbstractMediaWrapper media = getMedia(mrl, title);
         if (media == null) {
             media = addStream(mrl, title);
         }
@@ -329,52 +329,52 @@ public class StubMedialibrary extends AMedialibrary {
     }
 
     // TODO Handle uri to mrl
-    private AMediaWrapper getMedia(String mrl, String title) {
-        for (AMediaWrapper media : dt.mVideoMediaWrappers) {
+    private AbstractMediaWrapper getMedia(String mrl, String title) {
+        for (AbstractMediaWrapper media : dt.mVideoMediaWrappers) {
             if (media.getTitle().equals(title)) return media;
         }
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getTitle().equals(title)) return media;
         }
-        for (AMediaWrapper media : dt.mStreamMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mStreamMediaWrappers) {
             if (media.getTitle().equals(title)) return media;
         }
         return null;
     }
 
-    public AMediaWrapper getMedia(long id) {
-        for (AMediaWrapper media : dt.mVideoMediaWrappers) {
+    public AbstractMediaWrapper getMedia(long id) {
+        for (AbstractMediaWrapper media : dt.mVideoMediaWrappers) {
             if (media.getId() == id) return media;
         }
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getId() == id) return media;
         }
-        for (AMediaWrapper media : dt.mStreamMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mStreamMediaWrappers) {
             if (media.getId() == id) return media;
         }
         return null;
     }
 
-    public AMediaWrapper getMedia(Uri uri) {
-        for (AMediaWrapper media : dt.mVideoMediaWrappers) {
+    public AbstractMediaWrapper getMedia(Uri uri) {
+        for (AbstractMediaWrapper media : dt.mVideoMediaWrappers) {
             if (media.getUri().equals(uri)) return media;
         }
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getUri().equals(uri)) return media;
         }
-        for (AMediaWrapper media : dt.mStreamMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mStreamMediaWrappers) {
             if (media.getUri().equals(uri)) return media;
         }
         return null;
     }
 
-    public AMediaWrapper getMedia(String mrl) {
+    public AbstractMediaWrapper getMedia(String mrl) {
         return null;
     }
 
     /* TODO maybe add a list of medias not in the medialibrary which can be retrieved with mrl to
      * simulate adding a media from system */
-    public AMediaWrapper addMedia(String mrl) {
+    public AbstractMediaWrapper addMedia(String mrl) {
         return null;
     }
 
@@ -382,11 +382,11 @@ public class StubMedialibrary extends AMedialibrary {
         return true;
     }
 
-    public AMediaWrapper addStream(String mrl, String title) {
+    public AbstractMediaWrapper addStream(String mrl, String title) {
         return null;
     }
 
-    public AFolder[] getFolders(int type, int sort, boolean desc, int nbItems, int offset) {
+    public AbstractFolder[] getFolders(int type, int sort, boolean desc, int nbItems, int offset) {
         return null;
     }
 
@@ -398,7 +398,7 @@ public class StubMedialibrary extends AMedialibrary {
 
     public boolean increasePlayCount(long mediaId) {
         for (int i = 0 ; i < dt.mVideoMediaWrappers.size() ; i++) {
-            AMediaWrapper media = dt.mVideoMediaWrappers.get(i);
+            AbstractMediaWrapper media = dt.mVideoMediaWrappers.get(i);
             if (media.getId() == mediaId) {
                 media.setSeen(media.getSeen() + 1);
                 dt.mVideoMediaWrappers.set(i, media);
@@ -408,59 +408,59 @@ public class StubMedialibrary extends AMedialibrary {
     }
 
     public SearchAggregate search(String query) {
-        AMediaWrapper[] videos = searchVideo(query);
-        AMediaWrapper[] tracks = searchAudio(query);
-        AAlbum[] albums = searchAlbum(query);
-        AArtist[] artists = searchArtist(query);
-        AGenre[] genres = searchGenre(query);
-        APlaylist[] playlists = searchPlaylist(query);
+        AbstractMediaWrapper[] videos = searchVideo(query);
+        AbstractMediaWrapper[] tracks = searchAudio(query);
+        AbstractAlbum[] albums = searchAlbum(query);
+        AbstractArtist[] artists = searchArtist(query);
+        AbstractGenre[] genres = searchGenre(query);
+        AbstractPlaylist[] playlists = searchPlaylist(query);
         return new SearchAggregate(albums, artists, genres, videos, tracks, playlists);
     }
 
-    public AMediaWrapper[] searchMedia(String query) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mVideoMediaWrappers) {
+    public AbstractMediaWrapper[] searchMedia(String query) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mVideoMediaWrappers) {
             if (media.getTitle().contains(query)) results.add(media);
         }
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getTitle().contains(query)) results.add(media);
         }
-        for (AMediaWrapper media : dt.mStreamMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mStreamMediaWrappers) {
             if (media.getTitle().contains(query)) results.add(media);
         }
-        return results.toArray(new AMediaWrapper[0]);
+        return results.toArray(new AbstractMediaWrapper[0]);
     }
 
-    public AMediaWrapper[] searchMedia(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>(Arrays.asList(searchMedia(query)));
+    public AbstractMediaWrapper[] searchMedia(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>(Arrays.asList(searchMedia(query)));
         return dt.sortMedia(dt.secureSublist(results, offset, offset + nbItems), sort, desc);
     }
 
     public int getMediaCount(String query) {
         int count = 0;
-        for (AMediaWrapper media : dt.mVideoMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mVideoMediaWrappers) {
             if (media.getTitle().contains(query)) count++;
         }
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getTitle().contains(query)) count++;
         }
-        for (AMediaWrapper media : dt.mStreamMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mStreamMediaWrappers) {
             if (media.getTitle().contains(query)) count++;
         }
         return count;
     }
 
-    private AMediaWrapper[] searchAudio(String query) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    private AbstractMediaWrapper[] searchAudio(String query) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getTitle().contains(query)) results.add(media);
         }
         return dt.sortMedia(results, SORT_DEFAULT, false);
     }
 
-    public AMediaWrapper[] searchAudio(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractMediaWrapper[] searchAudio(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getTitle().contains(query)) results.add(media);
         }
         return dt.sortMedia(dt.secureSublist(results, offset, offset + nbItems), sort, desc);
@@ -468,23 +468,23 @@ public class StubMedialibrary extends AMedialibrary {
 
     public int getAudioCount(String query) {
         int count = 0;
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (media.getTitle().contains(query)) count++;
         }
         return count;
     }
 
-    private AMediaWrapper[] searchVideo(String query) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mVideoMediaWrappers) {
+    private AbstractMediaWrapper[] searchVideo(String query) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mVideoMediaWrappers) {
             if (media.getTitle().contains(query)) results.add(media);
         }
         return dt.sortMedia(results, SORT_DEFAULT, false);
     }
 
-    public AMediaWrapper[] searchVideo(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mVideoMediaWrappers) {
+    public AbstractMediaWrapper[] searchVideo(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mVideoMediaWrappers) {
             if (media.getTitle().contains(query)) results.add(media);
         }
         return dt.sortMedia(dt.secureSublist(results, offset, offset + nbItems), sort, desc);
@@ -492,60 +492,60 @@ public class StubMedialibrary extends AMedialibrary {
 
     public int getVideoCount(String query) {
         int count = 0;
-        for (AMediaWrapper media : dt.mVideoMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mVideoMediaWrappers) {
             if (media.getTitle().contains(query)) count++;
         }
         return count;
     }
 
-    public AArtist[] searchArtist(String query) {
-        ArrayList<AArtist> results = new ArrayList<>();
-        for (AArtist artist: dt.mArtists) {
+    public AbstractArtist[] searchArtist(String query) {
+        ArrayList<AbstractArtist> results = new ArrayList<>();
+        for (AbstractArtist artist: dt.mArtists) {
             if (artist.getTitle().contains(query)) results.add(artist);
         }
-        return results.toArray(new AArtist[0]);
+        return results.toArray(new AbstractArtist[0]);
     }
 
-    public AArtist[] searchArtist(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AArtist> results = new ArrayList<>(Arrays.asList(searchArtist(query)));
+    public AbstractArtist[] searchArtist(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractArtist> results = new ArrayList<>(Arrays.asList(searchArtist(query)));
         return dt.sortArtist(dt.secureSublist(results, offset, offset + nbItems), sort, desc);
     }
 
-    public AAlbum[] searchAlbum(String query) {
-        ArrayList<AAlbum> results = new ArrayList<>();
-        for (AAlbum album: dt.mAlbums) {
+    public AbstractAlbum[] searchAlbum(String query) {
+        ArrayList<AbstractAlbum> results = new ArrayList<>();
+        for (AbstractAlbum album: dt.mAlbums) {
             if (album.getTitle().contains(query)) results.add(album);
         }
-        return results.toArray(new AAlbum[0]);
+        return results.toArray(new AbstractAlbum[0]);
     }
-    public AAlbum[] searchAlbum(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AAlbum> results = new ArrayList<>(Arrays.asList(searchAlbum(query)));
+    public AbstractAlbum[] searchAlbum(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractAlbum> results = new ArrayList<>(Arrays.asList(searchAlbum(query)));
         return dt.sortAlbum(dt.secureSublist(results, offset, offset + nbItems), sort, desc);
     }
 
-    public AGenre[] searchGenre(String query) {
-        ArrayList<AGenre> results = new ArrayList<>();
-        for (AGenre genre: dt.mGenres) {
+    public AbstractGenre[] searchGenre(String query) {
+        ArrayList<AbstractGenre> results = new ArrayList<>();
+        for (AbstractGenre genre: dt.mGenres) {
             if (genre.getTitle().contains(query)) results.add(genre);
         }
-        return results.toArray(new AGenre[0]);
+        return results.toArray(new AbstractGenre[0]);
     }
 
-    public AGenre[] searchGenre(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AGenre> results = new ArrayList<>(Arrays.asList(searchGenre(query)));
+    public AbstractGenre[] searchGenre(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractGenre> results = new ArrayList<>(Arrays.asList(searchGenre(query)));
         return dt.sortGenre(dt.secureSublist(results, offset, offset + nbItems), sort, desc);
     }
 
-    public APlaylist[] searchPlaylist(String query) {
-        ArrayList<APlaylist> results = new ArrayList<>();
-        for (APlaylist playlist: dt.mPlaylists) {
+    public AbstractPlaylist[] searchPlaylist(String query) {
+        ArrayList<AbstractPlaylist> results = new ArrayList<>();
+        for (AbstractPlaylist playlist: dt.mPlaylists) {
             if (playlist.getTitle().contains(query)) results.add(playlist);
         }
-        return results.toArray(new APlaylist[0]);
+        return results.toArray(new AbstractPlaylist[0]);
     }
 
-    public APlaylist[] searchPlaylist(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<APlaylist> results = new ArrayList<>(Arrays.asList(searchPlaylist(query)));
+    public AbstractPlaylist[] searchPlaylist(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractPlaylist> results = new ArrayList<>(Arrays.asList(searchPlaylist(query)));
         return dt.sortPlaylist(dt.secureSublist(results, offset, offset + nbItems), sort, desc);
     }
 }
diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubPlaylist.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubPlaylist.java
index 3863c5b12a..ebd375aacd 100644
--- a/medialibrary/src/org/videolan/medialibrary/stubs/StubPlaylist.java
+++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubPlaylist.java
@@ -2,14 +2,14 @@ package org.videolan.medialibrary.stubs;
 
 import android.os.Parcel;
 
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
-import org.videolan.medialibrary.interfaces.media.APlaylist;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-public class StubPlaylist extends APlaylist {
+public class StubPlaylist extends AbstractPlaylist {
 
     private ArrayList<Long> mTracksId = new ArrayList<>();
     private StubDataSource dt = StubDataSource.getInstance();
@@ -22,22 +22,22 @@ public class StubPlaylist extends APlaylist {
         super(in);
     }
 
-    public AMediaWrapper[] getTracks() {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractMediaWrapper[] getTracks() {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (mTracksId.contains(media.getId())) results.add(media);
         }
-        return results.toArray(new AMediaWrapper[0]);
+        return results.toArray(new AbstractMediaWrapper[0]);
     }
 
-    public AMediaWrapper[] getPagedTracks(int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>(Arrays.asList(getTracks()));
-        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AMediaWrapper[0]);
+    public AbstractMediaWrapper[] getPagedTracks(int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>(Arrays.asList(getTracks()));
+        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AbstractMediaWrapper[0]);
     }
 
     public int getRealTracksCount() {
         int count = 0;
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (mTracksId.contains(media.getId())) count++;
         }
         return count;
@@ -91,20 +91,20 @@ public class StubPlaylist extends APlaylist {
         return false;
     }
 
-    public AMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
-        ArrayList<AMediaWrapper> results = new ArrayList<>();
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+    public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
+        ArrayList<AbstractMediaWrapper> results = new ArrayList<>();
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (mTracksId.contains(media.getId()) &&
                     media.getTitle().contains(query)) results.add(media);
         }
         results = new ArrayList<>(Arrays.asList(dt.sortMedia(results, sort, desc)));
-        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AMediaWrapper[0]);
+        return dt.secureSublist(results, offset, offset + nbItems).toArray(new AbstractMediaWrapper[0]);
 
     }
 
     public int searchTracksCount(String query) {
         int count = 0;
-        for (AMediaWrapper media : dt.mAudioMediaWrappers) {
+        for (AbstractMediaWrapper media : dt.mAudioMediaWrappers) {
             if (mTracksId.contains(media.getId()) &&
                     media.getTitle().contains(query)) count++;
         }
diff --git a/vlc-android/res/layout/folder_item.xml b/vlc-android/res/layout/folder_item.xml
index e5894db5ab..5187ae9e5a 100644
--- a/vlc-android/res/layout/folder_item.xml
+++ b/vlc-android/res/layout/folder_item.xml
@@ -5,7 +5,7 @@
     <data>
         <variable
             name="folder"
-            type="org.videolan.medialibrary.interfaces.media.AFolder" />
+            type="org.videolan.medialibrary.interfaces.media.AbstractFolder" />
 
         <variable
             name="bgColor"
diff --git a/vlc-android/res/layout/history_item.xml b/vlc-android/res/layout/history_item.xml
index f90f9c613e..1308eaf73b 100644
--- a/vlc-android/res/layout/history_item.xml
+++ b/vlc-android/res/layout/history_item.xml
@@ -4,7 +4,7 @@
 
     <data>
 
-        <import type="org.videolan.medialibrary.interfaces.media.AMediaWrapper" />
+        <import type="org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper" />
 
         <import type="android.text.TextUtils" />
 
@@ -16,7 +16,7 @@
 
         <variable
             name="media"
-            type="AMediaWrapper" />
+            type="org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper" />
 
         <variable
             name="cover"
diff --git a/vlc-android/res/layout/playlist_item.xml b/vlc-android/res/layout/playlist_item.xml
index b7a3f9fc41..f9e2231c0e 100644
--- a/vlc-android/res/layout/playlist_item.xml
+++ b/vlc-android/res/layout/playlist_item.xml
@@ -10,7 +10,7 @@
             type="org.videolan.vlc.gui.audio.PlaylistAdapter.ViewHolder"/>
         <variable
             name="media"
-            type="org.videolan.medialibrary.interfaces.media.AMediaWrapper"/>
+            type="org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper"/>
         <variable
             name="subTitle"
             type="String"/>
diff --git a/vlc-android/res/layout/tv_simple_list_item.xml b/vlc-android/res/layout/tv_simple_list_item.xml
index d728a7c852..a05cb63e72 100644
--- a/vlc-android/res/layout/tv_simple_list_item.xml
+++ b/vlc-android/res/layout/tv_simple_list_item.xml
@@ -7,7 +7,7 @@
             type="int" />
         <variable
             name="media"
-            type="org.videolan.medialibrary.interfaces.media.AMediaWrapper" />
+            type="org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper" />
     </data>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:padding="@dimen/half_default_margin"
diff --git a/vlc-android/res/layout/video_grid_card.xml b/vlc-android/res/layout/video_grid_card.xml
index 5a8e45b40c..3dccadf089 100644
--- a/vlc-android/res/layout/video_grid_card.xml
+++ b/vlc-android/res/layout/video_grid_card.xml
@@ -11,7 +11,7 @@
 
         <variable
             name="media"
-            type="org.videolan.medialibrary.interfaces.media.AMediaWrapper" />
+            type="org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper" />
 
         <variable
             name="seen"
diff --git a/vlc-android/res/layout/video_list_card.xml b/vlc-android/res/layout/video_list_card.xml
index 64f9c07f7e..a4da8f2a02 100644
--- a/vlc-android/res/layout/video_list_card.xml
+++ b/vlc-android/res/layout/video_list_card.xml
@@ -8,7 +8,7 @@
 
         <variable
             name="media"
-            type="org.videolan.medialibrary.interfaces.media.AMediaWrapper" />
+            type="org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper" />
 
         <variable
             name="seen"
diff --git a/vlc-android/src/org/videolan/vlc/MediaParsingService.kt b/vlc-android/src/org/videolan/vlc/MediaParsingService.kt
index a73459da59..125cbcd746 100644
--- a/vlc-android/src/org/videolan/vlc/MediaParsingService.kt
+++ b/vlc-android/src/org/videolan/vlc/MediaParsingService.kt
@@ -44,7 +44,7 @@ import kotlinx.coroutines.*
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.channels.actor
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.interfaces.DevicesDiscoveryCb
 import org.videolan.vlc.gui.helpers.NotificationHelper
 import org.videolan.vlc.repository.DirectoryRepository
@@ -62,7 +62,7 @@ class MediaParsingService : Service(), DevicesDiscoveryCb, CoroutineScope {
     private lateinit var localBroadcastManager: LocalBroadcastManager
 
     private val binder = LocalBinder()
-    private lateinit var medialibrary: AMedialibrary
+    private lateinit var medialibrary: AbstractMedialibrary
     private var parsing = 0
     private var reload = 0
     private var currentDiscovery: String? = null
@@ -91,13 +91,13 @@ class MediaParsingService : Service(), DevicesDiscoveryCb, CoroutineScope {
     override fun onCreate() {
         super.onCreate()
         localBroadcastManager = LocalBroadcastManager.getInstance(this)
-        medialibrary = AMedialibrary.getInstance()
+        medialibrary = AbstractMedialibrary.getInstance()
         medialibrary.addDeviceDiscoveryCb(this@MediaParsingService)
         val filter = IntentFilter()
         filter.addAction(ACTION_PAUSE_SCAN)
         filter.addAction(ACTION_RESUME_SCAN)
         registerReceiver(receiver, filter)
-        localBroadcastManager.registerReceiver(receiver, IntentFilter(AMedialibrary.ACTION_IDLE))
+        localBroadcastManager.registerReceiver(receiver, IntentFilter(AbstractMedialibrary.ACTION_IDLE))
         val pm = applicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager
         wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "VLC:MediaParsigService")
         wakeLock.acquire()
@@ -176,7 +176,7 @@ class MediaParsingService : Service(), DevicesDiscoveryCb, CoroutineScope {
                     return
                 }
                 medialibrary.addDevice(uuid, path, true)
-                for (folder in AMedialibrary.getBlackList())
+                for (folder in AbstractMedialibrary.getBlackList())
                     medialibrary.banFolder(path + folder)
             }
         }
@@ -222,7 +222,7 @@ class MediaParsingService : Service(), DevicesDiscoveryCb, CoroutineScope {
         scanActivated = true
         when {
             shouldInit -> {
-                for (folder in AMedialibrary.getBlackList())
+                for (folder in AbstractMedialibrary.getBlackList())
                     medialibrary.banFolder(AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY + folder)
                 if (preselectedStorages.isEmpty()) medialibrary.discover(AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY)
                 else {
@@ -362,7 +362,7 @@ class MediaParsingService : Service(), DevicesDiscoveryCb, CoroutineScope {
     private val actions = actor<MLAction>(context = Dispatchers.IO, capacity = Channel.UNLIMITED) {
         for (action in channel) when (action) {
             is DiscoverStorage -> {
-                for (folder in AMedialibrary.getBlackList()) medialibrary.banFolder(action.path + folder)
+                for (folder in AbstractMedialibrary.getBlackList()) medialibrary.banFolder(action.path + folder)
                 medialibrary.discover(action.path)
             }
             is DiscoverFolder -> {
@@ -373,8 +373,8 @@ class MediaParsingService : Service(), DevicesDiscoveryCb, CoroutineScope {
                 val context = this@MediaParsingService
                 var shouldInit = !dbExists()
                 val initCode = medialibrary.init(context)
-                shouldInit = shouldInit or (initCode == AMedialibrary.ML_INIT_DB_RESET)
-                if (initCode != AMedialibrary.ML_INIT_FAILED) initMedialib(action.parse, context, shouldInit, action.upgrade)
+                shouldInit = shouldInit or (initCode == AbstractMedialibrary.ML_INIT_DB_RESET)
+                if (initCode != AbstractMedialibrary.ML_INIT_FAILED) initMedialib(action.parse, context, shouldInit, action.upgrade)
                 else exitCommand()
             }
             is StartScan -> {
@@ -402,7 +402,7 @@ class MediaParsingService : Service(), DevicesDiscoveryCb, CoroutineScope {
                     medialibrary.resumeBackgroundOperations()
                     scanPaused = false
                 }
-                AMedialibrary.ACTION_IDLE -> if (intent.getBooleanExtra(AMedialibrary.STATE_IDLE, true)) {
+                AbstractMedialibrary.ACTION_IDLE -> if (intent.getBooleanExtra(AbstractMedialibrary.STATE_IDLE, true)) {
                     if (!scanPaused) {
                         exitCommand()
                         return
@@ -438,7 +438,7 @@ fun Context.rescan() {
 }
 
 fun Context.startMedialibrary(firstRun: Boolean = false, upgrade: Boolean = false, parse: Boolean = true) = AppScope.launch {
-    if (AMedialibrary.getInstance().isStarted || !Permissions.canReadStorage(this@startMedialibrary)) return@launch
+    if (AbstractMedialibrary.getInstance().isStarted || !Permissions.canReadStorage(this@startMedialibrary)) return@launch
     val prefs = withContext(Dispatchers.IO) { Settings.getInstance(this@startMedialibrary) }
     val scanOpt = if (Settings.showTvUi) ML_SCAN_ON else prefs.getInt(KEY_MEDIALIBRARY_SCAN, -1)
     if (parse && scanOpt == -1) {
@@ -452,7 +452,7 @@ fun Context.startMedialibrary(firstRun: Boolean = false, upgrade: Boolean = fals
 }
 
 private suspend fun Context.dbExists() = withContext(Dispatchers.IO) {
-    File(getDir("db", Context.MODE_PRIVATE).toString() + AMedialibrary.VLC_MEDIA_DB_NAME).exists()
+    File(getDir("db", Context.MODE_PRIVATE).toString() + AbstractMedialibrary.VLC_MEDIA_DB_NAME).exists()
 }
 
 private sealed class MLAction
diff --git a/vlc-android/src/org/videolan/vlc/MediaSessionCallback.kt b/vlc-android/src/org/videolan/vlc/MediaSessionCallback.kt
index af94e5f5f9..c2f331c400 100644
--- a/vlc-android/src/org/videolan/vlc/MediaSessionCallback.kt
+++ b/vlc-android/src/org/videolan/vlc/MediaSessionCallback.kt
@@ -7,7 +7,7 @@ import android.support.v4.media.session.MediaSessionCompat
 import android.support.v4.media.session.PlaybackStateCompat
 import android.view.KeyEvent
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.extensions.ExtensionsManager
 import org.videolan.vlc.media.MediaSessionBrowser
@@ -94,7 +94,7 @@ internal class MediaSessionCallback(private val playbackService: PlaybackService
             playbackService.getFromMl { isStarted }
             val vsp = VoiceSearchParams(query ?: "", extras)
             var items: Array<out MediaLibraryItem>? = null
-            var tracks: Array<AMediaWrapper>? = null
+            var tracks: Array<AbstractMediaWrapper>? = null
             when {
                 vsp.isAny -> {
                     items = playbackService.medialibrary.audio.also { if (!playbackService.isShuffling) playbackService.shuffle() }
diff --git a/vlc-android/src/org/videolan/vlc/PlaybackService.kt b/vlc-android/src/org/videolan/vlc/PlaybackService.kt
index 54369ec3a5..ad181276b5 100644
--- a/vlc-android/src/org/videolan/vlc/PlaybackService.kt
+++ b/vlc-android/src/org/videolan/vlc/PlaybackService.kt
@@ -28,7 +28,6 @@ import android.media.AudioManager
 import android.media.audiofx.AudioEffect
 import android.net.Uri
 import android.os.*
-import android.provider.SyncStateContract
 import android.support.v4.media.MediaBrowserCompat
 import android.support.v4.media.MediaDescriptionCompat
 import android.support.v4.media.MediaMetadataCompat
@@ -57,8 +56,8 @@ import org.videolan.libvlc.Media
 import org.videolan.libvlc.MediaPlayer
 import org.videolan.libvlc.RendererItem
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.gui.helpers.AudioUtil
 import org.videolan.vlc.gui.helpers.BitmapUtil
 import org.videolan.vlc.gui.helpers.NotificationHelper
@@ -89,7 +88,7 @@ class PlaybackService : MediaBrowserServiceCompat(), CoroutineScope, LifecycleOw
     private lateinit var keyguardManager: KeyguardManager
     internal lateinit var settings: SharedPreferences
     private val mBinder = LocalBinder()
-    internal lateinit var medialibrary: AMedialibrary
+    internal lateinit var medialibrary: AbstractMedialibrary
 
     private val callbacks = mutableListOf<Callback>()
     private var detectHeadset = true
@@ -201,7 +200,7 @@ class PlaybackService : MediaBrowserServiceCompat(), CoroutineScope, LifecycleOw
                     val notificationIntent = Intent(this, VideoPlayerActivity::class.java)
                     PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT)
                 }
-                playlistManager.videoBackground || canSwitchToVideo() && !currentMediaHasFlag(AMediaWrapper.MEDIA_FORCE_AUDIO) -> {//resume video playback
+                playlistManager.videoBackground || canSwitchToVideo() && !currentMediaHasFlag(AbstractMediaWrapper.MEDIA_FORCE_AUDIO) -> {//resume video playback
                     /* Resume VideoPlayerActivity from ACTION_REMOTE_SWITCH_VIDEO intent */
                     val notificationIntent = Intent(ACTION_REMOTE_SWITCH_VIDEO)
                     PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT)
@@ -342,7 +341,7 @@ class PlaybackService : MediaBrowserServiceCompat(), CoroutineScope, LifecycleOw
     val mediaListSize: Int
         get() = playlistManager.getMediaListSize()
 
-    val medias: List<AMediaWrapper>
+    val media: List<AbstractMediaWrapper>
         @MainThread
         get() = playlistManager.getMediaList()
 
@@ -360,7 +359,7 @@ class PlaybackService : MediaBrowserServiceCompat(), CoroutineScope, LifecycleOw
         @MainThread
         get() = playlistManager.currentIndex
 
-    val currentMediaWrapper: AMediaWrapper?
+    val currentMediaWrapper: AbstractMediaWrapper?
         @MainThread
         get() = this@PlaybackService.playlistManager.getCurrentMedia()
 
@@ -523,7 +522,7 @@ class PlaybackService : MediaBrowserServiceCompat(), CoroutineScope, LifecycleOw
             ACTION_REMOTE_SWITCH_VIDEO -> {
                 removePopup()
                 if (hasMedia()) {
-                    currentMediaWrapper!!.removeFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
+                    currentMediaWrapper!!.removeFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
                     playlistManager.switchToVideo()
                 }
             }
@@ -677,7 +676,7 @@ class PlaybackService : MediaBrowserServiceCompat(), CoroutineScope, LifecycleOw
                         cover = BitmapFactory.decodeResource(ctx.resources, R.drawable.ic_no_media)
 
                     notification = NotificationHelper.createPlaybackNotification(ctx,
-                            mw.hasFlag(AMediaWrapper.MEDIA_FORCE_AUDIO), title, artist, album,
+                            mw.hasFlag(AbstractMediaWrapper.MEDIA_FORCE_AUDIO), title, artist, album,
                             cover, playing, pausable, sessionToken, sessionPendingIntent)
                     if (isPlayingPopup) return@launch
                     if (!AndroidUtil.isLolliPopOrLater || playing || audioFocusHelper.lossTransient) {
@@ -1007,12 +1006,12 @@ class PlaybackService : MediaBrowserServiceCompat(), CoroutineScope, LifecycleOw
     fun loadLocation(mediaPath: String) = loadLocations(listOf(mediaPath), 0)
 
     @MainThread
-    fun load(mediaList: Array<AMediaWrapper>?, position: Int) {
+    fun load(mediaList: Array<AbstractMediaWrapper>?, position: Int) {
         mediaList?.let { load(it.toList(), position) }
     }
 
     @MainThread
-    fun load(mediaList: List<AMediaWrapper>, position: Int) = playlistManager.load(mediaList, position)
+    fun load(mediaList: List<AbstractMediaWrapper>, position: Int) = playlistManager.load(mediaList, position)
 
     private fun updateMediaQueue() = launch {
         val ctx = this@PlaybackService
@@ -1035,7 +1034,7 @@ class PlaybackService : MediaBrowserServiceCompat(), CoroutineScope, LifecycleOw
     }
 
     @MainThread
-    fun load(media: AMediaWrapper) = load(listOf(media), 0)
+    fun load(media: AbstractMediaWrapper) = load(listOf(media), 0)
 
     /**
      * Play a media from the media list (playlist)
@@ -1106,32 +1105,32 @@ class PlaybackService : MediaBrowserServiceCompat(), CoroutineScope, LifecycleOw
      */
 
     @MainThread
-    fun append(mediaList: Array<AMediaWrapper>) = append(mediaList.toList())
+    fun append(mediaList: Array<AbstractMediaWrapper>) = append(mediaList.toList())
 
     @MainThread
-    fun append(mediaList: List<AMediaWrapper>) = launch {
+    fun append(mediaList: List<AbstractMediaWrapper>) = launch {
         playlistManager.append(mediaList)
         onMediaListChanged()
     }
 
     @MainThread
-    fun append(media: AMediaWrapper) = append(listOf(media))
+    fun append(media: AbstractMediaWrapper) = append(listOf(media))
 
     /**
      * Insert into the current existing playlist
      */
 
     @MainThread
-    fun insertNext(mediaList: Array<AMediaWrapper>) = insertNext(mediaList.toList())
+    fun insertNext(mediaList: Array<AbstractMediaWrapper>) = insertNext(mediaList.toList())
 
     @MainThread
-    private fun insertNext(mediaList: List<AMediaWrapper>) {
+    private fun insertNext(mediaList: List<AbstractMediaWrapper>) {
         playlistManager.insertNext(mediaList)
         onMediaListChanged()
     }
 
     @MainThread
-    fun insertNext(media: AMediaWrapper) = insertNext(listOf(media))
+    fun insertNext(media: AbstractMediaWrapper) = insertNext(listOf(media))
 
     /**
      * Move an item inside the playlist.
@@ -1140,7 +1139,7 @@ class PlaybackService : MediaBrowserServiceCompat(), CoroutineScope, LifecycleOw
     fun moveItem(positionStart: Int, positionEnd: Int) = playlistManager.moveItem(positionStart, positionEnd)
 
     @MainThread
-    fun insertItem(position: Int, mw: AMediaWrapper) = playlistManager.insertItem(position, mw)
+    fun insertItem(position: Int, mw: AbstractMediaWrapper) = playlistManager.insertItem(position, mw)
 
 
     @MainThread
diff --git a/vlc-android/src/org/videolan/vlc/RecommendationsService.kt b/vlc-android/src/org/videolan/vlc/RecommendationsService.kt
index 335eaae987..62095dfccc 100644
--- a/vlc-android/src/org/videolan/vlc/RecommendationsService.kt
+++ b/vlc-android/src/org/videolan/vlc/RecommendationsService.kt
@@ -32,7 +32,7 @@ import androidx.core.app.NotificationCompat
 import androidx.core.app.NotificationManagerCompat
 import androidx.core.content.ContextCompat
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.gui.helpers.BitmapUtil
 import org.videolan.vlc.gui.video.VideoPlayerActivity
 import org.videolan.vlc.util.*
@@ -55,7 +55,7 @@ class RecommendationsService : IntentService("RecommendationService"), Coroutine
         doRecommendations()
     }
 
-    private fun buildRecommendation(mw: AMediaWrapper?, id: Int, priority: Int) {
+    private fun buildRecommendation(mw: AbstractMediaWrapper?, id: Int, priority: Int) {
         if (mw == null) return
         // build the recommendation as a Notification object
         val notification = NotificationCompat.BigPictureStyle(
@@ -76,7 +76,7 @@ class RecommendationsService : IntentService("RecommendationService"), Coroutine
         mNotificationManager.notify(id, notification)
     }
 
-    private fun buildPendingIntent(mw: AMediaWrapper, id: Int): PendingIntent {
+    private fun buildPendingIntent(mw: AbstractMediaWrapper, id: Int): PendingIntent {
         val intent = Intent(this@RecommendationsService, VideoPlayerActivity::class.java)
         intent.action = PLAY_FROM_VIDEOGRID
         intent.putExtra(PLAY_EXTRA_ITEM_LOCATION, mw.uri)
diff --git a/vlc-android/src/org/videolan/vlc/StoragesMonitor.kt b/vlc-android/src/org/videolan/vlc/StoragesMonitor.kt
index 99f34d5fee..23464d7af3 100644
--- a/vlc-android/src/org/videolan/vlc/StoragesMonitor.kt
+++ b/vlc-android/src/org/videolan/vlc/StoragesMonitor.kt
@@ -12,7 +12,7 @@ import androidx.lifecycle.ProcessLifecycleOwner
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.channels.actor
 import kotlinx.coroutines.delay
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.vlc.gui.DialogActivity
 import org.videolan.vlc.util.AppScope
 import org.videolan.vlc.util.getFromMl
@@ -53,7 +53,7 @@ class StoragesMonitor : BroadcastReceiver() {
             }
             is Unmount -> {
                 delay(100L)
-                AMedialibrary.getInstance().removeDevice(action.uuid, action.path)
+                AbstractMedialibrary.getInstance().removeDevice(action.uuid, action.path)
             }
         }
     }
diff --git a/vlc-android/src/org/videolan/vlc/VLCApplication.kt b/vlc-android/src/org/videolan/vlc/VLCApplication.kt
index 29c946108e..b6017373aa 100644
--- a/vlc-android/src/org/videolan/vlc/VLCApplication.kt
+++ b/vlc-android/src/org/videolan/vlc/VLCApplication.kt
@@ -37,7 +37,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.Dialog
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.vlc.gui.DialogActivity
 import org.videolan.vlc.gui.dialogs.VlcProgressDialog
 import org.videolan.vlc.gui.helpers.AudioUtil
@@ -206,8 +206,8 @@ class VLCApplication : Application() {
             dataMap.clear()
         }
 
-        val mlInstance: AMedialibrary
-            get() = AMedialibrary.getInstance()
+        val mlInstance: AbstractMedialibrary
+            get() = AbstractMedialibrary.getInstance()
 
         /**
          * Check if application is currently displayed
diff --git a/vlc-android/src/org/videolan/vlc/extensions/ExtensionManagerService.java b/vlc-android/src/org/videolan/vlc/extensions/ExtensionManagerService.java
index 51878156c7..7c6bfd214a 100644
--- a/vlc-android/src/org/videolan/vlc/extensions/ExtensionManagerService.java
+++ b/vlc-android/src/org/videolan/vlc/extensions/ExtensionManagerService.java
@@ -38,7 +38,7 @@ import android.text.TextUtils;
 import android.util.Log;
 
 import org.videolan.medialibrary.MLServiceLocator;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 import org.videolan.vlc.extensions.api.IExtensionHost;
 import org.videolan.vlc.extensions.api.IExtensionService;
 import org.videolan.vlc.extensions.api.VLCExtensionItem;
@@ -202,7 +202,7 @@ public class ExtensionManagerService extends Service {
 
             @Override
             public void playUri(Uri uri, String title) throws RemoteException {
-                final AMediaWrapper media = MLServiceLocator.getAMediaWrapper(uri);
+                final AbstractMediaWrapper media = MLServiceLocator.getAbstractMediaWrapper(uri);
                 if (!TextUtils.isEmpty(title));
                     media.setDisplayTitle(title);
                 mHandler.post(new Runnable() {
diff --git a/vlc-android/src/org/videolan/vlc/extensions/Utils.java b/vlc-android/src/org/videolan/vlc/extensions/Utils.java
index baeb998a16..10e2ab76e2 100644
--- a/vlc-android/src/org/videolan/vlc/extensions/Utils.java
+++ b/vlc-android/src/org/videolan/vlc/extensions/Utils.java
@@ -3,13 +3,13 @@ package org.videolan.vlc.extensions;
 import android.net.Uri;
 
 import org.videolan.medialibrary.MLServiceLocator;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 import org.videolan.vlc.extensions.api.VLCExtensionItem;
 
 public class Utils {
 
-    public static AMediaWrapper mediawrapperFromExtension(VLCExtensionItem vlcItem) {
-                AMediaWrapper media = MLServiceLocator.getAMediaWrapper(Uri.parse(vlcItem.link));
+    public static AbstractMediaWrapper mediawrapperFromExtension(VLCExtensionItem vlcItem) {
+                AbstractMediaWrapper media = MLServiceLocator.getAbstractMediaWrapper(Uri.parse(vlcItem.link));
                 media.setDisplayTitle(vlcItem.title);
                 if (vlcItem.type != VLCExtensionItem.TYPE_OTHER_FILE)
                     media.setType(vlcItem.type);
diff --git a/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt b/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt
index 19671f9bee..271e9fe923 100644
--- a/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt
@@ -48,7 +48,7 @@ import com.google.android.material.snackbar.Snackbar
 import com.google.android.material.tabs.TabLayout
 import kotlinx.coroutines.*
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.tools.setVisibility
 import org.videolan.vlc.*
 import org.videolan.vlc.gui.audio.AudioPlayer
@@ -293,7 +293,7 @@ open class AudioPlayerContainerActivity : BaseActivity() {
     }
 
     private fun showProgressBar() {
-        if (!AMedialibrary.getInstance().isWorking) return
+        if (!AbstractMedialibrary.getInstance().isWorking) return
         MediaParsingService.progress.value?.run {
             val vsc = findViewById<View>(R.id.scan_viewstub)
             if (vsc != null) {
@@ -345,7 +345,7 @@ open class AudioPlayerContainerActivity : BaseActivity() {
             }
         })
         MediaParsingService.progress.observe(this, Observer { scanProgress ->
-            if (scanProgress == null || !AMedialibrary.getInstance().isWorking) {
+            if (scanProgress == null || !AbstractMedialibrary.getInstance().isWorking) {
                 updateProgressVisibility(false)
                 return@Observer
             }
@@ -353,7 +353,7 @@ open class AudioPlayerContainerActivity : BaseActivity() {
             if (scanProgressText != null) scanProgressText!!.text = scanProgress.discovery
             if (scanProgressBar != null) scanProgressBar!!.progress = scanProgress.parsing
         })
-        AMedialibrary.getState().observe(this, Observer { started -> if (started != null) updateProgressVisibility(started) })
+        AbstractMedialibrary.getState().observe(this, Observer { started -> if (started != null) updateProgressVisibility(started) })
         MediaParsingService.newStorages.observe(this, Observer<List<String>> { devices ->
             if (devices == null) return@Observer
             for (device in devices) UiTools.newStorageDetected(this@AudioPlayerContainerActivity, device)
diff --git a/vlc-android/src/org/videolan/vlc/gui/DialogActivity.kt b/vlc-android/src/org/videolan/vlc/gui/DialogActivity.kt
index c7b59a8839..a718cd72d5 100644
--- a/vlc-android/src/org/videolan/vlc/gui/DialogActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/DialogActivity.kt
@@ -27,7 +27,7 @@ import android.os.Bundle
 import android.text.TextUtils
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.R
 import org.videolan.vlc.gui.dialogs.*
 import org.videolan.vlc.media.MediaUtils
@@ -68,7 +68,7 @@ class DialogActivity : BaseActivity() {
 
     @ObsoleteCoroutinesApi
     private fun setupSubsDialog() {
-        val medialist = intent.getParcelableArrayListExtra<AMediaWrapper>(EXTRA_MEDIALIST)
+        val medialist = intent.getParcelableArrayListExtra<AbstractMediaWrapper>(EXTRA_MEDIALIST)
         if (medialist != null)
             MediaUtils.getSubs(this, medialist)
         else
diff --git a/vlc-android/src/org/videolan/vlc/gui/HistoryAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/HistoryAdapter.kt
index 6a01dc5446..fa66b2452f 100644
--- a/vlc-android/src/org/videolan/vlc/gui/HistoryAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/HistoryAdapter.kt
@@ -24,7 +24,7 @@ import android.view.View
 import android.view.ViewGroup
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.tools.MultiSelectAdapter
 import org.videolan.tools.MultiSelectHelper
@@ -37,9 +37,9 @@ import org.videolan.vlc.util.Util
 
 @ObsoleteCoroutinesApi
 @ExperimentalCoroutinesApi
-class HistoryAdapter(private val mEventsHandler: IEventsHandler) : DiffUtilAdapter<AMediaWrapper, HistoryAdapter.ViewHolder>(), MultiSelectAdapter<MediaWrapper> {
+class HistoryAdapter(private val mEventsHandler: IEventsHandler) : DiffUtilAdapter<AbstractMediaWrapper, HistoryAdapter.ViewHolder>(), MultiSelectAdapter<AbstractMediaWrapper> {
     private var mLayoutInflater: LayoutInflater? = null
-    var multiSelectHelper: MultiSelectHelper<AMediaWrapper> = MultiSelectHelper(this, UPDATE_SELECTION)
+    var multiSelectHelper: MultiSelectHelper<AbstractMediaWrapper> = MultiSelectHelper(this, UPDATE_SELECTION)
 
     inner class ViewHolder(binding: HistoryItemBinding) : SelectorViewHolder<HistoryItemBinding>(binding) {
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/HistoryFragment.kt b/vlc-android/src/org/videolan/vlc/gui/HistoryFragment.kt
index 889a64de8c..a8e1f78196 100644
--- a/vlc-android/src/org/videolan/vlc/gui/HistoryFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/HistoryFragment.kt
@@ -32,7 +32,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
 import kotlinx.android.synthetic.main.history_list.*
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.tools.KeyHelper
 import org.videolan.tools.MultiSelectHelper
@@ -52,7 +52,7 @@ private const val TAG = "VLC/HistoryFragment"
 @ExperimentalCoroutinesApi
 class HistoryFragment : MediaBrowserFragment<HistoryModel>(), IRefreshable, IHistory, SwipeRefreshLayout.OnRefreshListener, IEventsHandler {
 
-    private lateinit var multiSelectHelper: MultiSelectHelper<AMediaWrapper>
+    private lateinit var multiSelectHelper: MultiSelectHelper<AbstractMediaWrapper>
     private val historyAdapter: HistoryAdapter = HistoryAdapter(this)
 
     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
@@ -63,7 +63,7 @@ class HistoryFragment : MediaBrowserFragment<HistoryModel>(), IRefreshable, IHis
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         viewModel = ViewModelProviders.of(requireActivity(), HistoryModel.Factory(requireContext())).get(HistoryModel::class.java)
-        viewModel.dataset.observe(this, Observer<List<AMediaWrapper>> { list ->
+        viewModel.dataset.observe(this, Observer<List<AbstractMediaWrapper>> { list ->
             list?.let {
                 historyAdapter.update(it)
                 updateEmptyView()
@@ -195,8 +195,8 @@ class HistoryFragment : MediaBrowserFragment<HistoryModel>(), IRefreshable, IHis
             invalidateActionMode()
             return
         }
-        if (position != 0) viewModel.moveUp(item as AMediaWrapper)
-        MediaUtils.openMedia(v.context, item as AMediaWrapper)
+        if (position != 0) viewModel.moveUp(item as AbstractMediaWrapper)
+        MediaUtils.openMedia(v.context, item as AbstractMediaWrapper)
     }
 
     override fun onLongClick(v: View, position: Int, item: MediaLibraryItem): Boolean {
diff --git a/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt b/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt
index be1946f7eb..268a540b1c 100644
--- a/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt
@@ -22,8 +22,8 @@ import kotlinx.coroutines.*
 import org.videolan.libvlc.Media
 import org.videolan.libvlc.util.Extensions
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AArtist
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractArtist
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.R
 import org.videolan.vlc.VLCApplication
@@ -69,7 +69,7 @@ class InfoActivity : AudioPlayerContainerActivity(), View.OnClickListener, PathA
         }
         this.item = item
         if (item.id == 0L) {
-            val libraryItem = VLCApplication.mlInstance.getMedia((item as AMediaWrapper).uri)
+            val libraryItem = VLCApplication.mlInstance.getMedia((item as AbstractMediaWrapper).uri)
             if (libraryItem != null)
                 this.item = libraryItem
         }
@@ -79,7 +79,7 @@ class InfoActivity : AudioPlayerContainerActivity(), View.OnClickListener, PathA
         model = getModel()
 
         binding.fab.setOnClickListener(this)
-        if (item is AMediaWrapper) {
+        if (item is AbstractMediaWrapper) {
             adapter = MediaInfoAdapter()
             binding.list.layoutManager = LinearLayoutManager(binding.root.context)
             binding.list.adapter = adapter
@@ -111,15 +111,15 @@ class InfoActivity : AudioPlayerContainerActivity(), View.OnClickListener, PathA
         if (length > 0)
             binding.length = Tools.millisToText(length)
 
-        if (item is AMediaWrapper) {
-            val media = item as AMediaWrapper
+        if (item is AbstractMediaWrapper) {
+            val media = item as AbstractMediaWrapper
             val resolution = generateResolutionClass(media.width, media.height)
             binding.resolution = resolution
         }
 
         when {
             item.itemType == MediaLibraryItem.TYPE_MEDIA -> {
-                val media = item as AMediaWrapper
+                val media = item as AbstractMediaWrapper
 //                binding.path = Uri.decode(media!!.uri.path).replace("/", " > ")
                 binding.progress = if (media.length == 0L) 0 else (100.toLong() * media.time / length).toInt()
                 binding.sizeTitleText = getString(R.string.file_size)
@@ -138,7 +138,7 @@ class InfoActivity : AudioPlayerContainerActivity(), View.OnClickListener, PathA
                 } else binding.ariane.visibility = View.GONE
             }
             item.itemType == MediaLibraryItem.TYPE_ARTIST -> {
-                val albums = (item as AArtist).albums
+                val albums = (item as AbstractArtist).albums
                 val nbAlbums = albums?.size ?: 0
                 binding.sizeTitleText = getString(R.string.albums)
                 binding.sizeValueText = nbAlbums.toString()
@@ -212,7 +212,7 @@ class InfoModel : ViewModel(), CoroutineScope by MainScope() {
         cover.value = mrl?.let { withContext(Dispatchers.IO) { AudioUtil.readCoverBitmap(Uri.decode(it), width) } }
     }
 
-    internal fun parseTracks(context: Context, mw: AMediaWrapper) = launch {
+    internal fun parseTracks(context: Context, mw: AbstractMediaWrapper) = launch {
         val media = withContext(Dispatchers.IO) {
             val libVlc = VLCInstance[context]
             Media(libVlc, mw.uri).apply { parse() }
@@ -231,11 +231,11 @@ class InfoModel : ViewModel(), CoroutineScope by MainScope() {
         mediaTracks.value = tracks.toList()
     }
 
-    internal fun checkFile(mw: AMediaWrapper) = launch {
+    internal fun checkFile(mw: AbstractMediaWrapper) = launch {
         val itemFile = withContext(Dispatchers.IO) { File(Uri.decode(mw.location.substring(5))) }
 
         if (!withContext(Dispatchers.IO) { itemFile.exists() } || !isActive) return@launch
-        if (mw.type == AMediaWrapper.TYPE_VIDEO) checkSubtitles(itemFile)
+        if (mw.type == AbstractMediaWrapper.TYPE_VIDEO) checkSubtitles(itemFile)
         sizeText.value = itemFile.length().readableFileSize()
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/MainActivity.kt b/vlc-android/src/org/videolan/vlc/gui/MainActivity.kt
index 5c4aba0431..c1ad716311 100644
--- a/vlc-android/src/org/videolan/vlc/gui/MainActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/MainActivity.kt
@@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.toolbar.*
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.vlc.*
 import org.videolan.vlc.extensions.ExtensionManagerService
 import org.videolan.vlc.extensions.ExtensionsManager
@@ -69,7 +69,7 @@ class MainActivity : ContentActivity(), ExtensionManagerService.ExtensionManager
             mainLoading.visibility = if (value) View.VISIBLE else View.GONE
             field = value
         }
-    private lateinit var mediaLibrary: AMedialibrary
+    private lateinit var mediaLibrary: AbstractMedialibrary
     private lateinit var extensionsManager: ExtensionsManager
     private lateinit var drawerLayout: HackyDrawerLayout
     private lateinit var navigationView: NavigationView
diff --git a/vlc-android/src/org/videolan/vlc/gui/PlaylistActivity.kt b/vlc-android/src/org/videolan/vlc/gui/PlaylistActivity.kt
index 32d1dd4252..21490d9a01 100644
--- a/vlc-android/src/org/videolan/vlc/gui/PlaylistActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/PlaylistActivity.kt
@@ -47,8 +47,8 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.google.android.material.bottomsheet.BottomSheetBehavior
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
-import org.videolan.medialibrary.interfaces.media.APlaylist
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.tools.isStarted
 import org.videolan.vlc.BuildConfig
@@ -206,7 +206,7 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler, IL
 
     override fun onMove(oldPosition: Int, newPosition: Int) {
         if (BuildConfig.DEBUG) Log.d(TAG, "Moving item from $oldPosition to $newPosition")
-        (viewModel.playlist as APlaylist).move(oldPosition, newPosition)
+        (viewModel.playlist as AbstractPlaylist).move(oldPosition, newPosition)
 
     }
 
@@ -265,7 +265,7 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler, IL
 
     override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
         val list = audioBrowserAdapter.multiSelectHelper.getSelection()
-        val tracks = ArrayList<AMediaWrapper>()
+        val tracks = ArrayList<AbstractMediaWrapper>()
         for (mediaItem in list)
             tracks.addAll(Arrays.asList(*mediaItem.tracks))
 
@@ -287,8 +287,8 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler, IL
             R.id.action_mode_audio_play -> MediaUtils.openList(this, tracks, 0)
             R.id.action_mode_audio_append -> MediaUtils.appendMedia(this, tracks)
             R.id.action_mode_audio_add_playlist -> UiTools.addToPlaylist(this, tracks)
-            R.id.action_mode_audio_info -> showInfoDialog(list[0] as AMediaWrapper)
-            R.id.action_mode_audio_set_song -> AudioUtil.setRingtone(list[0] as AMediaWrapper, this)
+            R.id.action_mode_audio_info -> showInfoDialog(list[0] as AbstractMediaWrapper)
+            R.id.action_mode_audio_set_song -> AudioUtil.setRingtone(list[0] as AbstractMediaWrapper, this)
             R.id.action_mode_audio_delete -> if (isPlaylist) removeFromPlaylist(tracks, indexes) else removeItems(tracks)
             else -> return false
         }
@@ -300,7 +300,7 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler, IL
         audioBrowserAdapter.multiSelectHelper.clearSelection()
     }
 
-    private fun showInfoDialog(media: AMediaWrapper) {
+    private fun showInfoDialog(media: AbstractMediaWrapper) {
         val i = Intent(this, InfoActivity::class.java)
         i.putExtra(TAG_ITEM, media)
         startActivity(i)
@@ -308,7 +308,7 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler, IL
 
     override fun onCtxAction(position: Int, option: Int) {
         if (position >= audioBrowserAdapter.itemCount) return
-        val media = audioBrowserAdapter.getItem(position) as AMediaWrapper? ?: return
+        val media = audioBrowserAdapter.getItem(position) as AbstractMediaWrapper? ?: return
         when (option) {
             CTX_INFORMATION -> showInfoDialog(media)
             CTX_DELETE -> removeItem(position, media)
@@ -320,17 +320,17 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler, IL
 
     }
 
-    private fun removeItem(position: Int, media: AMediaWrapper) {
+    private fun removeItem(position: Int, media: AbstractMediaWrapper) {
         val resId = if (isPlaylist) R.string.confirm_remove_from_playlist else R.string.confirm_delete
         if (isPlaylist) {
-            snackerConfirm(binding.root, getString(resId, media.title), Runnable { (viewModel.playlist as APlaylist).remove(position) })
+            snackerConfirm(binding.root, getString(resId, media.title), Runnable { (viewModel.playlist as AbstractPlaylist).remove(position) })
         } else {
             val deleteAction = Runnable { deleteMedia(media) }
             snackerConfirm(binding.root, getString(resId, media.title), Runnable { if (Util.checkWritePermission(this@PlaylistActivity, media, deleteAction)) deleteAction.run() })
         }
     }
 
-    private fun removeItems(items: List<AMediaWrapper>) {
+    private fun removeItems(items: List<AbstractMediaWrapper>) {
         snackerConfirm(binding.root,getString(R.string.confirm_delete_several_media, items.size)) {
             for (item in items) {
                 if (!isStarted()) break
@@ -357,9 +357,10 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler, IL
         MediaUtils.playTracks(this, viewModel.playlist, 0)
     }
 
-    private fun removeFromPlaylist(list: List<AMediaWrapper>, indexes: List<Int>) {
+    private fun removeFromPlaylist(list: List<AbstractMediaWrapper>, indexes: List<Int>) {
         val itemsRemoved = HashMap<Int, Long>()
-        val playlist = viewModel.playlist as? APlaylist ?: return
+        val playlist = viewModel.playlist as? AbstractPlaylist
+                ?: return
 
         for (mediaItem in list) {
             for (i in 0 until playlist.tracks.size) {
diff --git a/vlc-android/src/org/videolan/vlc/gui/PlaylistFragment.kt b/vlc-android/src/org/videolan/vlc/gui/PlaylistFragment.kt
index 2494b07c5b..566deaea5a 100644
--- a/vlc-android/src/org/videolan/vlc/gui/PlaylistFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/PlaylistFragment.kt
@@ -40,7 +40,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.launch
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.R
@@ -150,7 +150,7 @@ class PlaylistFragment : BaseAudioBrowser<PlaylistsViewModel>(), SwipeRefreshLay
     }
 
     override fun onCtxAction(position: Int, option: Int) {
-        if (option == CTX_PLAY_ALL) MediaUtils.playAll(requireContext(), viewModel.provider as MedialibraryProvider<AMediaWrapper>, position, false)
+        if (option == CTX_PLAY_ALL) MediaUtils.playAll(requireContext(), viewModel.provider as MedialibraryProvider<AbstractMediaWrapper>, position, false)
         else super.onCtxAction(position, option)
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/SearchActivity.kt b/vlc-android/src/org/videolan/vlc/gui/SearchActivity.kt
index 62b200260f..edec7cfd3b 100644
--- a/vlc-android/src/org/videolan/vlc/gui/SearchActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/SearchActivity.kt
@@ -22,7 +22,7 @@ import androidx.recyclerview.widget.RecyclerView
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.medialibrary.media.SearchAggregate
 import org.videolan.tools.isStarted
@@ -35,7 +35,7 @@ import org.videolan.vlc.media.MediaUtils
 
 open class SearchActivity : BaseActivity(), TextWatcher, TextView.OnEditorActionListener {
 
-    private lateinit var medialibrary: AMedialibrary
+    private lateinit var medialibrary: AbstractMedialibrary
     private lateinit var binding: SearchActivityBinding
     private val clickHandler = ClickHandler()
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.kt b/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.kt
index 1095135282..69b15899e7 100644
--- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.kt
@@ -37,8 +37,8 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton
 import com.google.android.material.tabs.TabLayout
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AAlbum
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.R
 import org.videolan.vlc.gui.ContentActivity
@@ -191,12 +191,12 @@ class AudioAlbumsSongsFragment : BaseAudioBrowser<AlbumSongsViewModel>(), SwipeR
             super.onClick(v, position, item)
             return
         }
-        if (item is AAlbum) {
+        if (item is AbstractAlbum) {
             val i = Intent(activity, PlaylistActivity::class.java)
             i.putExtra(AudioBrowserFragment.TAG_ITEM, item)
             startActivity(i)
         } else
-            MediaUtils.openMedia(v.context, item as AMediaWrapper)
+            MediaUtils.openMedia(v.context, item as AbstractMediaWrapper)
     }
 
     override fun onCtxAction(position: Int, option: Int) {
diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserFragment.kt b/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserFragment.kt
index fb7469e545..501701ea8f 100644
--- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserFragment.kt
@@ -42,7 +42,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton
 import com.google.android.material.tabs.TabLayout
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.R
@@ -336,7 +336,7 @@ class AudioBrowserFragment : BaseAudioBrowser<AudioBrowserViewModel>(), SwipeRef
 
     override fun onCtxAction(position: Int, option: Int) {
         @Suppress("UNCHECKED_CAST")
-        if (option == CTX_PLAY_ALL) MediaUtils.playAll(requireContext(), viewModel.providers[currentTab] as MedialibraryProvider<AMediaWrapper>, position, false)
+        if (option == CTX_PLAY_ALL) MediaUtils.playAll(requireContext(), viewModel.providers[currentTab] as MedialibraryProvider<AbstractMediaWrapper>, position, false)
         else super.onCtxAction(position, option)
     }
 
@@ -346,7 +346,7 @@ class AudioBrowserFragment : BaseAudioBrowser<AudioBrowserViewModel>(), SwipeRef
             return
         }
         if (item.itemType == MediaLibraryItem.TYPE_MEDIA) {
-            MediaUtils.openMedia(activity, item as AMediaWrapper)
+            MediaUtils.openMedia(activity, item as AbstractMediaWrapper)
             return
         }
         val i: Intent
diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt b/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt
index eb2cf86609..21ee87b018 100644
--- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt
@@ -56,7 +56,7 @@ import kotlinx.coroutines.*
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.channels.actor
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.tools.isStarted
 import org.videolan.vlc.PlaybackService
 import org.videolan.vlc.R
@@ -197,7 +197,7 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, CoroutineS
         }
     }
 
-    override fun onPopupMenu(view: View, position: Int, item: AMediaWrapper?) {
+    override fun onPopupMenu(view: View, position: Int, item: AbstractMediaWrapper?) {
         val activity = activity
         if (activity === null || position >= playlistAdapter.itemCount) return
         val flags = CTX_REMOVE_FROM_PLAYLIST or CTX_SET_RINGTONE or CTX_ADD_TO_PLAYLIST or CTX_STOP_AFTER_THIS
@@ -320,7 +320,7 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, CoroutineS
         }
     }
 
-    override fun playItem(position: Int, item: AMediaWrapper) {
+    override fun playItem(position: Int, item: AbstractMediaWrapper) {
         clearSearch()
         playlistModel.play(playlistModel.getPlaylistPosition(position, item))
     }
@@ -372,7 +372,7 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, CoroutineS
             if (PlaybackService.hasRenderer()) VideoPlayerActivity.startOpened(v.context,
                     it.uri, playlistModel.currentMediaPosition)
             else if (hasMedia()) {
-                it.removeFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
+                it.removeFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
                 playlistModel.switchToVideo()
             }
         }
@@ -473,7 +473,7 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, CoroutineS
 
     override fun afterTextChanged(editable: Editable) {}
 
-    private val playlistObserver = Observer<MutableList<AMediaWrapper>> {
+    private val playlistObserver = Observer<MutableList<AbstractMediaWrapper>> {
         playlistAdapter.update(it!!)
         updateActor.offer(Unit)
     }
diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/BaseAudioBrowser.kt b/vlc-android/src/org/videolan/vlc/gui/audio/BaseAudioBrowser.kt
index f42a6d8aba..703af156a0 100644
--- a/vlc-android/src/org/videolan/vlc/gui/audio/BaseAudioBrowser.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/audio/BaseAudioBrowser.kt
@@ -33,7 +33,7 @@ import androidx.recyclerview.widget.RecyclerView
 import androidx.viewpager.widget.ViewPager
 import com.google.android.material.tabs.TabLayout
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.tools.isStarted
 import org.videolan.vlc.R
@@ -184,7 +184,7 @@ abstract class BaseAudioBrowser<T : SortableModel> : MediaBrowserFragment<T>(),
                 R.id.action_mode_audio_append -> MediaUtils.appendMedia(activity, list.getTracks())
                 R.id.action_mode_audio_add_playlist -> UiTools.addToPlaylist(requireActivity(), list.getTracks())
                 R.id.action_mode_audio_info -> showInfoDialog(list[0])
-                R.id.action_mode_audio_set_song -> AudioUtil.setRingtone(list[0] as AMediaWrapper, requireActivity())
+                R.id.action_mode_audio_set_song -> AudioUtil.setRingtone(list[0] as AbstractMediaWrapper, requireActivity())
                 R.id.action_mode_audio_delete -> removeItems(list)
             }
         }
@@ -192,7 +192,7 @@ abstract class BaseAudioBrowser<T : SortableModel> : MediaBrowserFragment<T>(),
     }
 
     private suspend fun List<MediaLibraryItem>.getTracks() = withContext(Dispatchers.Default) {
-        ArrayList<AMediaWrapper>().apply {
+        ArrayList<AbstractMediaWrapper>().apply {
             for (mediaItem in this@getTracks) addAll(Arrays.asList(*mediaItem.tracks))
         }
     }
@@ -267,7 +267,7 @@ abstract class BaseAudioBrowser<T : SortableModel> : MediaBrowserFragment<T>(),
             CTX_APPEND -> MediaUtils.appendMedia(requireActivity(), media.tracks)
             CTX_PLAY_NEXT -> MediaUtils.insertNext(requireActivity(), media.tracks)
             CTX_ADD_TO_PLAYLIST -> UiTools.addToPlaylist(requireActivity(), media.tracks, SavePlaylistDialog.KEY_NEW_TRACKS)
-            CTX_SET_RINGTONE -> AudioUtil.setRingtone(media as AMediaWrapper, requireActivity())
+            CTX_SET_RINGTONE -> AudioUtil.setRingtone(media as AbstractMediaWrapper, requireActivity())
         }
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt
index 0ca1c66ef6..2f29491adb 100644
--- a/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt
@@ -38,7 +38,7 @@ import androidx.recyclerview.widget.RecyclerView
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.R
 import org.videolan.vlc.VLCApplication
 import org.videolan.vlc.databinding.PlaylistItemBinding
@@ -53,7 +53,7 @@ import java.util.*
 
 @ExperimentalCoroutinesApi
 @UseExperimental(ObsoleteCoroutinesApi::class)
-class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<AMediaWrapper, PlaylistAdapter.ViewHolder>(), SwipeDragHelperAdapter {
+class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<AbstractMediaWrapper, PlaylistAdapter.ViewHolder>(), SwipeDragHelperAdapter {
 
     private var mModel: PlaylistModel? = null
 
@@ -72,9 +72,9 @@ class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<AMediaWrapp
     private val mHandler = PlaylistHandler(this)
 
     interface IPlayer {
-        fun onPopupMenu(view: View, position: Int, item: AMediaWrapper?)
+        fun onPopupMenu(view: View, position: Int, item: AbstractMediaWrapper?)
         fun onSelectionSet(position: Int)
-        fun playItem(position: Int, item: AMediaWrapper)
+        fun playItem(position: Int, item: AbstractMediaWrapper)
     }
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
@@ -100,7 +100,7 @@ class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<AMediaWrapp
     }
 
     @MainThread
-    override fun getItem(position: Int): AMediaWrapper {
+    override fun getItem(position: Int): AbstractMediaWrapper {
         return dataset[position]
     }
 
@@ -159,7 +159,7 @@ class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<AMediaWrapp
                 }
         }
 
-        fun onClick(v: View, media: AMediaWrapper) {
+        fun onClick(v: View, media: AbstractMediaWrapper) {
             val position = layoutPosition //getMediaPosition(media);
             player.playItem(position, media)
         }
@@ -201,7 +201,7 @@ class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<AMediaWrapp
         }
     }
 
-    override fun createCB(): DiffUtilAdapter.DiffCallback<AMediaWrapper> {
+    override fun createCB(): DiffUtilAdapter.DiffCallback<AbstractMediaWrapper> {
         return MediaItemDiffCallback()
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserAdapter.kt
index a53c385fba..5916c520a3 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserAdapter.kt
@@ -35,7 +35,7 @@ import androidx.recyclerview.widget.RecyclerView
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.medialibrary.media.MediaLibraryItem.TYPE_MEDIA
 import org.videolan.medialibrary.media.MediaLibraryItem.TYPE_STORAGE
@@ -156,14 +156,14 @@ open class BaseBrowserAdapter() : DiffUtilAdapter<MediaLibraryItem, BaseBrowserA
     }
 
     private fun onBindMediaViewHolder(vh: MediaViewHolder, position: Int) {
-        val media = getItem(position) as AMediaWrapper
+        val media = getItem(position) as AbstractMediaWrapper
         val isFavorite = media.hasStateFlags(MediaLibraryItem.FLAG_FAVORITE)
         vh.binding.item = media
         val scheme = media.uri.scheme
         vh.binding.hasContextMenu = ((!networkRoot || isFavorite)
                 && "content" != scheme
                 && "otg" != scheme)
-        vh.binding.filename = if (media.type != AMediaWrapper.TYPE_DIR && "file" == scheme) media.fileName else null
+        vh.binding.filename = if (media.type != AbstractMediaWrapper.TYPE_DIR && "file" == scheme) media.fileName else null
         if (networkRoot) vh.binding.protocol = getProtocol(media)
         vh.binding.cover = getIcon(media, specialIcons)
         vh.selectView(multiSelectHelper.isSelected(position))
@@ -272,10 +272,10 @@ open class BaseBrowserAdapter() : DiffUtilAdapter<MediaLibraryItem, BaseBrowserA
     }
 
 
-    fun getIcon(media: AMediaWrapper, specialFolders: Boolean): BitmapDrawable {
+    fun getIcon(media: AbstractMediaWrapper, specialFolders: Boolean): BitmapDrawable {
         when (media.type) {
-            AMediaWrapper.TYPE_AUDIO -> return audioDrawable
-            AMediaWrapper.TYPE_DIR -> {
+            AbstractMediaWrapper.TYPE_AUDIO -> return audioDrawable
+            AbstractMediaWrapper.TYPE_DIR -> {
                 if (specialFolders) {
                     val uri = media.uri
                     if (AndroidDevices.MediaFolders.EXTERNAL_PUBLIC_MOVIES_DIRECTORY_URI == uri || AndroidDevices.MediaFolders.WHATSAPP_VIDEOS_FILE_URI == uri)
@@ -289,14 +289,14 @@ open class BaseBrowserAdapter() : DiffUtilAdapter<MediaLibraryItem, BaseBrowserA
                 }
                 return folderDrawable
             }
-            AMediaWrapper.TYPE_VIDEO -> return videoDrawable
-            AMediaWrapper.TYPE_SUBTITLE -> return subtitleDrawable
+            AbstractMediaWrapper.TYPE_VIDEO -> return videoDrawable
+            AbstractMediaWrapper.TYPE_SUBTITLE -> return subtitleDrawable
             else -> return unknownDrawable
         }
     }
 
-    private fun getProtocol(media: AMediaWrapper): String? {
-        return if (media.type != AMediaWrapper.TYPE_DIR) null else media.uri.scheme
+    private fun getProtocol(media: AbstractMediaWrapper): String? {
+        return if (media.type != AbstractMediaWrapper.TYPE_DIR) null else media.uri.scheme
     }
 
     open fun checkBoxAction(v: View, mrl: String) {}
@@ -305,7 +305,7 @@ open class BaseBrowserAdapter() : DiffUtilAdapter<MediaLibraryItem, BaseBrowserA
         val internalList = ArrayList(list)
         mediaCount = 0
         for (item in internalList) {
-            if (item.itemType == TYPE_MEDIA && ((item as AMediaWrapper).type == AMediaWrapper.TYPE_AUDIO || item.type == AMediaWrapper.TYPE_VIDEO))
+            if (item.itemType == TYPE_MEDIA && ((item as AbstractMediaWrapper).type == AbstractMediaWrapper.TYPE_AUDIO || item.type == AbstractMediaWrapper.TYPE_VIDEO))
                 ++mediaCount
         }
         return internalList
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt b/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt
index e93088748e..2a4d134d26 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt
@@ -38,7 +38,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.R
 import org.videolan.vlc.databinding.DirectoryBrowserBinding
@@ -74,7 +74,7 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
     protected val handler = BrowserFragmentHandler(this)
     private lateinit var layoutManager: LinearLayoutManager
     var mrl: String? = null
-    protected var currentMedia: AMediaWrapper? = null
+    protected var currentMedia: AbstractMediaWrapper? = null
     private var savedPosition = -1
     var isRootDirectory: Boolean = false
     protected var goBack = false
@@ -209,7 +209,7 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
         return !isRootDirectory
     }
 
-    fun browse(media: AMediaWrapper, save: Boolean) {
+    fun browse(media: AbstractMediaWrapper, save: Boolean) {
         val ctx = activity
         if (ctx == null || !isResumed || isRemoving) return
         val ft = ctx.supportFragmentManager.beginTransaction()
@@ -283,7 +283,7 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
     override fun removeItem(item: MediaLibraryItem): Boolean {
 
         val view = view ?: return false
-        val mw = item as? AMediaWrapper ?: return false
+        val mw = item as? AbstractMediaWrapper ?: return false
         val cancel = Runnable { viewModel.refresh() }
         val deleteAction = Runnable {
             launch {
@@ -291,23 +291,23 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
                 viewModel.remove(mw)
             }
         }
-        val resId = if (mw.type == AMediaWrapper.TYPE_DIR) R.string.confirm_delete_folder else R.string.confirm_delete
+        val resId = if (mw.type == AbstractMediaWrapper.TYPE_DIR) R.string.confirm_delete_folder else R.string.confirm_delete
         UiTools.snackerConfirm(view, getString(resId, mw.title), Runnable { if (Util.checkWritePermission(requireActivity(), mw, deleteAction)) deleteAction.run() })
         return true
     }
 
-    private fun showMediaInfo(mw: AMediaWrapper) {
+    private fun showMediaInfo(mw: AbstractMediaWrapper) {
         val i = Intent(activity, InfoActivity::class.java)
         i.putExtra(TAG_ITEM, mw)
         startActivity(i)
     }
 
-    private fun playAll(mw: AMediaWrapper?) {
+    private fun playAll(mw: AbstractMediaWrapper?) {
         var positionInPlaylist = 0
-        val mediaLocations = LinkedList<AMediaWrapper>()
+        val mediaLocations = LinkedList<AbstractMediaWrapper>()
         for (file in viewModel.dataset.value)
-            if (file is AMediaWrapper) {
-                if (file.type == AMediaWrapper.TYPE_VIDEO || file.type == AMediaWrapper.TYPE_AUDIO) {
+            if (file is AbstractMediaWrapper) {
+                if (file.type == AbstractMediaWrapper.TYPE_VIDEO || file.type == AbstractMediaWrapper.TYPE_AUDIO) {
                     mediaLocations.add(file)
                     if (mw != null && file.equals(mw))
                         positionInPlaylist = mediaLocations.size - 1
@@ -332,15 +332,15 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
         val fileBrowser = this is FileBrowserFragment
         val single = fileBrowser && count == 1
         val selection = if (single) adapter.multiSelectHelper.getSelection() else null
-        val type = if (!Util.isListEmpty(selection)) (selection!![0] as AMediaWrapper).type else -1
-        menu.findItem(R.id.action_mode_file_info).isVisible = single && (type == AMediaWrapper.TYPE_AUDIO || type == AMediaWrapper.TYPE_VIDEO)
+        val type = if (!Util.isListEmpty(selection)) (selection!![0] as AbstractMediaWrapper).type else -1
+        menu.findItem(R.id.action_mode_file_info).isVisible = single && (type == AbstractMediaWrapper.TYPE_AUDIO || type == AbstractMediaWrapper.TYPE_VIDEO)
         menu.findItem(R.id.action_mode_file_append).isVisible = PlaylistManager.hasMedia()
         menu.findItem(R.id.action_mode_file_delete).isVisible = fileBrowser
         return true
     }
 
     override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
-        val list = adapter.multiSelectHelper.getSelection() as? List<AMediaWrapper> ?: return false
+        val list = adapter.multiSelectHelper.getSelection() as? List<AbstractMediaWrapper> ?: return false
         if (list.isNotEmpty()) {
             when (item.itemId) {
                 R.id.action_mode_file_play -> MediaUtils.openList(activity, list, 0)
@@ -387,27 +387,27 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
     }
 
     override fun onClick(v: View, position: Int, item: MediaLibraryItem) {
-        val mediaWrapper = item as AMediaWrapper
+        val mediaWrapper = item as AbstractMediaWrapper
         if (actionMode != null) {
-            if (mediaWrapper.type == AMediaWrapper.TYPE_AUDIO ||
-                    mediaWrapper.type == AMediaWrapper.TYPE_VIDEO ||
-                    mediaWrapper.type == AMediaWrapper.TYPE_DIR) {
+            if (mediaWrapper.type == AbstractMediaWrapper.TYPE_AUDIO ||
+                    mediaWrapper.type == AbstractMediaWrapper.TYPE_VIDEO ||
+                    mediaWrapper.type == AbstractMediaWrapper.TYPE_DIR) {
                 adapter.multiSelectHelper.toggleSelection(position)
                 invalidateActionMode()
             }
         } else {
-            mediaWrapper.removeFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
-            if (mediaWrapper.type == AMediaWrapper.TYPE_DIR) browse(mediaWrapper, true)
+            mediaWrapper.removeFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
+            if (mediaWrapper.type == AbstractMediaWrapper.TYPE_DIR) browse(mediaWrapper, true)
             else MediaUtils.openMedia(v.context, mediaWrapper)
         }
     }
 
     override fun onLongClick(v: View, position: Int, item: MediaLibraryItem): Boolean {
         if (item.itemType != MediaLibraryItem.TYPE_MEDIA) return false
-        val mediaWrapper = item as AMediaWrapper
-        if (mediaWrapper.type == AMediaWrapper.TYPE_AUDIO ||
-                mediaWrapper.type == AMediaWrapper.TYPE_VIDEO ||
-                mediaWrapper.type == AMediaWrapper.TYPE_DIR) {
+        val mediaWrapper = item as AbstractMediaWrapper
+        if (mediaWrapper.type == AbstractMediaWrapper.TYPE_AUDIO ||
+                mediaWrapper.type == AbstractMediaWrapper.TYPE_VIDEO ||
+                mediaWrapper.type == AbstractMediaWrapper.TYPE_DIR) {
             adapter.multiSelectHelper.toggleSelection(position)
             if (actionMode == null) startActionMode()
         } else onCtxClick(v, position, item)
@@ -416,11 +416,11 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
 
     override fun onCtxClick(v: View, position: Int, item: MediaLibraryItem) {
         if (actionMode == null && item.itemType == MediaLibraryItem.TYPE_MEDIA) launch {
-            val mw = item as AMediaWrapper
+            val mw = item as AbstractMediaWrapper
             if (mw.uri.scheme == "content" || mw.uri.scheme == OTG_SCHEME) return@launch
             var flags = if (!isRootDirectory && this@BaseBrowserFragment is FileBrowserFragment) CTX_DELETE else 0
             if (!isRootDirectory && this is FileBrowserFragment) flags = flags or CTX_DELETE
-            if (mw.type == AMediaWrapper.TYPE_DIR) {
+            if (mw.type == AbstractMediaWrapper.TYPE_DIR) {
                 val isEmpty = viewModel.isFolderEmpty(mw)
                 if (!isEmpty) flags = flags or CTX_PLAY
                 val isFileBrowser = this@BaseBrowserFragment is FileBrowserFragment && item.uri.scheme == "file"
@@ -433,8 +433,8 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
                     } else flags or CTX_FAV_ADD
                 }
             } else {
-                val isVideo = mw.type == AMediaWrapper.TYPE_VIDEO
-                val isAudio = mw.type == AMediaWrapper.TYPE_AUDIO
+                val isVideo = mw.type == AbstractMediaWrapper.TYPE_VIDEO
+                val isAudio = mw.type == AbstractMediaWrapper.TYPE_AUDIO
                 val isMedia = isVideo || isAudio
                 if (isMedia) flags = flags or CTX_PLAY_ALL or CTX_APPEND or CTX_INFORMATION or CTX_ADD_TO_PLAYLIST
                 if (!isAudio) flags = flags or CTX_PLAY_AS_AUDIO
@@ -445,18 +445,19 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
     }
 
     override fun onCtxAction(position: Int, option: Int) {
-        val mw = adapter.getItem(position) as? AMediaWrapper ?: return
+        val mw = adapter.getItem(position) as? AbstractMediaWrapper
+                ?: return
         when (option) {
             CTX_PLAY -> MediaUtils.openMedia(activity, mw)
             CTX_PLAY_ALL -> {
-                mw.removeFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
+                mw.removeFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
                 playAll(mw)
             }
             CTX_APPEND -> MediaUtils.appendMedia(activity, mw)
             CTX_DELETE -> removeItem(mw)
             CTX_INFORMATION -> showMediaInfo(mw)
             CTX_PLAY_AS_AUDIO -> {
-                mw.addFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
+                mw.addFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
                 MediaUtils.openMedia(activity, mw)
             }
             CTX_ADD_TO_PLAYLIST -> UiTools.addToPlaylist(requireActivity(), mw.tracks, SavePlaylistDialog.KEY_NEW_TRACKS)
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/ExtensionAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/browser/ExtensionAdapter.kt
index 9c0b9b475e..92b0c1e948 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/ExtensionAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/ExtensionAdapter.kt
@@ -10,7 +10,7 @@ import androidx.recyclerview.widget.RecyclerView
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.R
 import org.videolan.vlc.databinding.ExtensionItemViewBinding
 import org.videolan.vlc.extensions.api.VLCExtensionItem
@@ -36,7 +36,7 @@ class ExtensionAdapter(internal var fragment: ExtensionBrowser?) : RecyclerView.
             if (item.type == VLCExtensionItem.TYPE_DIRECTORY) {
                 fragment!!.browseItem(item)
             } else if (item.type == VLCExtensionItem.TYPE_AUDIO || item.type == VLCExtensionItem.TYPE_VIDEO) {
-                val mw = MLServiceLocator.getAMediaWrapper(Uri.parse(item.link))
+                val mw = MLServiceLocator.getAbstractMediaWrapper(Uri.parse(item.link))
                 mw.setDisplayTitle(item.getTitle())
                 mw.description = item.getSubTitle()
                 mw.type = getTypeAccordingToItem(item.type)
@@ -100,12 +100,12 @@ class ExtensionAdapter(internal var fragment: ExtensionBrowser?) : RecyclerView.
 
     private fun getTypeAccordingToItem(type: Int): Int {
         return when (type) {
-            VLCExtensionItem.TYPE_DIRECTORY -> AMediaWrapper.TYPE_DIR
-            VLCExtensionItem.TYPE_VIDEO -> AMediaWrapper.TYPE_VIDEO
-            VLCExtensionItem.TYPE_AUDIO -> AMediaWrapper.TYPE_AUDIO
-            VLCExtensionItem.TYPE_PLAYLIST -> AMediaWrapper.TYPE_PLAYLIST
-            VLCExtensionItem.TYPE_SUBTITLE -> AMediaWrapper.TYPE_SUBTITLE
-            else -> AMediaWrapper.TYPE_ALL
+            VLCExtensionItem.TYPE_DIRECTORY -> AbstractMediaWrapper.TYPE_DIR
+            VLCExtensionItem.TYPE_VIDEO -> AbstractMediaWrapper.TYPE_VIDEO
+            VLCExtensionItem.TYPE_AUDIO -> AbstractMediaWrapper.TYPE_AUDIO
+            VLCExtensionItem.TYPE_PLAYLIST -> AbstractMediaWrapper.TYPE_PLAYLIST
+            VLCExtensionItem.TYPE_SUBTITLE -> AbstractMediaWrapper.TYPE_SUBTITLE
+            else -> AbstractMediaWrapper.TYPE_ALL
         }
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/ExtensionBrowser.kt b/vlc-android/src/org/videolan/vlc/gui/browser/ExtensionBrowser.kt
index 891823c569..2250cc0a47 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/ExtensionBrowser.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/ExtensionBrowser.kt
@@ -14,7 +14,7 @@ import androidx.recyclerview.widget.RecyclerView
 import com.google.android.material.floatingactionbutton.FloatingActionButton
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.R
 import org.videolan.vlc.extensions.ExtensionManagerService
 import org.videolan.vlc.extensions.Utils
@@ -154,14 +154,14 @@ class ExtensionBrowser : Fragment(), View.OnClickListener, androidx.swiperefresh
         when (option) {
             CTX_PLAY_ALL -> {
                 val items = mAdapter.all
-                val medias = ArrayList<AMediaWrapper>(items.size)
+                val medias = ArrayList<AbstractMediaWrapper>(items.size)
                 for (vlcItem in items) medias.add(Utils.mediawrapperFromExtension(vlcItem))
                 MediaUtils.openList(activity, medias, position)
             }
             CTX_APPEND -> MediaUtils.appendMedia(activity, Utils.mediawrapperFromExtension(mAdapter.getItem(position)))
             CTX_PLAY_AS_AUDIO -> {
                 val mw = Utils.mediawrapperFromExtension(mAdapter.getItem(position))
-                mw.addFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
+                mw.addFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
                 MediaUtils.openMedia(activity, mw)
             }
             CTX_ITEM_DL -> {
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt b/vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt
index 16b12a4efa..18d6e680df 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt
@@ -36,7 +36,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.launch
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.ExternalMonitor
 import org.videolan.vlc.R
@@ -108,7 +108,7 @@ open class FileBrowserFragment : BaseBrowserFragment() {
 
     override fun onClick(v: View, position: Int, item: MediaLibraryItem) {
         if (item.itemType == MediaLibraryItem.TYPE_MEDIA) {
-            val mw = item as AMediaWrapper
+            val mw = item as AbstractMediaWrapper
             if ("otg://" == mw.location) {
                 val title = getString(R.string.otg_device_title)
                 val otgRoot = OtgAccess.otgRoot
@@ -131,7 +131,7 @@ open class FileBrowserFragment : BaseBrowserFragment() {
     }
 
     override fun onCtxAction(position: Int, option: Int) {
-        val mw = this.adapter.getItem(position) as AMediaWrapper?
+        val mw = this.adapter.getItem(position) as AbstractMediaWrapper?
         when (option) {
             CTX_FAV_ADD -> browserFavRepository.addLocalFavItem(mw!!.uri, mw.title, mw.artworkURL)
             else -> super.onCtxAction(position, option)
@@ -164,8 +164,8 @@ open class FileBrowserFragment : BaseBrowserFragment() {
 
 
     private fun browseOtgDevice(uri: Uri, title: String) {
-        val mw = MLServiceLocator.getAMediaWrapper(uri)
-        mw.type = AMediaWrapper.TYPE_DIR
+        val mw = MLServiceLocator.getAbstractMediaWrapper(uri)
+        mw.type = AbstractMediaWrapper.TYPE_DIR
         mw.title = title
         handler.post { browse(mw, true) }
     }
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/FilePickerAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/browser/FilePickerAdapter.kt
index 7d1fc77cfe..a064a8160e 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/FilePickerAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/FilePickerAdapter.kt
@@ -26,7 +26,7 @@ package org.videolan.vlc.gui.browser
 import androidx.databinding.ViewDataBinding
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 
 @ObsoleteCoroutinesApi
 @ExperimentalCoroutinesApi
@@ -34,7 +34,7 @@ class FilePickerAdapter internal constructor(fragment: BaseBrowserFragment) : Ba
 
     override fun onBindViewHolder(holder: ViewHolder<ViewDataBinding>, position: Int) {
         val h = holder as MediaViewHolder
-        val media = getItem(position) as AMediaWrapper
+        val media = getItem(position) as AbstractMediaWrapper
         h.binding.item = media
         h.binding.hasContextMenu = false
         h.binding.protocol = null
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/FilePickerFragment.kt b/vlc-android/src/org/videolan/vlc/gui/browser/FilePickerFragment.kt
index 4c8de4f4fa..ca40217290 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/FilePickerFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/FilePickerFragment.kt
@@ -34,7 +34,7 @@ import androidx.lifecycle.ViewModelProviders
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.R
 import org.videolan.vlc.repository.DirectoryRepository
@@ -80,15 +80,15 @@ class FilePickerFragment : FileBrowserFragment() {
     }
 
     override fun onClick(v: View, position: Int, item: MediaLibraryItem) {
-        val media = item as AMediaWrapper
-        if (media.type == AMediaWrapper.TYPE_DIR)
+        val media = item as AbstractMediaWrapper
+        if (media.type == AbstractMediaWrapper.TYPE_DIR)
             browse(media, true)
         else
             pickFile(media)
 
     }
 
-    private fun pickFile(mw: AMediaWrapper) {
+    private fun pickFile(mw: AbstractMediaWrapper) {
         val i = Intent(Intent.ACTION_PICK)
         i.putExtra(EXTRA_MRL, mw.location)
         requireActivity().setResult(Activity.RESULT_OK, i)
@@ -104,7 +104,7 @@ class FilePickerFragment : FileBrowserFragment() {
                 viewModel.refresh()
             }
             mrl != null -> {
-                val mw = MLServiceLocator.getAMediaWrapper(Uri.parse(FileUtils.getParent(mrl)))
+                val mw = MLServiceLocator.getAbstractMediaWrapper(Uri.parse(FileUtils.getParent(mrl)))
                 browse(mw, false)
             }
         }
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/MediaBrowserFragment.kt b/vlc-android/src/org/videolan/vlc/gui/browser/MediaBrowserFragment.kt
index c171c5e33c..c8c12e7b84 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/MediaBrowserFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/MediaBrowserFragment.kt
@@ -38,9 +38,9 @@ import androidx.recyclerview.widget.RecyclerView
 import androidx.transition.TransitionManager
 import com.google.android.material.floatingactionbutton.FloatingActionButton
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
-import org.videolan.medialibrary.interfaces.media.APlaylist
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.tools.isStarted
 import org.videolan.vlc.R
@@ -71,7 +71,7 @@ abstract class MediaBrowserFragment<T : SortableModel> : Fragment(), ActionMode.
 
     private lateinit var searchButtonView: View
     var swipeRefreshLayout: SwipeRefreshLayout? = null
-    lateinit var mediaLibrary: AMedialibrary
+    lateinit var mediaLibrary: AbstractMedialibrary
     var actionMode: ActionMode? = null
     var fabPlay: FloatingActionButton? = null
     open lateinit var viewModel: T
@@ -162,8 +162,8 @@ abstract class MediaBrowserFragment<T : SortableModel> : Fragment(), ActionMode.
             for (item in items) {
                 if (!isStarted()) break
                 when(item) {
-                    is AMediaWrapper -> if (getWritePermission(item.uri)) deleteMedia(item)
-                    is APlaylist -> withContext(Dispatchers.IO) { item.delete() }
+                    is AbstractMediaWrapper -> if (getWritePermission(item.uri)) deleteMedia(item)
+                    is AbstractPlaylist -> withContext(Dispatchers.IO) { item.delete() }
                 }
             }
             if (isStarted()) viewModel.refresh()
@@ -173,12 +173,12 @@ abstract class MediaBrowserFragment<T : SortableModel> : Fragment(), ActionMode.
     protected open fun removeItem(item: MediaLibraryItem): Boolean {
         view ?: return false
         when {
-            item.itemType == MediaLibraryItem.TYPE_PLAYLIST -> UiTools.snackerConfirm(view!!, getString(R.string.confirm_delete_playlist, item.title), Runnable { MediaUtils.deletePlaylist(item as APlaylist) })
+            item.itemType == MediaLibraryItem.TYPE_PLAYLIST -> UiTools.snackerConfirm(view!!, getString(R.string.confirm_delete_playlist, item.title), Runnable { MediaUtils.deletePlaylist(item as AbstractPlaylist) })
             item.itemType == MediaLibraryItem.TYPE_MEDIA -> {
                 val deleteAction = Runnable {
                     if (isStarted()) launch { deleteMedia(item, false, null) }
                 }
-                val resid = if ((item as AMediaWrapper).type == AMediaWrapper.TYPE_DIR) R.string.confirm_delete_folder else R.string.confirm_delete
+                val resid = if ((item as AbstractMediaWrapper).type == AbstractMediaWrapper.TYPE_DIR) R.string.confirm_delete_folder else R.string.confirm_delete
                 UiTools.snackerConfirm(view!!, getString(resid, item.getTitle()), Runnable { if (Util.checkWritePermission(requireActivity(), item, deleteAction)) deleteAction.run() })
             }
             else -> return false
@@ -210,7 +210,7 @@ abstract class MediaBrowserFragment<T : SortableModel> : Fragment(), ActionMode.
         }
     }
 
-    private fun onDeleteFailed(media: AMediaWrapper) {
+    private fun onDeleteFailed(media: AbstractMediaWrapper) {
         if (isAdded) view?.let { UiTools.snacker(it, getString(R.string.msg_delete_failed, media.title)) }
     }
 
@@ -244,35 +244,35 @@ abstract class MediaBrowserFragment<T : SortableModel> : Fragment(), ActionMode.
     override fun onOptionsItemSelected(item: MenuItem): Boolean {
         when (item.itemId) {
             R.id.ml_menu_sortby_name -> {
-                sortBy(AMedialibrary.SORT_ALPHA)
+                sortBy(AbstractMedialibrary.SORT_ALPHA)
                 return true
             }
             R.id.ml_menu_sortby_filename -> {
-                sortBy(AMedialibrary.SORT_FILENAME)
+                sortBy(AbstractMedialibrary.SORT_FILENAME)
                 return true
             }
             R.id.ml_menu_sortby_length -> {
-                sortBy(AMedialibrary.SORT_DURATION)
+                sortBy(AbstractMedialibrary.SORT_DURATION)
                 return true
             }
             R.id.ml_menu_sortby_date -> {
-                sortBy(AMedialibrary.SORT_RELEASEDATE)
+                sortBy(AbstractMedialibrary.SORT_RELEASEDATE)
                 return true
             }
             R.id.ml_menu_sortby_last_modified -> {
-                sortBy(AMedialibrary.SORT_LASTMODIFICATIONDATE)
+                sortBy(AbstractMedialibrary.SORT_LASTMODIFICATIONDATE)
                 return true
             }
             R.id.ml_menu_sortby_artist_name -> {
-                sortBy(AMedialibrary.SORT_ARTIST)
+                sortBy(AbstractMedialibrary.SORT_ARTIST)
                 return true
             }
             R.id.ml_menu_sortby_album_name -> {
-                sortBy(AMedialibrary.SORT_ALBUM)
+                sortBy(AbstractMedialibrary.SORT_ALBUM)
                 return true
             }
             R.id.ml_menu_sortby_number -> {
-                sortBy(AMedialibrary.SORT_FILESIZE) //TODO
+                sortBy(AbstractMedialibrary.SORT_FILESIZE) //TODO
                 return super.onOptionsItemSelected(item)
             }
             else -> return super.onOptionsItemSelected(item)
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/NetworkBrowserFragment.kt b/vlc-android/src/org/videolan/vlc/gui/browser/NetworkBrowserFragment.kt
index e9ea8a1233..9af0d326b9 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/NetworkBrowserFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/NetworkBrowserFragment.kt
@@ -40,7 +40,7 @@ import androidx.recyclerview.widget.RecyclerView
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.launch
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.ExternalMonitor
 import org.videolan.vlc.R
 import org.videolan.vlc.VLCApplication
@@ -131,7 +131,7 @@ class NetworkBrowserFragment : BaseBrowserFragment() {
     }
 
     override fun onCtxAction(position: Int, option: Int) {
-        val mw = this.adapter.getItem(position) as AMediaWrapper
+        val mw = this.adapter.getItem(position) as AbstractMediaWrapper
         when (option) {
             CTX_FAV_ADD -> browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL)
             CTX_FAV_EDIT -> showAddServerDialog(mw)
@@ -182,7 +182,7 @@ class NetworkBrowserFragment : BaseBrowserFragment() {
         else if (v.id == R.id.fab) showAddServerDialog(null)
     }
 
-    private fun showAddServerDialog(mw: AMediaWrapper?) {
+    private fun showAddServerDialog(mw: AbstractMediaWrapper?) {
         val fm = fragmentManager ?: return
         val dialog = NetworkServerDialog()
         if (mw != null) dialog.setServer(mw)
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/PathAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/browser/PathAdapter.kt
index 8e8994617d..eced753530 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/PathAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/PathAdapter.kt
@@ -7,14 +7,14 @@ import android.view.ViewGroup
 import android.widget.TextView
 import androidx.collection.SimpleArrayMap
 import androidx.recyclerview.widget.RecyclerView
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.R
 import org.videolan.vlc.util.AndroidDevices
 
 private val storages = SimpleArrayMap<String, String>()
 
-class PathAdapter(val browser: PathAdapterListener, media: AMediaWrapper) : RecyclerView.Adapter<PathAdapter.ViewHolder>() {
+class PathAdapter(val browser: PathAdapterListener, media: AbstractMediaWrapper) : RecyclerView.Adapter<PathAdapter.ViewHolder>() {
 
     init {
         if (media.hasStateFlags(MediaLibraryItem.FLAG_STORAGE)) storages.put(Uri.decode(media.uri.path), media.title)
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserAdapter.kt
index 3fbe725979..32cd7aa711 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserAdapter.kt
@@ -31,7 +31,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.launch
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.medialibrary.media.Storage
 import org.videolan.vlc.MediaParsingService
@@ -57,7 +57,7 @@ internal class StorageBrowserAdapter(fragment: StorageBrowserFragment) : BaseBro
             val vh = holder as BaseBrowserAdapter.MediaViewHolder
             var storage = getItem(position)
 
-            if (storage.itemType == MediaLibraryItem.TYPE_MEDIA) storage = Storage((storage as AMediaWrapper).uri)
+            if (storage.itemType == MediaLibraryItem.TYPE_MEDIA) storage = Storage((storage as AbstractMediaWrapper).uri)
             var storagePath = (storage as Storage).uri.path ?: ""
             if (!storagePath.endsWith("/")) storagePath += "/"
             vh.binding.item = storage
diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserFragment.kt b/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserFragment.kt
index 063810dbc5..aa5ef57af3 100644
--- a/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserFragment.kt
@@ -45,7 +45,7 @@ import kotlinx.coroutines.launch
 import org.videolan.libvlc.util.AndroidUtil
 import org.videolan.medialibrary.MLServiceLocator
 import org.videolan.medialibrary.interfaces.EntryPointsEventsCb
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.medialibrary.media.Storage
 import org.videolan.vlc.MediaParsingService
@@ -135,7 +135,7 @@ class StorageBrowserFragment : FileBrowserFragment(), EntryPointsEventsCb {
         return super.onOptionsItemSelected(item)
     }
 
-    fun browse(media: AMediaWrapper, position: Int, scanned: Boolean) {
+    fun browse(media: AbstractMediaWrapper, position: Int, scanned: Boolean) {
         val ft = activity?.supportFragmentManager?.beginTransaction()
         val next = createFragment()
         val args = Bundle()
@@ -166,8 +166,8 @@ class StorageBrowserFragment : FileBrowserFragment(), EntryPointsEventsCb {
     }
 
     override fun onClick(v: View, position: Int, item: MediaLibraryItem) {
-        val mw = (item as? Storage)?.let { MLServiceLocator.getAMediaWrapper(it.uri) } ?: return
-        mw.type = AMediaWrapper.TYPE_DIR
+        val mw = (item as? Storage)?.let { MLServiceLocator.getAbstractMediaWrapper(it.uri) } ?: return
+        mw.type = AbstractMediaWrapper.TYPE_DIR
         browse(mw, position, (DataBindingUtil.findBinding<BrowserItemBinding>(v))?.browserCheckbox?.state == ThreeStatesCheckbox.STATE_CHECKED)
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt b/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt
index 9e06a44241..68d9aad254 100644
--- a/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt
@@ -16,7 +16,7 @@ import android.widget.*
 import androidx.appcompat.app.AppCompatDialog
 import androidx.fragment.app.DialogFragment
 import com.google.android.material.textfield.TextInputLayout
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.R
 import org.videolan.vlc.gui.DialogActivity
 import org.videolan.vlc.gui.MainActivity
@@ -246,7 +246,7 @@ class NetworkServerDialog : DialogFragment(), AdapterView.OnItemSelectedListener
         }
     }
 
-    fun setServer(mw: AMediaWrapper) {
+    fun setServer(mw: AbstractMediaWrapper) {
         networkUri = mw.uri
         networkName = mw.title
     }
diff --git a/vlc-android/src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt b/vlc-android/src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt
index 49cec6904e..5588ac9b7a 100644
--- a/vlc-android/src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt
@@ -36,10 +36,10 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
 import com.google.android.material.textfield.TextInputLayout
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
-import org.videolan.medialibrary.interfaces.media.APlaylist
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.R
 import org.videolan.vlc.VLCApplication
@@ -57,9 +57,9 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
     private lateinit var mEmptyView: TextView
     private lateinit var mSaveButton: Button
     private lateinit var adapter: SimpleAdapter
-    private lateinit var mTracks: Array<AMediaWrapper>
-    private lateinit var mNewTrack: Array<AMediaWrapper>
-    private lateinit var mMedialibrary: AMedialibrary
+    private lateinit var mTracks: Array<AbstractMediaWrapper>
+    private lateinit var mNewTrack: Array<AbstractMediaWrapper>
+    private lateinit var mMedialibrary: AbstractMedialibrary
     private var mPlaylistId: Long = 0
 
     override fun initialFocusedView(): View = mListView
@@ -70,13 +70,13 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
         adapter = SimpleAdapter(this)
         mTracks = try {
             @Suppress("UNCHECKED_CAST")
-            arguments!!.getParcelableArray(KEY_TRACKS) as Array<AMediaWrapper>
+            arguments!!.getParcelableArray(KEY_TRACKS) as Array<AbstractMediaWrapper>
         } catch (e: Exception) {
             emptyArray()
         }
         mNewTrack = try {
             @Suppress("UNCHECKED_CAST")
-            arguments!!.getParcelableArray(KEY_NEW_TRACKS) as Array<AMediaWrapper>
+            arguments!!.getParcelableArray(KEY_NEW_TRACKS) as Array<AbstractMediaWrapper>
         } catch (e: Exception) {
             emptyArray()
         }
@@ -123,9 +123,9 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
         runIO(Runnable {
             val name = mEditText!!.text.toString().trim { it <= ' ' }
             val addTracks = !Tools.isArrayEmpty(mNewTrack)
-            var playlist: APlaylist? = mMedialibrary.getPlaylist(mPlaylistId)
+            var playlist: AbstractPlaylist? = mMedialibrary.getPlaylist(mPlaylistId)
             val exists = playlist != null
-            val tracks: Array<AMediaWrapper>?
+            val tracks: Array<AbstractMediaWrapper>?
             if (!exists) playlist = mMedialibrary.createPlaylist(name)
             if (playlist == null) return@Runnable
             tracks = if (addTracks) {
diff --git a/vlc-android/src/org/videolan/vlc/gui/folders/FoldersAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/folders/FoldersAdapter.kt
index 3e6754acd1..fe17cb1af2 100644
--- a/vlc-android/src/org/videolan/vlc/gui/folders/FoldersAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/folders/FoldersAdapter.kt
@@ -13,14 +13,14 @@ import kotlinx.coroutines.channels.SendChannel
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.media.AFolder
+import org.videolan.medialibrary.interfaces.media.AbstractFolder
 import org.videolan.tools.MultiSelectAdapter
 import org.videolan.tools.MultiSelectHelper
 import org.videolan.vlc.databinding.FolderItemBinding
 import org.videolan.vlc.gui.helpers.SelectorViewHolder
 import org.videolan.vlc.util.UPDATE_SELECTION
 
-class FoldersAdapter(val actor: SendChannel<FolderAction>) : PagedListAdapter<AFolder, FoldersAdapter.ViewHolder>(DIFF_CALLBACK), MultiSelectAdapter<AFolder>, CoroutineScope {
+class FoldersAdapter(val actor: SendChannel<FolderAction>) : PagedListAdapter<AbstractFolder, FoldersAdapter.ViewHolder>(DIFF_CALLBACK), MultiSelectAdapter<AbstractFolder>, CoroutineScope {
     override val coroutineContext = Dispatchers.Main.immediate
     private lateinit var inflater: LayoutInflater
 
@@ -36,7 +36,7 @@ class FoldersAdapter(val actor: SendChannel<FolderAction>) : PagedListAdapter<AF
         val folder = getItem(position)
         holder.binding.folder = folder
         launch {
-            val count = withContext(Dispatchers.IO) { folder?.mediaCount(AFolder.TYPE_FOLDER_VIDEO) ?: 0 }
+            val count = withContext(Dispatchers.IO) { folder?.mediaCount(AbstractFolder.TYPE_FOLDER_VIDEO) ?: 0 }
             holder.binding.folderDesc.visibility = if (count == 0) View.GONE else View.VISIBLE
             if (count > 0) holder.binding.folderDesc.text = "$count videos"
         }
@@ -54,7 +54,7 @@ class FoldersAdapter(val actor: SendChannel<FolderAction>) : PagedListAdapter<AF
         }
     }
 
-    override fun getItem(position: Int): AFolder? = super.getItem(position)
+    override fun getItem(position: Int): AbstractFolder? = super.getItem(position)
 
     @TargetApi(Build.VERSION_CODES.M)
     inner class ViewHolder(binding: FolderItemBinding) : SelectorViewHolder<FolderItemBinding>(binding) {
@@ -81,10 +81,10 @@ class FoldersAdapter(val actor: SendChannel<FolderAction>) : PagedListAdapter<AF
 }
 
 private const val UPDATE_PAYLOAD = 1
-private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<AFolder>() {
-    override fun areItemsTheSame( oldItem: AFolder, newItem: AFolder) = oldItem == newItem
+private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<AbstractFolder>() {
+    override fun areItemsTheSame(oldItem: AbstractFolder, newItem: AbstractFolder) = oldItem == newItem
 
-    override fun areContentsTheSame(oldItem: AFolder, newItem: AFolder) = true
+    override fun areContentsTheSame(oldItem: AbstractFolder, newItem: AbstractFolder) = true
 
-    override fun getChangePayload(oldItem: AFolder, newItem: AFolder) = UPDATE_PAYLOAD
+    override fun getChangePayload(oldItem: AbstractFolder, newItem: AbstractFolder) = UPDATE_PAYLOAD
 }
\ No newline at end of file
diff --git a/vlc-android/src/org/videolan/vlc/gui/folders/FoldersFragment.kt b/vlc-android/src/org/videolan/vlc/gui/folders/FoldersFragment.kt
index 57e2b893a0..8b73d0d0d2 100644
--- a/vlc-android/src/org/videolan/vlc/gui/folders/FoldersFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/folders/FoldersFragment.kt
@@ -10,7 +10,7 @@ import androidx.recyclerview.widget.RecyclerView
 import kotlinx.android.synthetic.main.folders_fragment.*
 import kotlinx.coroutines.*
 import kotlinx.coroutines.channels.actor
-import org.videolan.medialibrary.interfaces.media.AFolder
+import org.videolan.medialibrary.interfaces.media.AbstractFolder
 import org.videolan.vlc.R
 import org.videolan.vlc.gui.SecondaryActivity
 import org.videolan.vlc.gui.browser.MediaBrowserFragment
@@ -149,6 +149,6 @@ class FoldersFragment : MediaBrowserFragment<FoldersViewModel>(), CtxActionRecei
 }
 
 sealed class FolderAction
-class FolderClick(val position: Int, val folder: AFolder) : FolderAction()
-class FolderLongClick(val position: Int, val folder: AFolder) : FolderAction()
-class FolderCtxClick(val position: Int, val folder: AFolder) : FolderAction()
\ No newline at end of file
+class FolderClick(val position: Int, val folder: AbstractFolder) : FolderAction()
+class FolderLongClick(val position: Int, val folder: AbstractFolder) : FolderAction()
+class FolderCtxClick(val position: Int, val folder: AbstractFolder) : FolderAction()
\ No newline at end of file
diff --git a/vlc-android/src/org/videolan/vlc/gui/helpers/AudioUtil.kt b/vlc-android/src/org/videolan/vlc/gui/helpers/AudioUtil.kt
index ed9a14e679..366afbb3b7 100644
--- a/vlc-android/src/org/videolan/vlc/gui/helpers/AudioUtil.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/helpers/AudioUtil.kt
@@ -36,7 +36,7 @@ import androidx.fragment.app.FragmentActivity
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.R
 import org.videolan.vlc.VLCApplication
@@ -71,7 +71,7 @@ object AudioUtil {
     //     */
     //    public static AtomicReference<String> PLAYLIST_DIR = new AtomicReference<>();
 
-    fun setRingtone(song: AMediaWrapper, context: FragmentActivity) {
+    fun setRingtone(song: AbstractMediaWrapper, context: FragmentActivity) {
         if (AndroidUtil.isOOrLater && !Permissions.canWriteStorage(context)) {
             Permissions.askWriteStoragePermission(context, false, Runnable { setRingtone(song, context) })
             return
@@ -173,7 +173,7 @@ object AudioUtil {
             dir.delete()
     }
 
-    private fun getCoverFromMediaStore(context: Context, media: AMediaWrapper): String? {
+    private fun getCoverFromMediaStore(context: Context, media: AbstractMediaWrapper): String? {
         val album = media.album ?: return null
         val contentResolver = context.contentResolver
         val uri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI
@@ -195,7 +195,7 @@ object AudioUtil {
     }
 
     @Throws(NoSuchAlgorithmException::class, UnsupportedEncodingException::class)
-    private fun getCoverFromVlc(context: Context, media: AMediaWrapper): String? {
+    private fun getCoverFromVlc(context: Context, media: AbstractMediaWrapper): String? {
         var artworkURL: String? = media.artworkURL
         if (artworkURL != null && artworkURL.startsWith("file://")) {
             return Uri.decode(artworkURL).replace("file://", "")
@@ -229,7 +229,7 @@ object AudioUtil {
         return null
     }
 
-    private fun getCoverFromFolder(media: AMediaWrapper): String? {
+    private fun getCoverFromFolder(media: AbstractMediaWrapper): String? {
         val f = AndroidUtil.UriToFile(media.uri) ?: return null
 
         val folder = f.parentFile ?: return null
@@ -264,12 +264,12 @@ object AudioUtil {
         return null
     }
 
-    private fun getCoverCachePath(context: Context, media: AMediaWrapper, width: Int): String {
+    private fun getCoverCachePath(context: Context, media: AbstractMediaWrapper, width: Int): String {
         val hash = MurmurHash.hash32(MediaUtils.getMediaArtist(context, media) + MediaUtils.getMediaAlbum(context, media))
         return COVER_DIR.get() + (if (hash >= 0) "" + hash else "m" + -hash) + "_" + width
     }
 
-    private fun getCoverFromMemCache(context: Context, media: AMediaWrapper?, width: Int): Bitmap? {
+    private fun getCoverFromMemCache(context: Context, media: AbstractMediaWrapper?, width: Int): Bitmap? {
         var cover: Bitmap? = null
         if (media != null && media.artist != null && media.album != null) {
             cover = BitmapCache.getBitmapFromMemCache(getCoverCachePath(context, media, width))
@@ -282,7 +282,7 @@ object AudioUtil {
 
     @SuppressLint("NewApi")
     @Synchronized
-    fun getCover(context: Context, media: AMediaWrapper, width: Int): Bitmap? {
+    fun getCover(context: Context, media: AbstractMediaWrapper, width: Int): Bitmap? {
         var coverPath: String? = null
         var cover: Bitmap? = null
         var cachePath: String? = null
@@ -387,7 +387,7 @@ object AudioUtil {
     }
 
     @JvmOverloads
-    fun getCover(context: Context, list: List<AMediaWrapper>, width: Int, fromMemCache: Boolean = false): Bitmap? {
+    fun getCover(context: Context, list: List<AbstractMediaWrapper>, width: Int, fromMemCache: Boolean = false): Bitmap? {
         var cover: Bitmap? = null
         val testedAlbums = LinkedList<String>()
         for (media in list) {
@@ -406,7 +406,7 @@ object AudioUtil {
         return cover
     }
 
-    fun getCoverFromMemCache(context: Context, list: List<AMediaWrapper>, width: Int): Bitmap? {
+    fun getCoverFromMemCache(context: Context, list: List<AbstractMediaWrapper>, width: Int): Bitmap? {
         return getCover(context, list, width, true)
     }
 }
diff --git a/vlc-android/src/org/videolan/vlc/gui/helpers/BitmapUtil.kt b/vlc-android/src/org/videolan/vlc/gui/helpers/BitmapUtil.kt
index 576b915a20..fabaa0d8c9 100644
--- a/vlc-android/src/org/videolan/vlc/gui/helpers/BitmapUtil.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/helpers/BitmapUtil.kt
@@ -23,7 +23,7 @@ package org.videolan.vlc.gui.helpers
 import android.graphics.Bitmap
 import android.graphics.BitmapFactory
 import android.net.Uri
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.R
 import org.videolan.vlc.VLCApplication
 
@@ -31,21 +31,21 @@ object BitmapUtil {
     const val TAG = "VLC/UiTools/BitmapUtil"
 
 
-    fun getPictureFromCache(media: AMediaWrapper): Bitmap? {
+    fun getPictureFromCache(media: AbstractMediaWrapper): Bitmap? {
         // mPicture is not null only if passed through
         // the ctor which is deprecated by now.
         val b = media.picture
         return b ?: BitmapCache.getBitmapFromMemCache(media.location)
     }
 
-    private fun fetchPicture(media: AMediaWrapper): Bitmap? {
+    private fun fetchPicture(media: AbstractMediaWrapper): Bitmap? {
 
         val picture = readCoverBitmap(media.artworkURL)
         if (picture != null) BitmapCache.addBitmapToMemCache(media.location, picture)
         return picture
     }
 
-    fun getPicture(media: AMediaWrapper): Bitmap? {
+    fun getPicture(media: AbstractMediaWrapper): Bitmap? {
         val picture = getPictureFromCache(media)
         return picture ?: fetchPicture(media)
     }
diff --git a/vlc-android/src/org/videolan/vlc/gui/helpers/ImageLoader.kt b/vlc-android/src/org/videolan/vlc/gui/helpers/ImageLoader.kt
index b1a87ca27d..fbc15122e3 100644
--- a/vlc-android/src/org/videolan/vlc/gui/helpers/ImageLoader.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/helpers/ImageLoader.kt
@@ -18,7 +18,7 @@ import androidx.databinding.OnRebindCallback
 import androidx.databinding.ViewDataBinding
 import androidx.leanback.widget.ImageCardView
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.BR
 import org.videolan.vlc.R
@@ -50,11 +50,11 @@ fun loadImage(v: View, item: MediaLibraryItem?) {
         return
     }
     val isMedia = item.itemType == MediaLibraryItem.TYPE_MEDIA
-    if (isMedia && (item as AMediaWrapper).type == AMediaWrapper.TYPE_VIDEO && !Settings.showVideoThumbs) {
+    if (isMedia && (item as AbstractMediaWrapper).type == AbstractMediaWrapper.TYPE_VIDEO && !Settings.showVideoThumbs) {
         updateImageView(UiTools.getDefaultVideoDrawable(v.context).bitmap, v, binding)
         return
     }
-    val isGroup = isMedia && (item as AMediaWrapper).type == AMediaWrapper.TYPE_GROUP
+    val isGroup = isMedia && (item as AbstractMediaWrapper).type == AbstractMediaWrapper.TYPE_GROUP
     val isFolder = !isMedia && item.itemType == MediaLibraryItem.TYPE_FOLDER;
     val cacheKey = when {
         isGroup -> "group:${item.title}"
@@ -85,7 +85,7 @@ fun getAudioIconDrawable(context: Context?, type: Int): BitmapDrawable? = contex
 }
 
 fun getMediaIconDrawable(context: Context, type: Int): BitmapDrawable? = when (type) {
-    AMediaWrapper.TYPE_VIDEO -> UiTools.getDefaultVideoDrawable(context)
+    AbstractMediaWrapper.TYPE_VIDEO -> UiTools.getDefaultVideoDrawable(context)
     else -> UiTools.getDefaultAudioDrawable(context)
 }
 
@@ -223,11 +223,11 @@ fun updateImageView(bitmap: Bitmap?, target: View, vdb: ViewDataBinding?) {
 
 private suspend fun findInLibrary(item: MediaLibraryItem, isMedia: Boolean, isGroup: Boolean): MediaLibraryItem {
     if (isMedia && !isGroup && item.id == 0L) {
-        val mw = item as AMediaWrapper
+        val mw = item as AbstractMediaWrapper
         val type = mw.type
-        val isMediaFile = type == AMediaWrapper.TYPE_AUDIO || type == AMediaWrapper.TYPE_VIDEO
+        val isMediaFile = type == AbstractMediaWrapper.TYPE_AUDIO || type == AbstractMediaWrapper.TYPE_VIDEO
         val uri = mw.uri
-        if (!isMediaFile && !(type == AMediaWrapper.TYPE_DIR && "upnp" == uri.scheme)) return item
+        if (!isMediaFile && !(type == AbstractMediaWrapper.TYPE_DIR && "upnp" == uri.scheme)) return item
         if (isMediaFile && "file" == uri.scheme) return withContext(Dispatchers.IO) { sMedialibrary.getMedia(uri) }
                 ?: item
     }
diff --git a/vlc-android/src/org/videolan/vlc/gui/helpers/MediaComparators.kt b/vlc-android/src/org/videolan/vlc/gui/helpers/MediaComparators.kt
index 01e47c1526..2f3d90d8a6 100644
--- a/vlc-android/src/org/videolan/vlc/gui/helpers/MediaComparators.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/helpers/MediaComparators.kt
@@ -19,12 +19,12 @@
  */
 package org.videolan.vlc.gui.helpers
 
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import java.util.*
 
 object MediaComparators {
 
-    val byTrackNumber: Comparator<AMediaWrapper> = Comparator { m1, m2 ->
+    val BY_TRACK_NUMBER: Comparator<AbstractMediaWrapper> = Comparator { m1, m2 ->
         if (m1.discNumber < m2.discNumber) return@Comparator -1
         if (m1.discNumber > m2.discNumber) return@Comparator 1
         if (m1.trackNumber < m2.trackNumber) return@Comparator -1
diff --git a/vlc-android/src/org/videolan/vlc/gui/helpers/PlayerOptionsDelegate.kt b/vlc-android/src/org/videolan/vlc/gui/helpers/PlayerOptionsDelegate.kt
index 8010475a81..53819e993e 100644
--- a/vlc-android/src/org/videolan/vlc/gui/helpers/PlayerOptionsDelegate.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/helpers/PlayerOptionsDelegate.kt
@@ -241,7 +241,7 @@ class PlayerOptionsDelegate(val activity: AppCompatActivity, val service: Playba
                 tag = "equalizer"
             }
             ID_SAVE_PLAYLIST -> {
-                UiTools.addToPlaylist(activity, service.medias)
+                UiTools.addToPlaylist(activity, service.media)
                 hide()
                 return
             }
diff --git a/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.kt b/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.kt
index 156f2342a1..7b1a67745b 100644
--- a/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.kt
@@ -63,9 +63,9 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.launch
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.tools.isStarted
 import org.videolan.vlc.BuildConfig
@@ -253,15 +253,15 @@ object UiTools {
         }
     }
 
-    fun savePlaylist(activity: FragmentActivity, list: List<AMediaWrapper>) {
+    fun savePlaylist(activity: FragmentActivity, list: List<AbstractMediaWrapper>) {
         addToPlaylist(activity, list.toTypedArray(), SavePlaylistDialog.KEY_TRACKS)
     }
 
-    fun addToPlaylist(activity: FragmentActivity, list: List<AMediaWrapper>) {
+    fun addToPlaylist(activity: FragmentActivity, list: List<AbstractMediaWrapper>) {
         addToPlaylist(activity, list.toTypedArray(), SavePlaylistDialog.KEY_NEW_TRACKS)
     }
 
-    fun addToPlaylist(activity: FragmentActivity, tracks: Array<AMediaWrapper>, key: String) {
+    fun addToPlaylist(activity: FragmentActivity, tracks: Array<AbstractMediaWrapper>, key: String) {
         if (!activity.isStarted()) return
         val savePlaylistDialog = SavePlaylistDialog()
         val args = Bundle()
@@ -276,7 +276,7 @@ object UiTools {
             MediaLibraryItem.TYPE_ARTIST -> getDefaultArtistDrawable(context)
             MediaLibraryItem.TYPE_ALBUM -> getDefaultAlbumDrawable(context)
             MediaLibraryItem.TYPE_MEDIA -> {
-                if ((item as AMediaWrapper).type == AMediaWrapper.TYPE_VIDEO) getDefaultVideoDrawable(context) else getDefaultAudioDrawable(context)
+                if ((item as AbstractMediaWrapper).type == AbstractMediaWrapper.TYPE_VIDEO) getDefaultVideoDrawable(context) else getDefaultAudioDrawable(context)
             }
             else -> getDefaultAudioDrawable(context)
         }
@@ -325,21 +325,21 @@ object UiTools {
         val sort = provider.sort
         val desc = provider.desc
         var item: MenuItem? = menu.findItem(R.id.ml_menu_sortby_name)
-        item?.setTitle(if (sort == AMedialibrary.SORT_ALPHA && !desc) R.string.sortby_name_desc else R.string.sortby_name)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_ALPHA && !desc) R.string.sortby_name_desc else R.string.sortby_name)
         item = menu.findItem(R.id.ml_menu_sortby_filename)
-        item?.setTitle(if (sort == AMedialibrary.SORT_FILENAME && !desc) R.string.sortby_filename_desc else R.string.sortby_filename)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_FILENAME && !desc) R.string.sortby_filename_desc else R.string.sortby_filename)
         item = menu.findItem(R.id.ml_menu_sortby_artist_name)
-        item?.setTitle(if (sort == AMedialibrary.SORT_ARTIST && !desc) R.string.sortby_artist_name_desc else R.string.sortby_artist_name)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_ARTIST && !desc) R.string.sortby_artist_name_desc else R.string.sortby_artist_name)
         item = menu.findItem(R.id.ml_menu_sortby_album_name)
-        item?.setTitle(if (sort == AMedialibrary.SORT_ALBUM && !desc) R.string.sortby_album_name_desc else R.string.sortby_album_name)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_ALBUM && !desc) R.string.sortby_album_name_desc else R.string.sortby_album_name)
         item = menu.findItem(R.id.ml_menu_sortby_length)
-        item?.setTitle(if (sort == AMedialibrary.SORT_DURATION && !desc) R.string.sortby_length_desc else R.string.sortby_length)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_DURATION && !desc) R.string.sortby_length_desc else R.string.sortby_length)
         item = menu.findItem(R.id.ml_menu_sortby_date)
-        item?.setTitle(if (sort == AMedialibrary.SORT_RELEASEDATE && !desc) R.string.sortby_date_desc else R.string.sortby_date)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_RELEASEDATE && !desc) R.string.sortby_date_desc else R.string.sortby_date)
         item = menu.findItem(R.id.ml_menu_sortby_last_modified)
-        item?.setTitle(if (sort == AMedialibrary.SORT_RELEASEDATE && !desc) R.string.sortby_last_modified_date_desc else R.string.sortby_last_modified_date)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_RELEASEDATE && !desc) R.string.sortby_last_modified_date_desc else R.string.sortby_last_modified_date)
         //        item = menu.findItem(R.id.ml_menu_sortby_number); TODO sort by track number
-        //        if (item != null) item.setTitle(sort == AMedialibrary.SORT_ && !desc ? R.string.sortby_number_desc : R.string.sortby_number);
+        //        if (item != null) item.setTitle(sort == AbstractMedialibrary.SORT_ && !desc ? R.string.sortby_number_desc : R.string.sortby_number);
 
     }
 
@@ -349,21 +349,21 @@ object UiTools {
         val sort = model.sort
         val desc = model.desc
         var item: MenuItem? = menu.findItem(R.id.ml_menu_sortby_name)
-        item?.setTitle(if (sort == AMedialibrary.SORT_ALPHA && !desc) R.string.sortby_name_desc else R.string.sortby_name)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_ALPHA && !desc) R.string.sortby_name_desc else R.string.sortby_name)
         item = menu.findItem(R.id.ml_menu_sortby_filename)
-        item?.setTitle(if (sort == AMedialibrary.SORT_FILENAME && !desc) R.string.sortby_filename_desc else R.string.sortby_filename)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_FILENAME && !desc) R.string.sortby_filename_desc else R.string.sortby_filename)
         item = menu.findItem(R.id.ml_menu_sortby_artist_name)
-        item?.setTitle(if (sort == AMedialibrary.SORT_ARTIST && !desc) R.string.sortby_artist_name_desc else R.string.sortby_artist_name)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_ARTIST && !desc) R.string.sortby_artist_name_desc else R.string.sortby_artist_name)
         item = menu.findItem(R.id.ml_menu_sortby_album_name)
-        item?.setTitle(if (sort == AMedialibrary.SORT_ALBUM && !desc) R.string.sortby_album_name_desc else R.string.sortby_album_name)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_ALBUM && !desc) R.string.sortby_album_name_desc else R.string.sortby_album_name)
         item = menu.findItem(R.id.ml_menu_sortby_length)
-        item?.setTitle(if (sort == AMedialibrary.SORT_DURATION && !desc) R.string.sortby_length_desc else R.string.sortby_length)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_DURATION && !desc) R.string.sortby_length_desc else R.string.sortby_length)
         item = menu.findItem(R.id.ml_menu_sortby_date)
-        item?.setTitle(if (sort == AMedialibrary.SORT_RELEASEDATE && !desc) R.string.sortby_date_desc else R.string.sortby_date)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_RELEASEDATE && !desc) R.string.sortby_date_desc else R.string.sortby_date)
         item = menu.findItem(R.id.ml_menu_sortby_last_modified)
-        item?.setTitle(if (sort == AMedialibrary.SORT_RELEASEDATE && !desc) R.string.sortby_last_modified_date_desc else R.string.sortby_last_modified_date)
+        item?.setTitle(if (sort == AbstractMedialibrary.SORT_RELEASEDATE && !desc) R.string.sortby_last_modified_date_desc else R.string.sortby_last_modified_date)
         //        item = menu.findItem(R.id.ml_menu_sortby_number); TODO sort by track number
-        //        if (item != null) item.setTitle(sort == AMedialibrary.SORT_ && !desc ? R.string.sortby_number_desc : R.string.sortby_number);
+        //        if (item != null) item.setTitle(sort == AbstractMedialibrary.SORT_ && !desc ? R.string.sortby_number_desc : R.string.sortby_number);
 
     }
 
@@ -422,9 +422,9 @@ object UiTools {
                                 MediaUtils.openUri(activity, item.uri)
                             else if (item.text != null) {
                                 val uri = Uri.parse(item.text.toString())
-                                val media = MLServiceLocator.getAMediaWrapper(uri)
+                                val media = MLServiceLocator.getAbstractMediaWrapper(uri)
                                 if ("file" != uri.scheme)
-                                    media.type = AMediaWrapper.TYPE_STREAM
+                                    media.type = AbstractMediaWrapper.TYPE_STREAM
                                 MediaUtils.openMedia(activity, media)
                             }
                             return@OnDragListener true
diff --git a/vlc-android/src/org/videolan/vlc/gui/helpers/hf/OtgAccess.kt b/vlc-android/src/org/videolan/vlc/gui/helpers/hf/OtgAccess.kt
index 5c71e429b3..537251f12a 100644
--- a/vlc-android/src/org/videolan/vlc/gui/helpers/hf/OtgAccess.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/helpers/hf/OtgAccess.kt
@@ -33,7 +33,7 @@ import androidx.documentfile.provider.DocumentFile
 import androidx.fragment.app.FragmentActivity
 import androidx.lifecycle.LiveData
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import videolan.org.commontools.LiveEvent
 
 const val SAF_REQUEST = 85
@@ -70,7 +70,7 @@ class OtgAccess : BaseHeadlessFragment() {
 }
 
 @WorkerThread
-fun getDocumentFiles(context: Context, path: String) : List<AMediaWrapper>? {
+fun getDocumentFiles(context: Context, path: String) : List<AbstractMediaWrapper>? {
     val rootUri = OtgAccess.otgRoot.value ?: return null
 //    else Uri.Builder().scheme("content")
 //            .authority(OTG_CONTENT_AUTHORITY)
@@ -90,15 +90,15 @@ fun getDocumentFiles(context: Context, path: String) : List<AMediaWrapper>? {
     }
 
     // we have the end point DocumentFile, list the files inside it and return
-    val list = mutableListOf<AMediaWrapper>()
+    val list = mutableListOf<AbstractMediaWrapper>()
     for (file in documentFile.listFiles()) {
         if (file.exists() && file.canRead()) {
             if (file.name?.startsWith(".") == true) continue
-            val mw = MLServiceLocator.getAMediaWrapper(file.uri).apply {
+            val mw = MLServiceLocator.getAbstractMediaWrapper(file.uri).apply {
                 type = when {
-                    file.isDirectory -> AMediaWrapper.TYPE_DIR
-                    file.type?.startsWith("video") == true -> AMediaWrapper.TYPE_VIDEO
-                    file.type?.startsWith("audio") == true -> AMediaWrapper.TYPE_AUDIO
+                    file.isDirectory -> AbstractMediaWrapper.TYPE_DIR
+                    file.type?.startsWith("video") == true -> AbstractMediaWrapper.TYPE_VIDEO
+                    file.type?.startsWith("audio") == true -> AbstractMediaWrapper.TYPE_AUDIO
                     else -> type
                 }
                 title = file.name
diff --git a/vlc-android/src/org/videolan/vlc/gui/network/MRLAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/network/MRLAdapter.kt
index 8b4a9084cc..980d1bd01e 100644
--- a/vlc-android/src/org/videolan/vlc/gui/network/MRLAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/network/MRLAdapter.kt
@@ -27,12 +27,12 @@ import android.view.ViewGroup
 import androidx.databinding.DataBindingUtil
 import androidx.recyclerview.widget.RecyclerView
 import kotlinx.coroutines.channels.SendChannel
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.R
 import org.videolan.vlc.databinding.MrlItemBinding
 
 internal class MRLAdapter(private val eventActor: SendChannel<MrlAction>) : RecyclerView.Adapter<MRLAdapter.ViewHolder>() {
-    private var dataset: List<AMediaWrapper>? = null
+    private var dataset: List<AbstractMediaWrapper>? = null
 
     val isEmpty: Boolean
         get() = itemCount == 0
@@ -49,12 +49,12 @@ internal class MRLAdapter(private val eventActor: SendChannel<MrlAction>) : Recy
         holder.binding.mrlItemTitle.text = Uri.decode(item?.title)
     }
 
-    fun setList(list: List<AMediaWrapper>?) {
+    fun setList(list: List<AbstractMediaWrapper>?) {
         dataset = list
         notifyDataSetChanged()
     }
 
-    fun getItem(position: Int): AMediaWrapper? = when {
+    fun getItem(position: Int): AbstractMediaWrapper? = when {
         position >= itemCount -> null
         position < 0 -> null
         else -> dataset?.get(position)
@@ -77,5 +77,5 @@ internal class MRLAdapter(private val eventActor: SendChannel<MrlAction>) : Recy
 }
 
 sealed class MrlAction
-class Playmedia(val media: AMediaWrapper) : MrlAction()
+class Playmedia(val media: AbstractMediaWrapper) : MrlAction()
 class ShowContext(val position: Int) : MrlAction()
diff --git a/vlc-android/src/org/videolan/vlc/gui/network/MRLPanelFragment.kt b/vlc-android/src/org/videolan/vlc/gui/network/MRLPanelFragment.kt
index 9190eec5bc..7344b34b24 100644
--- a/vlc-android/src/org/videolan/vlc/gui/network/MRLPanelFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/network/MRLPanelFragment.kt
@@ -44,7 +44,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.channels.actor
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.tools.coroutineScope
 import org.videolan.vlc.R
 import org.videolan.vlc.databinding.MrlPanelBinding
@@ -117,7 +117,7 @@ class MRLPanelFragment : Fragment(), View.OnKeyListener, TextView.OnEditorAction
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-        viewModel.dataset.observe(this, Observer { adapter.setList(it as List<AMediaWrapper>) })
+        viewModel.dataset.observe(this, Observer { adapter.setList(it as List<AbstractMediaWrapper>) })
     }
 
     override fun onStart() {
@@ -138,7 +138,7 @@ class MRLPanelFragment : Fragment(), View.OnKeyListener, TextView.OnEditorAction
 
     private fun processUri(): Boolean {
         if (!TextUtils.isEmpty(viewModel.observableSearchText.get())) {
-            val mw = MLServiceLocator.getAMediaWrapper(Uri.parse(viewModel.observableSearchText.get()))
+            val mw = MLServiceLocator.getAbstractMediaWrapper(Uri.parse(viewModel.observableSearchText.get()))
             playMedia(mw)
             viewModel.observableSearchText.set("")
             return true
@@ -146,8 +146,8 @@ class MRLPanelFragment : Fragment(), View.OnKeyListener, TextView.OnEditorAction
         return false
     }
 
-    private fun playMedia(mw: AMediaWrapper) {
-        mw.type = AMediaWrapper.TYPE_STREAM
+    private fun playMedia(mw: AbstractMediaWrapper) {
+        mw.type = AbstractMediaWrapper.TYPE_STREAM
         MediaUtils.openMedia(activity, mw)
         viewModel.refresh()
         activity?.invalidateOptionsMenu()
diff --git a/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAdvanced.kt b/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAdvanced.kt
index 5306102d91..47c45ab98a 100644
--- a/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAdvanced.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAdvanced.kt
@@ -34,7 +34,7 @@ import androidx.preference.EditTextPreference
 import androidx.preference.Preference
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.R
 import org.videolan.vlc.VLCApplication
@@ -107,9 +107,9 @@ class PreferencesAdvanced : BasePreferenceFragment(), SharedPreferences.OnShared
                 else
                     runIO(Runnable {
                         val dump = Runnable {
-                            val db = File(requireContext().getDir("db", Context.MODE_PRIVATE).toString() + AMedialibrary.VLC_MEDIA_DB_NAME)
+                            val db = File(requireContext().getDir("db", Context.MODE_PRIVATE).toString() + AbstractMedialibrary.VLC_MEDIA_DB_NAME)
 
-                            if (FileUtils.copyFile(db, File(AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY + AMedialibrary.VLC_MEDIA_DB_NAME)))
+                            if (FileUtils.copyFile(db, File(AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY + AbstractMedialibrary.VLC_MEDIA_DB_NAME)))
                                 runOnMainThread(Runnable {
                                     val ctx = context
                                     if (ctx != null) Toast.makeText(ctx, "Database dumped on internal storage root", Toast.LENGTH_LONG).show()
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/CardPresenter.kt b/vlc-android/src/org/videolan/vlc/gui/tv/CardPresenter.kt
index 88984f309a..0f2865ee41 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/CardPresenter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/CardPresenter.kt
@@ -40,8 +40,8 @@ import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
 import org.videolan.medialibrary.media.DummyItem
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.R
 import org.videolan.vlc.VLCApplication
@@ -74,10 +74,10 @@ class CardPresenter(private val context: Activity) : Presenter() {
 
         fun updateCardViewImage(item: MediaLibraryItem) {
             val noArt = TextUtils.isEmpty(item.artworkMrl)
-            if (item is AMediaWrapper) {
-                val group = item.type == AMediaWrapper.TYPE_GROUP
-                val folder = item.type == AMediaWrapper.TYPE_DIR
-                val video = item.type == AMediaWrapper.TYPE_VIDEO
+            if (item is AbstractMediaWrapper) {
+                val group = item.type == AbstractMediaWrapper.TYPE_GROUP
+                val folder = item.type == AbstractMediaWrapper.TYPE_DIR
+                val video = item.type == AbstractMediaWrapper.TYPE_VIDEO
                 if (!folder && (group || video && !item.isThumbnailGenerated)) {
                     if (noArt) {
                         cardView.mainImageView.scaleType = ImageView.ScaleType.FIT_CENTER
@@ -103,7 +103,7 @@ class CardPresenter(private val context: Activity) : Presenter() {
         private fun getDefaultImage(mediaLibraryItem: MediaLibraryItem): Bitmap? {
             var picture: Bitmap?
             val res = cardView.resources
-            picture = if (mediaLibraryItem.itemType == MediaLibraryItem.TYPE_MEDIA && (mediaLibraryItem as AMediaWrapper).type == AMediaWrapper.TYPE_DIR) {
+            picture = if (mediaLibraryItem.itemType == MediaLibraryItem.TYPE_MEDIA && (mediaLibraryItem as AbstractMediaWrapper).type == AbstractMediaWrapper.TYPE_DIR) {
                 if (TextUtils.equals(mediaLibraryItem.uri.scheme, "file"))
                     BitmapFactory.decodeResource(res, R.drawable.ic_menu_folder_big)
                 else
@@ -132,12 +132,12 @@ class CardPresenter(private val context: Activity) : Presenter() {
     override fun onBindViewHolder(viewHolder: Presenter.ViewHolder, item: Any) {
         val holder = viewHolder as ViewHolder
         when (item) {
-            is AMediaWrapper -> {
+            is AbstractMediaWrapper -> {
                 holder.cardView.titleText = item.title
                 holder.cardView.contentText = item.description
                 holder.updateCardViewImage(item)
                 if (mIsSeenMediaMarkerVisible
-                        && item.type == AMediaWrapper.TYPE_VIDEO
+                        && item.type == AbstractMediaWrapper.TYPE_VIDEO
                         && item.seen > 0L)
                     holder.cardView.badgeImage = ContextCompat.getDrawable(context, R.drawable.ic_seen_tv_normal)
                 holder.view.setOnLongClickListener { v ->
@@ -180,18 +180,18 @@ class CardPresenter(private val context: Activity) : Presenter() {
                     UPDATE_DESCRIPTION -> holder.cardView.contentText = media.description
                     UPDATE_THUMB -> loadImage(holder.cardView, media)
                     UPDATE_TIME -> {
-                        val mediaWrapper = item as AMediaWrapper
+                        val mediaWrapper = item as AbstractMediaWrapper
                         Tools.setMediaDescription(mediaWrapper)
                         holder.cardView.contentText = mediaWrapper.description
                         if (mediaWrapper.time <= 0) {
-                            if (mIsSeenMediaMarkerVisible && item.type == AMediaWrapper.TYPE_VIDEO
+                            if (mIsSeenMediaMarkerVisible && item.type == AbstractMediaWrapper.TYPE_VIDEO
                                     && item.seen > 0L)
                                 holder.cardView.badgeImage = ContextCompat.getDrawable(context, R.drawable.ic_seen_tv_normal)
                         }
                     }
                     UPDATE_SEEN -> {
-                        val mw = item as AMediaWrapper
-                        if (mIsSeenMediaMarkerVisible && mw.type == AMediaWrapper.TYPE_VIDEO && mw.seen > 0L)
+                        val mw = item as AbstractMediaWrapper
+                        if (mIsSeenMediaMarkerVisible && mw.type == AbstractMediaWrapper.TYPE_VIDEO && mw.seen > 0L)
                             holder.cardView.badgeImage = ContextCompat.getDrawable(context, R.drawable.ic_seen_tv_normal)
                     }
                 }
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/FileTvItemAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/tv/FileTvItemAdapter.kt
index 849e9ddb4f..6ef43ab983 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/FileTvItemAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/FileTvItemAdapter.kt
@@ -12,7 +12,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.util.AndroidUtil
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.databinding.MediaBrowserTvItemBinding
 import org.videolan.vlc.gui.DiffUtilAdapter
@@ -24,12 +24,12 @@ import org.videolan.vlc.util.generateResolutionClass
 
 @ExperimentalCoroutinesApi
 @ObsoleteCoroutinesApi
-class FileTvItemAdapter(type: Int, private val eventsHandler: IEventsHandler, var itemSize: Int) : DiffUtilAdapter<AMediaWrapper, MediaTvItemAdapter.AbstractMediaItemViewHolder<MediaBrowserTvItemBinding>>(), FastScroller.SeparatedAdapter, TvItemAdapter {
+class FileTvItemAdapter(type: Int, private val eventsHandler: IEventsHandler, var itemSize: Int) : DiffUtilAdapter<AbstractMediaWrapper, MediaTvItemAdapter.AbstractMediaItemViewHolder<MediaBrowserTvItemBinding>>(), FastScroller.SeparatedAdapter, TvItemAdapter {
 
     override fun submitList(pagedList: Any?) {
         if (pagedList is List<*>) {
             @Suppress("UNCHECKED_CAST")
-            update(pagedList as List<AMediaWrapper>)
+            update(pagedList as List<AbstractMediaWrapper>)
         }
     }
 
@@ -79,8 +79,8 @@ class FileTvItemAdapter(type: Int, private val eventsHandler: IEventsHandler, va
         this.focusListener = focusListener
     }
 
-    override fun createCB(): DiffCallback<AMediaWrapper> {
-        return object : DiffCallback<AMediaWrapper>() {
+    override fun createCB(): DiffCallback<AbstractMediaWrapper> {
+        return object : DiffCallback<AbstractMediaWrapper>() {
             override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) = try {
                 oldList[oldItemPosition] == newList[newItemPosition]
                 } catch (e: IndexOutOfBoundsException) {
@@ -143,8 +143,8 @@ class FileTvItemAdapter(type: Int, private val eventsHandler: IEventsHandler, va
             var seen = 0L
             var description = item?.description
             var resolution = ""
-            if (item is AMediaWrapper) {
-                if (item.type == AMediaWrapper.TYPE_VIDEO) {
+            if (item is AbstractMediaWrapper) {
+                if (item.type == AbstractMediaWrapper.TYPE_VIDEO) {
                     resolution = generateResolutionClass(item.width, item.height) ?: ""
                     isSquare = false
                     description = if (item.time == 0L) Tools.millisToString(item.length) else Tools.getProgressText(item)
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/MainTvActivity.kt b/vlc-android/src/org/videolan/vlc/gui/tv/MainTvActivity.kt
index 97910aab35..5335238dc4 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/MainTvActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/MainTvActivity.kt
@@ -30,7 +30,7 @@ import android.view.View
 import android.widget.ProgressBar
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.vlc.R
 import org.videolan.vlc.ScanProgress
 import org.videolan.vlc.StartActivity
@@ -106,12 +106,12 @@ class MainTvActivity : BaseTvActivity() {
     }
 
     override fun onParsingServiceProgress(scanProgress: ScanProgress?) {
-        if (progressBar.visibility == View.GONE && AMedialibrary.getInstance().isWorking)
+        if (progressBar.visibility == View.GONE && AbstractMedialibrary.getInstance().isWorking)
             handler.sendEmptyMessage(SHOW_LOADING)
     }
 
     override fun onParsingServiceFinished() {
-        if (!AMedialibrary.getInstance().isWorking)
+        if (!AbstractMedialibrary.getInstance().isWorking)
             handler.sendEmptyMessageDelayed(HIDE_LOADING, 500)
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/MainTvFragment.kt b/vlc-android/src/org/videolan/vlc/gui/tv/MainTvFragment.kt
index 007cfcd414..1d201cd558 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/MainTvFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/MainTvFragment.kt
@@ -33,8 +33,8 @@ import androidx.lifecycle.Observer
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.DummyItem
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.R
@@ -200,7 +200,7 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
 
     override fun onStart() {
         super.onStart()
-        if (selectedItem is AMediaWrapper) TvUtil.updateBackground(backgroundManager, selectedItem)
+        if (selectedItem is AbstractMediaWrapper) TvUtil.updateBackground(backgroundManager, selectedItem)
         model.refresh()
     }
 
@@ -212,8 +212,9 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
     override fun onClick(v: View?) = requireActivity().startActivity(Intent(requireContext(), SearchActivity::class.java))
 
     fun showDetails(): Boolean {
-        val media = selectedItem as? AMediaWrapper ?: return false
-        if (media.type != AMediaWrapper.TYPE_DIR) return false
+        val media = selectedItem as? AbstractMediaWrapper
+                ?: return false
+        if (media.type != AbstractMediaWrapper.TYPE_DIR) return false
         val intent = Intent(requireActivity(), DetailsActivity::class.java)
         // pass the item information
         intent.putExtra("media", media)
@@ -239,7 +240,7 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
                 when ((item as GenericCardItem).id) {
                     ID_SETTINGS -> activity.startActivityForResult(Intent(activity, org.videolan.vlc.gui.tv.preferences.PreferencesActivity::class.java), ACTIVITY_RESULT_PREFERENCES)
                     ID_REFRESH -> {
-                        if (!AMedialibrary.getInstance().isWorking) {
+                        if (!AbstractMedialibrary.getInstance().isWorking) {
                             requireActivity().reloadLibrary()
                         }
                     }
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/MediaHeaderAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/tv/MediaHeaderAdapter.kt
index bc39d1ed33..9fbc0c2e44 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/MediaHeaderAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/MediaHeaderAdapter.kt
@@ -5,7 +5,7 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.databinding.DataBindingUtil
 import androidx.recyclerview.widget.RecyclerView
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.vlc.R
 import org.videolan.vlc.databinding.SongHeaderItemBinding
 
@@ -13,7 +13,7 @@ class MediaHeaderAdapter(private val onHeaderSelected: OnHeaderSelected) : Recyc
 
     private val alphaItems = listOf("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#")
 
-    var sortType = AMedialibrary.SORT_ALPHA
+    var sortType = AbstractMedialibrary.SORT_ALPHA
 
     var items = ArrayList<String>()
 
@@ -23,14 +23,14 @@ class MediaHeaderAdapter(private val onHeaderSelected: OnHeaderSelected) : Recyc
 
     override fun getItemCount(): Int {
         return when (sortType) {
-            AMedialibrary.SORT_ALPHA, AMedialibrary.SORT_DEFAULT -> alphaItems.size
+            AbstractMedialibrary.SORT_ALPHA, AbstractMedialibrary.SORT_DEFAULT -> alphaItems.size
             else -> items.size
         }
     }
 
     override fun onBindViewHolder(holder: ViewHolder, position: Int) {
 
-        if (sortType == AMedialibrary.SORT_ALPHA || sortType == AMedialibrary.SORT_DEFAULT) {
+        if (sortType == AbstractMedialibrary.SORT_ALPHA || sortType == AbstractMedialibrary.SORT_DEFAULT) {
             holder.binding.headerText = alphaItems[position]
             holder.binding.hasContent = items.contains(alphaItems[position])
         } else {
@@ -40,7 +40,7 @@ class MediaHeaderAdapter(private val onHeaderSelected: OnHeaderSelected) : Recyc
     }
 
     fun getItem(position: Int): String {
-        return if (sortType == AMedialibrary.SORT_ALPHA || sortType == AMedialibrary.SORT_DEFAULT) {
+        return if (sortType == AbstractMedialibrary.SORT_ALPHA || sortType == AbstractMedialibrary.SORT_DEFAULT) {
             alphaItems[position]
         } else {
             items[position]
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.kt b/vlc-android/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.kt
index 9f63bce8de..84ed229293 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.kt
@@ -36,7 +36,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.util.AndroidUtil
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.R
 import org.videolan.vlc.gui.helpers.AudioUtil
 import org.videolan.vlc.gui.helpers.UiTools
@@ -56,7 +56,7 @@ class MediaItemDetailsFragment : DetailsSupportFragment() {
     private lateinit var backgroundManager: BackgroundManager
     private lateinit var rowsAdapter: ArrayObjectAdapter
     private lateinit var mediaItemDetails: MediaItemDetails
-    private lateinit var mediaWrapper: AMediaWrapper
+    private lateinit var mediaWrapper: AbstractMediaWrapper
     private lateinit var browserFavRepository: BrowserFavRepository
     private var mediaStarted: Boolean = false
 
@@ -88,7 +88,7 @@ class MediaItemDetailsFragment : DetailsSupportFragment() {
         mediaItemDetails = extras.getParcelable("item") as MediaItemDetails
         val hasMedia = extras.containsKey("media")
         val selector = ClassPresenterSelector()
-        val media = (if (hasMedia) extras.getParcelable<Parcelable>("media") else MLServiceLocator.getAMediaWrapper(AndroidUtil.LocationToUri(mediaItemDetails.location))) as AMediaWrapper
+        val media = (if (hasMedia) extras.getParcelable<Parcelable>("media") else MLServiceLocator.getAbstractMediaWrapper(AndroidUtil.LocationToUri(mediaItemDetails.location))) as AbstractMediaWrapper
         if (!hasMedia) {
             media.setDisplayTitle(mediaItemDetails.title)
         }
@@ -153,13 +153,13 @@ class MediaItemDetailsFragment : DetailsSupportFragment() {
                 ListRowPresenter())
         rowsAdapter = ArrayObjectAdapter(selector)
         runIO(Runnable {
-            val cover = if (media.type == AMediaWrapper.TYPE_AUDIO || media.type == AMediaWrapper.TYPE_VIDEO)
+            val cover = if (media.type == AbstractMediaWrapper.TYPE_AUDIO || media.type == AbstractMediaWrapper.TYPE_VIDEO)
                 AudioUtil.readCoverBitmap(mediaItemDetails.artworkUrl, 512)
             else
                 null
             val blurred = if (cover != null) UiTools.blurBitmap(cover) else null
             val browserFavExists = browserFavRepository.browserFavExists(Uri.parse(mediaItemDetails.location))
-            val isDir = media.type == AMediaWrapper.TYPE_DIR
+            val isDir = media.type == AbstractMediaWrapper.TYPE_DIR
             val canSave = isDir && FileUtils.canSave(media)
             runOnMainThread(Runnable {
                 if (isDetached) return@Runnable
@@ -175,7 +175,7 @@ class MediaItemDetailsFragment : DetailsSupportFragment() {
                     detailsOverview.addAction(Action(ID_BROWSE.toLong(), res.getString(R.string.browse_folder)))
                     if (canSave) detailsOverview.addAction(if (browserFavExists) actionDelete else actionAdd)
 
-                } else if (media.type == AMediaWrapper.TYPE_AUDIO) {
+                } else if (media.type == AbstractMediaWrapper.TYPE_AUDIO) {
                     // Add images and action buttons to the details view
                     if (cover == null)
                         detailsOverview.imageDrawable = ContextCompat.getDrawable(context, R.drawable.ic_default_cone)
@@ -185,7 +185,7 @@ class MediaItemDetailsFragment : DetailsSupportFragment() {
                     detailsOverview.addAction(Action(ID_PLAY.toLong(), res.getString(R.string.play)))
                     detailsOverview.addAction(Action(ID_LISTEN.toLong(), res.getString(R.string.listen)))
                     detailsOverview.addAction(Action(ID_PLAYLIST.toLong(), res.getString(R.string.add_to_playlist)))
-                } else if (media.type == AMediaWrapper.TYPE_VIDEO) {
+                } else if (media.type == AbstractMediaWrapper.TYPE_VIDEO) {
                     // Add images and action buttons to the details view
                     if (cover == null)
                         detailsOverview.imageDrawable = ContextCompat.getDrawable(context, R.drawable.ic_default_cone)
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/MediaTvItemAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/tv/MediaTvItemAdapter.kt
index e1ae7e4d0a..d8e8b07dcf 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/MediaTvItemAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/MediaTvItemAdapter.kt
@@ -16,7 +16,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.util.AndroidUtil
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.databinding.MediaBrowserTvItemBinding
 import org.videolan.vlc.gui.helpers.SelectorViewHolder
@@ -194,8 +194,8 @@ class MediaTvItemAdapter(type: Int, private val eventsHandler: IEventsHandler, v
             var seen = 0L
             var description = item?.description
             var resolution = ""
-            if (item is AMediaWrapper) {
-                if (item.type == AMediaWrapper.TYPE_VIDEO) {
+            if (item is AbstractMediaWrapper) {
+                if (item.type == AbstractMediaWrapper.TYPE_VIDEO) {
                     resolution = generateResolutionClass(item.width, item.height) ?: ""
                     isSquare = false
                     description = if (item.time == 0L) Tools.millisToString(item.length) else Tools.getProgressText(item)
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/SearchFragment.kt b/vlc-android/src/org/videolan/vlc/gui/tv/SearchFragment.kt
index 86866d9abe..7d02642e32 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/SearchFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/SearchFragment.kt
@@ -32,10 +32,10 @@ import androidx.leanback.widget.*
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.launch
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AAlbum
-import org.videolan.medialibrary.interfaces.media.AArtist
-import org.videolan.medialibrary.interfaces.media.AGenre
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum
+import org.videolan.medialibrary.interfaces.media.AbstractArtist
+import org.videolan.medialibrary.interfaces.media.AbstractGenre
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.*
 import org.videolan.tools.coroutineScope
 import org.videolan.vlc.R
@@ -52,7 +52,7 @@ class SearchFragment : SearchSupportFragment(), SearchSupportFragment.SearchResu
     private val rowsAdapter = ArrayObjectAdapter(ListRowPresenter())
     private val defaultItemClickedListener: OnItemViewClickedListener
         get() = OnItemViewClickedListener { _, item, _, row ->
-            if (item is AMediaWrapper) TvUtil.openMedia(requireActivity(), item, null)
+            if (item is AbstractMediaWrapper) TvUtil.openMedia(requireActivity(), item, null)
             else TvUtil.openAudioCategory(requireActivity(), item as MediaLibraryItem)
             requireActivity().finish()
         }
@@ -98,11 +98,11 @@ class SearchFragment : SearchSupportFragment(), SearchSupportFragment.SearchResu
         val songsAdapter = ArrayObjectAdapter(cp)
         if (!mediaEmpty) songsAdapter.addAll(0, Arrays.asList(*searchAggregate.tracks))
         val artistsAdapter = ArrayObjectAdapter(cp)
-        if (!empty) artistsAdapter.addAll(0, Arrays.asList<AArtist>(*searchAggregate.artists))
+        if (!empty) artistsAdapter.addAll(0, Arrays.asList<AbstractArtist>(*searchAggregate.artists))
         val albumsAdapter = ArrayObjectAdapter(cp)
-        if (!empty) albumsAdapter.addAll(0, Arrays.asList<AAlbum>(*searchAggregate.albums))
+        if (!empty) albumsAdapter.addAll(0, Arrays.asList<AbstractAlbum>(*searchAggregate.albums))
         val genresAdapter = ArrayObjectAdapter(cp)
-        if (!empty) genresAdapter.addAll(0, Arrays.asList<AGenre>(*searchAggregate.genres))
+        if (!empty) genresAdapter.addAll(0, Arrays.asList<AbstractGenre>(*searchAggregate.genres))
         if (!mediaEmpty && videoAdapter.size() > 0)
             rowsAdapter.add(ListRow(HeaderItem(0, resources.getString(R.string.videos)), videoAdapter))
 //        if (!mediaEmpty && episodesAdapter.size() > 0)
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/TvUtil.kt b/vlc-android/src/org/videolan/vlc/gui/tv/TvUtil.kt
index be88c842fd..1ccae35e9d 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/TvUtil.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/TvUtil.kt
@@ -38,7 +38,7 @@ import androidx.leanback.app.BackgroundManager
 import androidx.leanback.widget.DiffCallback
 import androidx.leanback.widget.ListRow
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.DummyItem
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.tools.getposition
@@ -72,8 +72,8 @@ object TvUtil {
         override fun areContentsTheSame(oldItem: MediaLibraryItem, newItem: MediaLibraryItem): Boolean {
             if (oldItem.itemType == MediaLibraryItem.TYPE_DUMMY) return TextUtils.equals(oldItem.description, newItem.description)
             if (oldItem.itemType != MediaLibraryItem.TYPE_MEDIA) return true
-            val oldMedia = oldItem as AMediaWrapper
-            val newMedia = newItem as AMediaWrapper
+            val oldMedia = oldItem as AbstractMediaWrapper
+            val newMedia = newItem as AbstractMediaWrapper
             return oldMedia === newMedia || (oldMedia.time == newMedia.time
                     && TextUtils.equals(oldMedia.artworkMrl, newMedia.artworkMrl)
                     && oldMedia.seen == newMedia.seen)
@@ -81,8 +81,8 @@ object TvUtil {
 
         override fun getChangePayload(oldItem: MediaLibraryItem, newItem: MediaLibraryItem): Any {
             if (oldItem.itemType == MediaLibraryItem.TYPE_DUMMY) return UPDATE_DESCRIPTION
-            val oldMedia = oldItem as AMediaWrapper
-            val newMedia = newItem as AMediaWrapper
+            val oldMedia = oldItem as AbstractMediaWrapper
+            val newMedia = newItem as AbstractMediaWrapper
             if (oldMedia.time != newMedia.time) return UPDATE_TIME
             return if (!TextUtils.equals(oldMedia.artworkMrl, newMedia.artworkMrl)) UPDATE_THUMB
             else UPDATE_SEEN
@@ -109,9 +109,9 @@ object TvUtil {
     fun getOverscanHorizontal(context: Context) = context.resources.getDimensionPixelSize(R.dimen.tv_overscan_horizontal)
     fun getOverscanVertical(context: Context) = context.resources.getDimensionPixelSize(R.dimen.tv_overscan_vertical)
 
-    fun playMedia(activity: Activity, media: AMediaWrapper) {
-        if (media.type == AMediaWrapper.TYPE_AUDIO) {
-            val tracks = ArrayList<AMediaWrapper>()
+    fun playMedia(activity: Activity, media: AbstractMediaWrapper) {
+        if (media.type == AbstractMediaWrapper.TYPE_AUDIO) {
+            val tracks = ArrayList<AbstractMediaWrapper>()
             tracks.add(media)
             playMedia(activity, tracks)
         } else
@@ -127,19 +127,19 @@ object TvUtil {
     @Suppress("UNCHECKED_CAST")
     fun openMedia(activity: FragmentActivity, item: Any?, model: BaseModel<out MediaLibraryItem>?) {
         when (item) {
-            is AMediaWrapper -> when {
-                item.type == AMediaWrapper.TYPE_AUDIO -> {
-                    val list = (model!!.dataset.value as List<AMediaWrapper>).filter { it.type != AMediaWrapper.TYPE_DIR }
+            is AbstractMediaWrapper -> when {
+                item.type == AbstractMediaWrapper.TYPE_AUDIO -> {
+                    val list = (model!!.dataset.value as List<AbstractMediaWrapper>).filter { it.type != AbstractMediaWrapper.TYPE_DIR }
                     val position = list.getposition(item)
                     playAudioList(activity, list, position)
                 }
-                item.type == AMediaWrapper.TYPE_DIR -> {
+                item.type == AbstractMediaWrapper.TYPE_DIR -> {
                     val intent = Intent(activity, VerticalGridActivity::class.java)
                     intent.putExtra(MainTvActivity.BROWSER_TYPE, if ("file" == item.uri.scheme) HEADER_DIRECTORIES else HEADER_NETWORK)
                     intent.data = item.uri
                     activity.startActivity(intent)
                 }
-                item.type == AMediaWrapper.TYPE_GROUP -> {
+                item.type == AbstractMediaWrapper.TYPE_GROUP -> {
                     val intent = Intent(activity, VerticalGridActivity::class.java)
                     intent.putExtra(MainTvActivity.BROWSER_TYPE, HEADER_VIDEO)
                     val title = item.title.substring(if (item.title.toLowerCase().startsWith("the")) 4 else 0)
@@ -148,7 +148,7 @@ object TvUtil {
                 }
                 else -> {
                     model?.run {
-                        val list = (dataset.value as List<AMediaWrapper>).filter { it.type != AMediaWrapper.TYPE_DIR }
+                        val list = (dataset.value as List<AbstractMediaWrapper>).filter { it.type != AbstractMediaWrapper.TYPE_DIR }
                         val position = list.getposition(item)
                         MediaUtils.openList(activity, list, position)
                     } ?: MediaUtils.openMedia(activity, item)
@@ -175,19 +175,19 @@ object TvUtil {
     @Suppress("UNCHECKED_CAST")
     fun openMedia(activity: FragmentActivity, item: Any?, model: BrowserModel) {
         when (item) {
-            is AMediaWrapper -> when {
-                item.type == AMediaWrapper.TYPE_AUDIO -> {
-                    val list = (model.dataset.value as List<AMediaWrapper>).filter { it.type != AMediaWrapper.TYPE_DIR }
+            is AbstractMediaWrapper -> when {
+                item.type == AbstractMediaWrapper.TYPE_AUDIO -> {
+                    val list = (model.dataset.value as List<AbstractMediaWrapper>).filter { it.type != AbstractMediaWrapper.TYPE_DIR }
                     val position = list.getposition(item)
                     playAudioList(activity, list, position)
                 }
-                item.type == AMediaWrapper.TYPE_DIR -> {
+                item.type == AbstractMediaWrapper.TYPE_DIR -> {
                     val intent = Intent(activity, VerticalGridActivity::class.java)
                     intent.putExtra(MainTvActivity.BROWSER_TYPE, if ("file" == item.uri.scheme) HEADER_DIRECTORIES else HEADER_NETWORK)
                     intent.data = item.uri
                     activity.startActivity(intent)
                 }
-                item.type == AMediaWrapper.TYPE_GROUP -> {
+                item.type == AbstractMediaWrapper.TYPE_GROUP -> {
                     val intent = Intent(activity, VerticalGridActivity::class.java)
                     intent.putExtra(MainTvActivity.BROWSER_TYPE, HEADER_VIDEO)
                     val title = item.title.substring(if (item.title.toLowerCase().startsWith("the")) 4 else 0)
@@ -196,7 +196,7 @@ object TvUtil {
                 }
                 else -> {
                     model.run {
-                        val list = (dataset.value as List<AMediaWrapper>).filter { it.type != AMediaWrapper.TYPE_DIR }
+                        val list = (dataset.value as List<AbstractMediaWrapper>).filter { it.type != AbstractMediaWrapper.TYPE_DIR }
                         val position = list.getposition(item)
                         MediaUtils.openList(activity, list, position)
                     }
@@ -223,21 +223,21 @@ object TvUtil {
     @Suppress("UNCHECKED_CAST")
     suspend fun openMediaFromPaged(activity: FragmentActivity, item: Any?, provider: MedialibraryProvider<out MediaLibraryItem>) {
         when (item) {
-            is AMediaWrapper -> when {
-                item.type == AMediaWrapper.TYPE_AUDIO -> {
+            is AbstractMediaWrapper -> when {
+                item.type == AbstractMediaWrapper.TYPE_AUDIO -> {
                     val list = withContext(Dispatchers.IO) {
-                        (provider.getAll().toList()).filter { it.itemType != AMediaWrapper.TYPE_DIR } as ArrayList<AMediaWrapper>
+                        (provider.getAll().toList()).filter { it.itemType != AbstractMediaWrapper.TYPE_DIR } as ArrayList<AbstractMediaWrapper>
                     }
                     val position = list.getposition(item)
                     playAudioList(activity, list, position)
                 }
-                item.type == AMediaWrapper.TYPE_DIR -> {
+                item.type == AbstractMediaWrapper.TYPE_DIR -> {
                     val intent = Intent(activity, VerticalGridActivity::class.java)
                     intent.putExtra(MainTvActivity.BROWSER_TYPE, if ("file" == item.uri.scheme) HEADER_DIRECTORIES else HEADER_NETWORK)
                     intent.data = item.uri
                     activity.startActivity(intent)
                 }
-                item.type == AMediaWrapper.TYPE_GROUP -> {
+                item.type == AbstractMediaWrapper.TYPE_GROUP -> {
                     val intent = Intent(activity, VerticalGridActivity::class.java)
                     intent.putExtra(MainTvActivity.BROWSER_TYPE, HEADER_VIDEO)
                     val title = item.title.substring(if (item.title.toLowerCase().startsWith("the")) 4 else 0)
@@ -246,7 +246,7 @@ object TvUtil {
                 }
                 else -> {
                     val list = withContext(Dispatchers.IO) {
-                        (provider.getAll().toList() as List<AMediaWrapper>).filter { it.type != AMediaWrapper.TYPE_DIR }
+                        (provider.getAll().toList() as List<AbstractMediaWrapper>).filter { it.type != AbstractMediaWrapper.TYPE_DIR }
                     }
                     val position = list.getposition(item)
                     MediaUtils.openList(activity, list, position)
@@ -270,7 +270,7 @@ object TvUtil {
         }
     }
 
-    fun showMediaDetail(activity: Context, mediaWrapper: AMediaWrapper) {
+    fun showMediaDetail(activity: Context, mediaWrapper: AbstractMediaWrapper) {
         val intent = Intent(activity, DetailsActivity::class.java)
         intent.putExtra("media", mediaWrapper)
         intent.putExtra("item", MediaItemDetails(mediaWrapper.title, mediaWrapper.artist, mediaWrapper.album, mediaWrapper.location, mediaWrapper.artworkURL))
@@ -284,11 +284,11 @@ object TvUtil {
         activity.startActivity(intent)
     }
 
-    private fun playAudioList(activity: Activity, array: Array<AMediaWrapper>, position: Int) {
+    private fun playAudioList(activity: Activity, array: Array<AbstractMediaWrapper>, position: Int) {
         playAudioList(activity, array.toList(), position)
     }
 
-    private fun playAudioList(activity: Activity, list: List<AMediaWrapper>, position: Int) {
+    private fun playAudioList(activity: Activity, list: List<AbstractMediaWrapper>, position: Int) {
         MediaUtils.openList(activity, list, position)
         val intent = Intent(activity, AudioPlayerActivity::class.java)
         activity.startActivity(intent)
@@ -302,7 +302,7 @@ object TvUtil {
                 context.startActivity(intent)
             }
             mediaLibraryItem.itemType == MediaLibraryItem.TYPE_MEDIA -> {
-                val list = ArrayList<AMediaWrapper>().apply { add(mediaLibraryItem as AMediaWrapper) }
+                val list = ArrayList<AbstractMediaWrapper>().apply { add(mediaLibraryItem as AbstractMediaWrapper) }
                 playAudioList(context, list, 0)
             }
             else -> {
@@ -319,7 +319,7 @@ object TvUtil {
     fun updateBackground(bm: BackgroundManager?, item: Any?) {
         if (bm === null || item === null) return
         if (item is MediaLibraryItem) AppScope.launch {
-            val crop = item.itemType != MediaLibraryItem.TYPE_MEDIA || (item as AMediaWrapper).type == AMediaWrapper.TYPE_AUDIO
+            val crop = item.itemType != MediaLibraryItem.TYPE_MEDIA || (item as AbstractMediaWrapper).type == AbstractMediaWrapper.TYPE_AUDIO
             val artworkMrl = item.artworkMrl
             if (!TextUtils.isEmpty(artworkMrl)) {
                 val blurred = withContext(Dispatchers.IO) {
@@ -365,10 +365,10 @@ object TvUtil {
             MediaLibraryItem.TYPE_ARTIST -> return R.drawable.ic_artist_big
             MediaLibraryItem.TYPE_GENRE -> return R.drawable.ic_genre_big
             MediaLibraryItem.TYPE_MEDIA -> {
-                val mw = mediaLibraryItem as AMediaWrapper
+                val mw = mediaLibraryItem as AbstractMediaWrapper
                 return when {
-                    mw.type == AMediaWrapper.TYPE_VIDEO -> R.drawable.ic_browser_video_big_normal
-                    else -> if (mw.type == AMediaWrapper.TYPE_DIR)
+                    mw.type == AbstractMediaWrapper.TYPE_VIDEO -> R.drawable.ic_browser_video_big_normal
+                    else -> if (mw.type == AbstractMediaWrapper.TYPE_DIR)
                         R.drawable.ic_menu_folder_big
                     else
                         R.drawable.ic_song_big
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/audioplayer/AudioPlayerActivity.kt b/vlc-android/src/org/videolan/vlc/gui/tv/audioplayer/AudioPlayerActivity.kt
index 7d8d222f15..e749e46480 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/audioplayer/AudioPlayerActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/audioplayer/AudioPlayerActivity.kt
@@ -38,7 +38,7 @@ import androidx.recyclerview.widget.DividerItemDecoration
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.tools.isStarted
 import org.videolan.vlc.R
 import org.videolan.vlc.databinding.TvAudioPlayerBinding
@@ -81,14 +81,14 @@ class AudioPlayerActivity : BaseTvActivity() {
         binding.lifecycleOwner = this
         model = ViewModelProviders.of(this).get(PlaylistModel::class.java)
         binding.progress = model.progress
-        model.dataset.observe(this, Observer<List<AMediaWrapper>> { mediaWrappers ->
+        model.dataset.observe(this, Observer<List<AbstractMediaWrapper>> { mediaWrappers ->
             if (mediaWrappers != null) {
                 adapter.setSelection(-1)
                 adapter.update(mediaWrappers)
             }
         })
         model.playerState.observe(this, Observer { playerState -> update(playerState) })
-        val medialist = intent.getParcelableArrayListExtra<AMediaWrapper>(MEDIA_LIST)
+        val medialist = intent.getParcelableArrayListExtra<AbstractMediaWrapper>(MEDIA_LIST)
         val position = intent.getIntExtra(MEDIA_POSITION, 0)
         if (medialist != null) MediaUtils.openList(this, medialist, position)
         playToPause = AnimatedVectorDrawableCompat.create(this, R.drawable.anim_play_pause)!!
@@ -110,7 +110,7 @@ class AudioPlayerActivity : BaseTvActivity() {
         wasPlaying = state.playing
 
         val mw = model.currentMediaWrapper
-        if (mw != null && !mw.hasFlag(AMediaWrapper.MEDIA_FORCE_AUDIO) && model.canSwitchToVideo()) {
+        if (mw != null && !mw.hasFlag(AbstractMediaWrapper.MEDIA_FORCE_AUDIO) && model.canSwitchToVideo()) {
             model.switchToVideo()
             finish()
             return
@@ -235,7 +235,7 @@ class AudioPlayerActivity : BaseTvActivity() {
         if (shuffle)
             Collections.shuffle(medias)
         else
-            Collections.sort(medias, MediaComparators.byTrackNumber)
+            Collections.sort(medias, MediaComparators.BY_TRACK_NUMBER)
         model.load(medias, 0)
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/audioplayer/PlaylistAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/tv/audioplayer/PlaylistAdapter.kt
index 92406a28bc..2f644a3495 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/audioplayer/PlaylistAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/audioplayer/PlaylistAdapter.kt
@@ -25,7 +25,7 @@ import android.view.View
 import android.view.ViewGroup
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.R
 import org.videolan.vlc.databinding.TvSimpleListItemBinding
 import org.videolan.vlc.gui.DiffUtilAdapter
@@ -35,7 +35,7 @@ import org.videolan.vlc.util.Util
 @ExperimentalCoroutinesApi
 @ObsoleteCoroutinesApi
 class PlaylistAdapter
-internal constructor(private val audioPlayerActivity: AudioPlayerActivity) : DiffUtilAdapter<AMediaWrapper, PlaylistAdapter.ViewHolder>() {
+internal constructor(private val audioPlayerActivity: AudioPlayerActivity) : DiffUtilAdapter<AbstractMediaWrapper, PlaylistAdapter.ViewHolder>() {
     internal var selectedItem = -1
         private set
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/browser/BaseBrowserTvFragment.kt b/vlc-android/src/org/videolan/vlc/gui/tv/browser/BaseBrowserTvFragment.kt
index 582bdc0d9a..d2dcbce0fb 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/browser/BaseBrowserTvFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/browser/BaseBrowserTvFragment.kt
@@ -46,8 +46,8 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import kotlinx.android.synthetic.main.song_browser.*
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.R
@@ -112,7 +112,7 @@ abstract class BaseBrowserTvFragment : Fragment(), BrowserFragmentInterface, IEv
         calculateNbColumns()
 
         title.text = viewModel.currentItem?.let {
-            if (it is AMediaWrapper && it.uri.path == AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY) getString(R.string.internal_memory)
+            if (it is AbstractMediaWrapper && it.uri.path == AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY) getString(R.string.internal_memory)
             else it.title
         } ?: getTitle()
 
@@ -213,7 +213,7 @@ abstract class BaseBrowserTvFragment : Fragment(), BrowserFragmentInterface, IEv
     override fun refresh() = (viewModel as RefreshModel).refresh()
 
     override fun onLongClick(v: View, position: Int, item: MediaLibraryItem): Boolean {
-        if (item is AMediaWrapper) {
+        if (item is AbstractMediaWrapper) {
             TvUtil.showMediaDetail(requireActivity(), item)
         }
         return true
@@ -255,35 +255,35 @@ abstract class BaseBrowserTvFragment : Fragment(), BrowserFragmentInterface, IEv
         animationDelegate.collapseExtendedFAB()
         when (item.itemId) {
             R.id.ml_menu_sortby_name -> {
-                sortBy(AMedialibrary.SORT_ALPHA)
+                sortBy(AbstractMedialibrary.SORT_ALPHA)
                 return true
             }
             R.id.ml_menu_sortby_filename -> {
-                sortBy(AMedialibrary.SORT_FILENAME)
+                sortBy(AbstractMedialibrary.SORT_FILENAME)
                 return true
             }
             R.id.ml_menu_sortby_length -> {
-                sortBy(AMedialibrary.SORT_DURATION)
+                sortBy(AbstractMedialibrary.SORT_DURATION)
                 return true
             }
             R.id.ml_menu_sortby_date -> {
-                sortBy(AMedialibrary.SORT_RELEASEDATE)
+                sortBy(AbstractMedialibrary.SORT_RELEASEDATE)
                 return true
             }
             R.id.ml_menu_sortby_last_modified -> {
-                sortBy(AMedialibrary.SORT_LASTMODIFICATIONDATE)
+                sortBy(AbstractMedialibrary.SORT_LASTMODIFICATIONDATE)
                 return true
             }
             R.id.ml_menu_sortby_artist_name -> {
-                sortBy(AMedialibrary.SORT_ARTIST)
+                sortBy(AbstractMedialibrary.SORT_ARTIST)
                 return true
             }
             R.id.ml_menu_sortby_album_name -> {
-                sortBy(AMedialibrary.SORT_ALBUM)
+                sortBy(AbstractMedialibrary.SORT_ALBUM)
                 return true
             }
             R.id.ml_menu_sortby_number -> {
-                sortBy(AMedialibrary.SORT_FILESIZE)
+                sortBy(AbstractMedialibrary.SORT_FILESIZE)
                 return super.onOptionsItemSelected(item)
             }
             else -> return super.onOptionsItemSelected(item)
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/browser/BaseTvActivity.kt b/vlc-android/src/org/videolan/vlc/gui/tv/browser/BaseTvActivity.kt
index 5df35a403b..538ab43587 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/browser/BaseTvActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/browser/BaseTvActivity.kt
@@ -34,7 +34,7 @@ import android.widget.TextView
 import androidx.fragment.app.FragmentActivity
 import androidx.lifecycle.Observer
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.tools.KeyHelper
 import org.videolan.vlc.*
 import org.videolan.vlc.gui.helpers.UiTools
@@ -49,7 +49,7 @@ private const val TAG = "VLC/BaseTvActivity"
 @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
 abstract class BaseTvActivity : FragmentActivity(), CoroutineScope by MainScope() {
 
-    private lateinit var mediaLibrary: AMedialibrary
+    private lateinit var mediaLibrary: AbstractMedialibrary
     private lateinit var settings: SharedPreferences
     @Volatile
     private var currentlyVisible = false
@@ -106,7 +106,7 @@ abstract class BaseTvActivity : FragmentActivity(), CoroutineScope by MainScope(
 
     private fun registerLiveData() {
         MediaParsingService.progress.observe(this, Observer { scanProgress -> if (scanProgress != null) onParsingServiceProgress(scanProgress) })
-        AMedialibrary.getState().observe(this, Observer { started ->
+        AbstractMedialibrary.getState().observe(this, Observer { started ->
             if (started == null) return@Observer
             if (started)
                 onParsingServiceStarted()
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/browser/CategoriesFragment.kt b/vlc-android/src/org/videolan/vlc/gui/tv/browser/CategoriesFragment.kt
index 879c007d4c..3d675e0aa7 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/browser/CategoriesFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/browser/CategoriesFragment.kt
@@ -32,7 +32,7 @@ import androidx.leanback.app.BackgroundManager
 import androidx.leanback.app.BrowseSupportFragment
 import androidx.leanback.widget.*
 import androidx.lifecycle.Observer
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.R
 import org.videolan.vlc.gui.tv.CardPresenter
@@ -86,15 +86,15 @@ open class CategoriesFragment<T : BaseModel<out MediaLibraryItem>> : BrowseSuppo
     private var currentArt : String? = null
     override fun onItemSelected(itemViewHolder: Presenter.ViewHolder?, item: Any?, rowViewHolder: RowPresenter.ViewHolder?, row: Row?) {
         if (item === null) return
-        selecteditem = item as AMediaWrapper
+        selecteditem = item as AbstractMediaWrapper
         if (currentArt == item.artworkMrl) return
         currentArt = item.artworkMrl
         TvUtil.updateBackground(backgroundManager, item)
     }
 
     override fun onItemClicked(viewHolder: Presenter.ViewHolder, item: Any, viewHolder1: RowPresenter.ViewHolder, row: Row) {
-        val media = item as AMediaWrapper
-        if (media.type == AMediaWrapper.TYPE_DIR) TvUtil.browseFolder(requireActivity(), getCategoryId(), item.uri)
+        val media = item as AbstractMediaWrapper
+        if (media.type == AbstractMediaWrapper.TYPE_DIR) TvUtil.browseFolder(requireActivity(), getCategoryId(), item.uri)
         else TvUtil.openMedia(requireActivity(), item, viewModel)
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/browser/DirectoryBrowserFragment.kt b/vlc-android/src/org/videolan/vlc/gui/tv/browser/DirectoryBrowserFragment.kt
index bf17504829..086b8805e2 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/browser/DirectoryBrowserFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/browser/DirectoryBrowserFragment.kt
@@ -31,7 +31,7 @@ import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProviders
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.ExternalMonitor
 import org.videolan.vlc.util.UPDATE_DESCRIPTION
@@ -74,7 +74,7 @@ class DirectoryBrowserFragment : MediaSortedFragment<BrowserModel>() {
     }
 
     override fun onItemClicked(viewHolder: Presenter.ViewHolder, item: Any, viewHolder1: RowPresenter.ViewHolder, row: Row) {
-        if (item is AMediaWrapper && item.type == AMediaWrapper.TYPE_DIR) viewModel.saveList(item)
+        if (item is AbstractMediaWrapper && item.type == AbstractMediaWrapper.TYPE_DIR) viewModel.saveList(item)
         super.onItemClicked(viewHolder, item, viewHolder1, row)
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/browser/FileBrowserTvFragment.kt b/vlc-android/src/org/videolan/vlc/gui/tv/browser/FileBrowserTvFragment.kt
index 14801978c6..8ad3d942d5 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/browser/FileBrowserTvFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/browser/FileBrowserTvFragment.kt
@@ -10,8 +10,8 @@ import androidx.recyclerview.widget.RecyclerView
 import kotlinx.android.synthetic.main.song_browser.*
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.R
@@ -60,7 +60,7 @@ class FileBrowserTvFragment : BaseBrowserTvFragment() {
         super.onCreate(savedInstanceState)
         item = if (savedInstanceState != null) savedInstanceState.getParcelable<Parcelable>(ITEM) as? MediaLibraryItem
         else arguments?.getParcelable(ITEM) as? MediaLibraryItem
-        viewModel = getBrowserModel(getCategory(), (item as? AMediaWrapper)?.location, true, false)
+        viewModel = getBrowserModel(getCategory(), (item as? AbstractMediaWrapper)?.location, true, false)
 
         viewModel.currentItem = item
 
@@ -69,7 +69,7 @@ class FileBrowserTvFragment : BaseBrowserTvFragment() {
             if (BuildConfig.DEBUG) Log.d("FileBrowserTvFragment", "Submit lis of ${items.size} items")
 
             //headers
-            val nbColumns = if ((viewModel as BrowserModel).sort == AMedialibrary.SORT_ALPHA || (viewModel as BrowserModel).sort == AMedialibrary.SORT_DEFAULT) 9 else 1
+            val nbColumns = if ((viewModel as BrowserModel).sort == AbstractMedialibrary.SORT_ALPHA || (viewModel as BrowserModel).sort == AbstractMedialibrary.SORT_DEFAULT) 9 else 1
 
             headerList.layoutManager = GridLayoutManager(requireActivity(), nbColumns)
             headerAdapter.sortType = (viewModel as BrowserModel).sort
@@ -116,14 +116,14 @@ class FileBrowserTvFragment : BaseBrowserTvFragment() {
     private fun getCategory() = arguments?.getInt(CATEGORY, TYPE_FILE) ?: TYPE_FILE
 
     override fun onClick(v: View, position: Int, item: MediaLibraryItem) {
-        val mediaWrapper = item as AMediaWrapper
+        val mediaWrapper = item as AbstractMediaWrapper
 
-        mediaWrapper.removeFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
-        if (mediaWrapper.type == AMediaWrapper.TYPE_DIR) browse(mediaWrapper, true)
+        mediaWrapper.removeFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
+        if (mediaWrapper.type == AbstractMediaWrapper.TYPE_DIR) browse(mediaWrapper, true)
         else TvUtil.openMedia(requireActivity(), item, viewModel as BrowserModel)
     }
 
-    fun browse(media: AMediaWrapper, save: Boolean) {
+    fun browse(media: AbstractMediaWrapper, save: Boolean) {
         val ctx = activity
         if (ctx == null || !isResumed || isRemoving) return
         val ft = ctx.supportFragmentManager.beginTransaction()
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/browser/MediaBrowserTvFragment.kt b/vlc-android/src/org/videolan/vlc/gui/tv/browser/MediaBrowserTvFragment.kt
index d35b93a26e..631b77a5ff 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/browser/MediaBrowserTvFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/browser/MediaBrowserTvFragment.kt
@@ -9,8 +9,8 @@ import kotlinx.android.synthetic.main.song_browser.*
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.launch
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.R
 import org.videolan.vlc.gui.tv.MediaTvItemAdapter
@@ -67,7 +67,7 @@ class MediaBrowserTvFragment : BaseBrowserTvFragment() {
             submitList(items)
 
             //headers
-            val nbColumns = if ((viewModel as MediaBrowserViewModel).sort == AMedialibrary.SORT_ALPHA || (viewModel as MediaBrowserViewModel).sort == AMedialibrary.SORT_DEFAULT) 9 else 1
+            val nbColumns = if ((viewModel as MediaBrowserViewModel).sort == AbstractMedialibrary.SORT_ALPHA || (viewModel as MediaBrowserViewModel).sort == AbstractMedialibrary.SORT_DEFAULT) 9 else 1
 
             headerList.layoutManager = GridLayoutManager(requireActivity(), nbColumns)
             headerAdapter.sortType = (viewModel as MediaBrowserViewModel).sort
@@ -89,7 +89,7 @@ class MediaBrowserTvFragment : BaseBrowserTvFragment() {
     override fun onClick(v: View, position: Int, item: MediaLibraryItem) {
         launch {
             if ((viewModel as MediaBrowserViewModel).category == CATEGORY_VIDEOS && !Settings.getInstance(requireContext()).getBoolean(FORCE_PLAY_ALL, true)) {
-                TvUtil.playMedia(requireActivity(), item as AMediaWrapper)
+                TvUtil.playMedia(requireActivity(), item as AbstractMediaWrapper)
             } else {
                 TvUtil.openMediaFromPaged(requireActivity(), item, viewModel.provider as MedialibraryProvider<out MediaLibraryItem>)
             }
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/browser/NetworkBrowserFragment.kt b/vlc-android/src/org/videolan/vlc/gui/tv/browser/NetworkBrowserFragment.kt
index f3439e580b..5d76d8b386 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/browser/NetworkBrowserFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/browser/NetworkBrowserFragment.kt
@@ -36,7 +36,7 @@ import androidx.lifecycle.ViewModelProviders
 import androidx.localbroadcastmanager.content.LocalBroadcastManager
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.ExternalMonitor
 import org.videolan.vlc.VLCApplication
@@ -98,7 +98,7 @@ class NetworkBrowserFragment : MediaSortedFragment<NetworkModel>() {
     }
 
     override fun onItemClicked(viewHolder: Presenter.ViewHolder, item: Any, viewHolder1: RowPresenter.ViewHolder, row: Row) {
-        if (item is AMediaWrapper && item.type == AMediaWrapper.TYPE_DIR) viewModel.saveList(item)
+        if (item is AbstractMediaWrapper && item.type == AbstractMediaWrapper.TYPE_DIR) viewModel.saveList(item)
         super.onItemClicked(viewHolder, item, viewHolder1, row)
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/browser/VerticalGridActivity.kt b/vlc-android/src/org/videolan/vlc/gui/tv/browser/VerticalGridActivity.kt
index d117a2007c..fcc81a1037 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/browser/VerticalGridActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/browser/VerticalGridActivity.kt
@@ -68,11 +68,11 @@ class VerticalGridActivity : BaseTvActivity(), BrowserActivityInterface {
                 var uri = intent.data
                 if (uri == null) uri = intent.getParcelableExtra(KEY_URI)
 
-                val item = if (uri == null) null else MLServiceLocator.getAMediaWrapper(uri)
+                val item = if (uri == null) null else MLServiceLocator.getAbstractMediaWrapper(uri)
 
                 fragment = FileBrowserTvFragment.newInstance(TYPE_NETWORK, item)
             } else if (type == HEADER_DIRECTORIES) {
-                fragment = FileBrowserTvFragment.newInstance(TYPE_FILE, intent.data?.let { MLServiceLocator.getAMediaWrapper(it) })
+                fragment = FileBrowserTvFragment.newInstance(TYPE_FILE, intent.data?.let { MLServiceLocator.getAbstractMediaWrapper(it) })
             } else {
                 finish()
                 return
diff --git a/vlc-android/src/org/videolan/vlc/gui/video/PopupManager.kt b/vlc-android/src/org/videolan/vlc/gui/video/PopupManager.kt
index dd1e40a327..c395329f20 100644
--- a/vlc-android/src/org/videolan/vlc/gui/video/PopupManager.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/video/PopupManager.kt
@@ -39,7 +39,7 @@ import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.IVLCVout
 import org.videolan.libvlc.Media
 import org.videolan.libvlc.MediaPlayer
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.PlaybackService
 import org.videolan.vlc.R
 import org.videolan.vlc.gui.view.PopupLayout
@@ -221,7 +221,7 @@ class PopupManager constructor(private val mService: PlaybackService) : Playback
     private fun expandToVideoPlayer() {
         removePopup()
         if (mService.hasMedia() && !mService.isPlaying)
-            mService.currentMediaWrapper!!.flags = AMediaWrapper.MEDIA_PAUSED
+            mService.currentMediaWrapper!!.flags = AbstractMediaWrapper.MEDIA_PAUSED
         mService.switchToVideo()
     }
 
diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.kt b/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.kt
index 7cfba8f3d5..e79be8d35f 100644
--- a/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.kt
@@ -38,9 +38,9 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.launch
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AFolder
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractFolder
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.tools.MultiSelectHelper
 import org.videolan.vlc.R
@@ -70,10 +70,10 @@ private const val UNSET_REFRESHING = 16
 
 @ObsoleteCoroutinesApi
 @ExperimentalCoroutinesApi
-class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshLayout.OnRefreshListener, IEventsHandler, Observer<PagedList<AMediaWrapper>>, CtxActionReceiver {
+class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshLayout.OnRefreshListener, IEventsHandler, Observer<PagedList<AbstractMediaWrapper>>, CtxActionReceiver {
 
     private lateinit var videoListAdapter: VideoListAdapter
-    private lateinit var multiSelectHelper: MultiSelectHelper<AMediaWrapper>
+    private lateinit var multiSelectHelper: MultiSelectHelper<AbstractMediaWrapper>
     private lateinit var binding: VideoGridBinding
     private var gridItemDecoration: RecyclerView.ItemDecoration? = null
 
@@ -105,7 +105,7 @@ class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshL
             val seenMarkVisible = preferences.getBoolean("media_seen", true)
             videoListAdapter = VideoListAdapter(this, seenMarkVisible)
             multiSelectHelper = videoListAdapter.multiSelectHelper
-            val folder = if (savedInstanceState != null ) savedInstanceState.getParcelable<AFolder>(KEY_FOLDER)
+            val folder = if (savedInstanceState != null ) savedInstanceState.getParcelable<AbstractFolder>(KEY_FOLDER)
             else arguments?.getParcelable(KEY_FOLDER)
             viewModel = getViewModel(folder)
             viewModel.provider.pagedList.observe(this, this)
@@ -178,8 +178,8 @@ class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshL
         videoListAdapter.release()
     }
 
-    override fun onChanged(list: PagedList<AMediaWrapper>?) {
-        videoListAdapter.showFilename(viewModel.sort == AMedialibrary.SORT_FILENAME)
+    override fun onChanged(list: PagedList<AbstractMediaWrapper>?) {
+        videoListAdapter.showFilename(viewModel.sort == AbstractMedialibrary.SORT_FILENAME)
         if (list != null) videoListAdapter.submitList(list)
     }
 
@@ -210,14 +210,14 @@ class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshL
     }
 
 
-    private fun playVideo(media: AMediaWrapper, fromStart: Boolean) {
-        media.removeFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
-        if (fromStart) media.addFlags(AMediaWrapper.MEDIA_FROM_START)
+    private fun playVideo(media: AbstractMediaWrapper, fromStart: Boolean) {
+        media.removeFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
+        if (fromStart) media.addFlags(AbstractMediaWrapper.MEDIA_FROM_START)
         MediaUtils.openMedia(requireContext(), media)
     }
 
-    private fun playAudio(media: AMediaWrapper) {
-        media.addFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
+    private fun playAudio(media: AbstractMediaWrapper) {
+        media.addFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
         MediaUtils.openMedia(activity, media)
     }
 
@@ -270,7 +270,7 @@ class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshL
     }
 
     override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
-        val list = ArrayList<AMediaWrapper>()
+        val list = ArrayList<AbstractMediaWrapper>()
         for (mw in multiSelectHelper.getSelection()) {
             list.add(mw)
         }
@@ -285,7 +285,7 @@ class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshL
                 //                break;
                 R.id.action_video_download_subtitles -> MediaUtils.getSubs(requireActivity(), list)
                 R.id.action_video_play_audio -> {
-                    for (media in list) media.addFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
+                    for (media in list) media.addFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
                     MediaUtils.openList(activity, list, 0)
                 }
                 R.id.action_mode_audio_add_playlist -> UiTools.addToPlaylist(requireActivity(), list)
@@ -307,13 +307,13 @@ class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshL
     }
 
     override fun onClick(v: View, position: Int, item: MediaLibraryItem) {
-        val media = item as AMediaWrapper
+        val media = item as AbstractMediaWrapper
         if (actionMode != null) {
             multiSelectHelper.toggleSelection(position)
             invalidateActionMode()
             return
         }
-        media.removeFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
+        media.removeFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
         val settings = Settings.getInstance(v.context)
         if (settings.getBoolean(FORCE_PLAY_ALL, false)) {
             MediaUtils.playAll(requireContext(), viewModel.provider, position, false)
@@ -332,8 +332,8 @@ class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshL
     override fun onImageClick(v: View, position: Int, item: MediaLibraryItem) {}
 
     override fun onCtxClick(v: View, position: Int, item: MediaLibraryItem) {
-        val mw = item as AMediaWrapper
-        val group = mw.type == AMediaWrapper.TYPE_GROUP
+        val mw = item as AbstractMediaWrapper
+        val group = mw.type == AbstractMediaWrapper.TYPE_GROUP
         var flags = if (group) CTX_VIDEO_GOUP_FLAGS else CTX_VIDEO_FLAGS
         if (mw.time != 0L && !group) flags = flags or CTX_PLAY_FROM_START
         if (actionMode == null)
diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.kt
index 1905515b5c..1ee3861229 100644
--- a/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.kt
@@ -39,9 +39,9 @@ import androidx.paging.PagedListAdapter
 import androidx.recyclerview.widget.DiffUtil
 import androidx.recyclerview.widget.GridLayoutManager
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.tools.MultiSelectAdapter
 import org.videolan.tools.MultiSelectHelper
 import org.videolan.vlc.BR
@@ -57,7 +57,7 @@ private const val TAG = "VLC/VideoListAdapter"
 class VideoListAdapter internal constructor(
         private val mEventsHandler: IEventsHandler,
         private var mIsSeenMediaMarkerVisible: Boolean
-) : PagedListAdapter<AMediaWrapper, VideoListAdapter.ViewHolder>(VideoItemDiffCallback), MultiSelectAdapter<AMediaWrapper> {
+) : PagedListAdapter<AbstractMediaWrapper, VideoListAdapter.ViewHolder>(VideoItemDiffCallback), MultiSelectAdapter<AbstractMediaWrapper> {
 
     var isListMode = false
     private var gridCardWidth = 0
@@ -65,7 +65,7 @@ class VideoListAdapter internal constructor(
 
     val multiSelectHelper = MultiSelectHelper(this, UPDATE_SELECTION)
 
-    private val thumbObs = Observer<AMediaWrapper> { media ->
+    private val thumbObs = Observer<AbstractMediaWrapper> { media ->
         val position = currentList?.snapshot()?.indexOf(media) ?: return@Observer
         getItem(position)?.run {
             artworkURL = media.artworkURL
@@ -74,14 +74,14 @@ class VideoListAdapter internal constructor(
     }
 
     init {
-        AMedialibrary.lastThumb.observeForever(thumbObs)
+        AbstractMedialibrary.lastThumb.observeForever(thumbObs)
     }
 
     fun release() {
-        AMedialibrary.lastThumb.removeObserver(thumbObs)
+        AbstractMedialibrary.lastThumb.removeObserver(thumbObs)
     }
 
-    val all: List<AMediaWrapper>
+    val all: List<AbstractMediaWrapper>
         get() = currentList?.snapshot() ?: emptyList()
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
@@ -130,21 +130,21 @@ class VideoListAdapter internal constructor(
         return position in 0..(itemCount - 1)
     }
 
-//    operator fun contains(mw: AMediaWrapper): Boolean {
+//    operator fun contains(mw: AbstractMediaWrapper): Boolean {
 //        return getDataset().indexOf(mw) !== -1
 //    }
 
     @MainThread
     fun clear() {}
 
-    private fun fillView(holder: ViewHolder, media: AMediaWrapper) {
+    private fun fillView(holder: ViewHolder, media: AbstractMediaWrapper) {
         val text: String?
         val resolution = generateResolutionClass(media.width, media.height)
         var max = 0
         var progress = 0
         var seen = 0L
 
-        text = if (media.type == AMediaWrapper.TYPE_GROUP) {
+        text = if (media.type == AbstractMediaWrapper.TYPE_GROUP) {
             media.description
         } else {
             seen = if (mIsSeenMediaMarkerVisible) media.seen else 0L
@@ -214,22 +214,22 @@ class VideoListAdapter internal constructor(
         override fun isSelected() = multiSelectHelper.isSelected(layoutPosition)
     }
 
-    override fun onCurrentListChanged(previousList: PagedList<AMediaWrapper>?, currentList: PagedList<AMediaWrapper>?) {
+    override fun onCurrentListChanged(previousList: PagedList<AbstractMediaWrapper>?, currentList: PagedList<AbstractMediaWrapper>?) {
         mEventsHandler.onUpdateFinished(this)
     }
 
-    private object VideoItemDiffCallback : DiffUtil.ItemCallback<AMediaWrapper>() {
-        override fun areItemsTheSame(oldItem: AMediaWrapper, newItem: AMediaWrapper): Boolean {
+    private object VideoItemDiffCallback : DiffUtil.ItemCallback<AbstractMediaWrapper>() {
+        override fun areItemsTheSame(oldItem: AbstractMediaWrapper, newItem: AbstractMediaWrapper): Boolean {
             return oldItem === newItem || oldItem.type == newItem.type && oldItem.equals(newItem)
         }
 
-        override fun areContentsTheSame(oldItem: AMediaWrapper, newItem: AMediaWrapper): Boolean {
+        override fun areContentsTheSame(oldItem: AbstractMediaWrapper, newItem: AbstractMediaWrapper): Boolean {
             return oldItem === newItem || (oldItem.displayTime == newItem.displayTime
                     && TextUtils.equals(oldItem.artworkMrl, newItem.artworkMrl)
                     && oldItem.seen == newItem.seen)
         }
 
-        override fun getChangePayload(oldItem: AMediaWrapper, newItem: AMediaWrapper) = when {
+        override fun getChangePayload(oldItem: AbstractMediaWrapper, newItem: AbstractMediaWrapper) = when {
             oldItem.displayTime != newItem.displayTime -> UPDATE_TIME
             !TextUtils.equals(oldItem.artworkMrl, newItem.artworkMrl) -> UPDATE_THUMB
             else -> UPDATE_SEEN
diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
index 4d0c880f9d..7820946ba6 100644
--- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
@@ -81,10 +81,10 @@ import org.videolan.libvlc.RendererItem
 import org.videolan.libvlc.util.AndroidUtil
 import org.videolan.libvlc.util.DisplayManager
 import org.videolan.libvlc.util.VLCVideoLayout
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.MLServiceLocator
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.tools.*
 import org.videolan.vlc.*
 import org.videolan.vlc.database.models.ExternalSub
@@ -116,7 +116,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
     private val controlsConstraintSetPortrait = ConstraintSet()
     private val controlsConstraintSetLandscape = ConstraintSet()
     var service: PlaybackService? = null
-    private lateinit var medialibrary: AMedialibrary
+    private lateinit var medialibrary: AbstractMedialibrary
     private var videoLayout: VLCVideoLayout? = null
     lateinit var displayManager: DisplayManager
     private var rootView: View? = null
@@ -232,7 +232,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
             return if (AndroidUtil.isLolliPopOrLater) pm.isInteractive else pm.isScreenOn
         }
 
-    private val playlistObserver = Observer<List<AMediaWrapper>> { mediaWrappers -> if (mediaWrappers != null) playlistAdapter!!.update(mediaWrappers) }
+    private val playlistObserver = Observer<List<AbstractMediaWrapper>> { mediaWrappers -> if (mediaWrappers != null) playlistAdapter!!.update(mediaWrappers) }
 
     private var addNextTrack = false
 
@@ -627,7 +627,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
             if (Permissions.canDrawOverlays(this)) {
                 switchingView = true
                 switchToPopup = true
-                if (service?.isPlaying != true) mw.addFlags(AMediaWrapper.MEDIA_PAUSED)
+                if (service?.isPlaying != true) mw.addFlags(AbstractMediaWrapper.MEDIA_PAUSED)
                 cleanUI()
                 exitOK()
             } else
@@ -859,7 +859,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
                 if (switchToPopup)
                     switchToPopup(currentMediaPosition)
                 else {
-                    currentMediaWrapper!!.addFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
+                    currentMediaWrapper!!.addFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
                     showWithoutParse(currentMediaPosition)
                 }
                 return
@@ -1476,14 +1476,14 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
                         if (event.esChangedType == Media.Track.Type.Audio) {
                             setESTrackLists()
                             runIO(Runnable {
-                                val audioTrack = media.getMetaLong(AMediaWrapper.META_AUDIOTRACK).toInt()
+                                val audioTrack = media.getMetaLong(AbstractMediaWrapper.META_AUDIOTRACK).toInt()
                                 if (audioTrack != 0 || currentAudioTrack != -2)
                                     service.setAudioTrack(if (media.id == 0L) currentAudioTrack else audioTrack)
                             })
                         } else if (event.esChangedType == Media.Track.Type.Text) {
                             setESTrackLists()
                             runIO(Runnable {
-                                val spuTrack = media.getMetaLong(AMediaWrapper.META_SUBTITLE_TRACK).toInt()
+                                val spuTrack = media.getMetaLong(AbstractMediaWrapper.META_SUBTITLE_TRACK).toInt()
                                 if (addNextTrack) {
                                     val tracks = service.spuTracks
                                     if (!Util.isArrayEmpty(tracks as Array<MediaPlayer.TrackDescription>)) service!!.setSpuTrack(tracks[tracks.size - 1].id)
@@ -1534,10 +1534,10 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
         stopLoading()
         updateOverlayPausePlay()
         updateNavStatus()
-        if (!mw.hasFlag(AMediaWrapper.MEDIA_PAUSED))
+        if (!mw.hasFlag(AbstractMediaWrapper.MEDIA_PAUSED))
             handler.sendEmptyMessageDelayed(FADE_OUT, OVERLAY_TIMEOUT.toLong())
         else {
-            mw.removeFlags(AMediaWrapper.MEDIA_PAUSED)
+            mw.removeFlags(AbstractMediaWrapper.MEDIA_PAUSED)
             wasPaused = false
         }
         setESTracks()
@@ -1712,7 +1712,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
     }
 
 
-    override fun onPopupMenu(view: View, position: Int, item: AMediaWrapper?) {
+    override fun onPopupMenu(view: View, position: Int, item: AbstractMediaWrapper?) {
         val popupMenu = PopupMenu(this, view)
         popupMenu.menuInflater.inflate(R.menu.audio_player, popupMenu.menu)
 
@@ -1729,7 +1729,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
 
     override fun onSelectionSet(position: Int) = playlist.scrollToPosition(position)
 
-    override fun playItem(position: Int, item: AMediaWrapper) {
+    override fun playItem(position: Int, item: AbstractMediaWrapper) {
         service?.playIndex(position)
     }
 
@@ -1868,7 +1868,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
                                 service.setAudioTrack(trackID)
                                 runIO(Runnable {
                                     val mw = medialibrary.findMedia(service.currentMediaWrapper)
-                                    if (mw != null && mw.id != 0L) mw.setLongMeta(AMediaWrapper.META_AUDIOTRACK, trackID.toLong())
+                                    if (mw != null && mw.id != 0L) mw.setLongMeta(AbstractMediaWrapper.META_AUDIOTRACK, trackID.toLong())
                                 })
                             }
                         }
@@ -1907,7 +1907,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
     private fun setSpuTrack(trackID: Int) {
         runOnMainThread(Runnable { service?.setSpuTrack(trackID) })
         val mw = medialibrary.findMedia(service?.currentMediaWrapper) ?: return
-        if (mw.id != 0L) mw.setLongMeta(AMediaWrapper.META_SUBTITLE_TRACK, trackID.toLong())
+        if (mw.id != 0L) mw.setLongMeta(AbstractMediaWrapper.META_SUBTITLE_TRACK, trackID.toLong())
     }
 
     private fun showNavMenu() {
@@ -2433,13 +2433,13 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
             if (startTime == 0L && savedTime > 0L) startTime = savedTime
             val restorePlayback = hasMedia && currentMedia!!.uri == videoUri
 
-            var openedMedia: AMediaWrapper? = null
+            var openedMedia: AbstractMediaWrapper? = null
             val resumePlaylist = service.isValidIndex(positionInPlaylist)
             val continueplayback = isPlaying && (restorePlayback || positionInPlaylist == service.currentMediaPosition)
             if (resumePlaylist) {
                 // Provided externally from AudioService
                 if (BuildConfig.DEBUG) Log.d(TAG, "Continuing playback from PlaybackService at index $positionInPlaylist")
-                openedMedia = service.medias[positionInPlaylist]
+                openedMedia = service.media[positionInPlaylist]
 //            if (openedMedia == null) {
 //                encounteredError()
 //                return
@@ -2449,7 +2449,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
                 updatePausable(service.isPausable)
             }
             if (videoUri != null) {
-                var media: AMediaWrapper? = null
+                var media: AbstractMediaWrapper? = null
                 if (!continueplayback) {
                     if (!resumePlaylist) {
                         // restore last position
@@ -2460,7 +2460,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
                             media = medialibrary.getMedia(videoUri!!)
                         }
                         if (media != null && media.id != 0L && media.time == 0L)
-                            media.time = media.getMetaLong(AMediaWrapper.META_PROGRESS)
+                            media.time = media.getMetaLong(AbstractMediaWrapper.META_PROGRESS)
                     } else
                         media = openedMedia
                     if (media != null) {
@@ -2497,14 +2497,14 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
                 // Start playback & seek
                 /* prepare playback */
                 val medialoaded = media != null
-                if (!medialoaded) media = if (hasMedia) currentMedia else MLServiceLocator.getAMediaWrapper(videoUri!!)
+                if (!medialoaded) media = if (hasMedia) currentMedia else MLServiceLocator.getAbstractMediaWrapper(videoUri!!)
                 if (wasPaused)
-                    media!!.addFlags(AMediaWrapper.MEDIA_PAUSED)
+                    media!!.addFlags(AbstractMediaWrapper.MEDIA_PAUSED)
                 if (intent.hasExtra(PLAY_DISABLE_HARDWARE))
-                    media!!.addFlags(AMediaWrapper.MEDIA_NO_HWACCEL)
-                media!!.removeFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
-                media.addFlags(AMediaWrapper.MEDIA_VIDEO)
-                if (fromStart) media.addFlags(AMediaWrapper.MEDIA_FROM_START)
+                    media!!.addFlags(AbstractMediaWrapper.MEDIA_NO_HWACCEL)
+                media!!.removeFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
+                media.addFlags(AbstractMediaWrapper.MEDIA_VIDEO)
+                if (fromStart) media.addFlags(AbstractMediaWrapper.MEDIA_FROM_START)
 
                 // Set resume point
                 if (!continueplayback && !fromStart) {
@@ -2848,7 +2848,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle
             context.startActivity(intent)
         }
 
-        fun getIntent(action: String, mw: AMediaWrapper, fromStart: Boolean, openedPosition: Int): Intent {
+        fun getIntent(action: String, mw: AbstractMediaWrapper, fromStart: Boolean, openedPosition: Int): Intent {
             return getIntent(action, VLCApplication.appContext, mw.uri, mw.title, fromStart, openedPosition)
         }
 
diff --git a/vlc-android/src/org/videolan/vlc/interfaces/Sortable.kt b/vlc-android/src/org/videolan/vlc/interfaces/Sortable.kt
index 76b7569d05..4a930f194d 100644
--- a/vlc-android/src/org/videolan/vlc/interfaces/Sortable.kt
+++ b/vlc-android/src/org/videolan/vlc/interfaces/Sortable.kt
@@ -3,7 +3,7 @@ package org.videolan.vlc.interfaces
 import android.view.MenuItem
 import android.view.View
 import android.widget.PopupMenu
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.R
 import org.videolan.vlc.viewmodels.BaseModel
@@ -29,11 +29,11 @@ interface Sortable : PopupMenu.OnMenuItemClickListener {
     override fun onMenuItemClick(item: MenuItem): Boolean {
         val vm = getVM()
         vm.sort(when (item.itemId) {
-            R.id.ml_menu_sortby_name -> AMedialibrary.SORT_ALPHA
-            R.id.ml_menu_sortby_filename -> AMedialibrary.SORT_FILENAME
-            R.id.ml_menu_sortby_length -> AMedialibrary.SORT_DURATION
-            R.id.ml_menu_sortby_last_modified -> AMedialibrary.SORT_LASTMODIFICATIONDATE
-            R.id.ml_menu_sortby_date -> AMedialibrary.SORT_RELEASEDATE
+            R.id.ml_menu_sortby_name -> AbstractMedialibrary.SORT_ALPHA
+            R.id.ml_menu_sortby_filename -> AbstractMedialibrary.SORT_FILENAME
+            R.id.ml_menu_sortby_length -> AbstractMedialibrary.SORT_DURATION
+            R.id.ml_menu_sortby_last_modified -> AbstractMedialibrary.SORT_LASTMODIFICATIONDATE
+            R.id.ml_menu_sortby_date -> AbstractMedialibrary.SORT_RELEASEDATE
             else -> return false
         })
         return true
diff --git a/vlc-android/src/org/videolan/vlc/media/MediaSessionBrowser.java b/vlc-android/src/org/videolan/vlc/media/MediaSessionBrowser.java
index 76a5ac49c4..1a292a7531 100644
--- a/vlc-android/src/org/videolan/vlc/media/MediaSessionBrowser.java
+++ b/vlc-android/src/org/videolan/vlc/media/MediaSessionBrowser.java
@@ -41,8 +41,8 @@ import android.support.v4.media.MediaDescriptionCompat;
 import androidx.annotation.NonNull;
 import androidx.annotation.WorkerThread;
 
-import org.videolan.medialibrary.interfaces.AMedialibrary;
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper;
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
 import org.videolan.medialibrary.media.MediaLibraryItem;
 import org.videolan.vlc.R;
 import org.videolan.vlc.VLCApplication;
@@ -207,30 +207,30 @@ public class MediaSessionBrowser implements ExtensionManagerService.ExtensionMan
                     return results;
                 case ID_LAST_ADDED:
                     limitSize = true;
-                    list = AMedialibrary.getInstance().getRecentAudio();
+                    list = AbstractMedialibrary.getInstance().getRecentAudio();
                     break;
                 case ID_HISTORY:
                     limitSize = true;
-                    list = AMedialibrary.getInstance().lastMediaPlayed();
+                    list = AbstractMedialibrary.getInstance().lastMediaPlayed();
                     break;
                 case ID_ARTISTS:
-                    list = AMedialibrary.getInstance().getArtists(Settings.INSTANCE.getInstance(context).getBoolean(SettingsKt.KEY_ARTISTS_SHOW_ALL, false));
+                    list = AbstractMedialibrary.getInstance().getArtists(Settings.INSTANCE.getInstance(context).getBoolean(SettingsKt.KEY_ARTISTS_SHOW_ALL, false));
                     break;
                 case ID_ALBUMS:
-                    list = AMedialibrary.getInstance().getAlbums();
+                    list = AbstractMedialibrary.getInstance().getAlbums();
                     break;
                 case ID_GENRES:
-                    list = AMedialibrary.getInstance().getGenres();
+                    list = AbstractMedialibrary.getInstance().getGenres();
                     break;
                 case ID_PLAYLISTS:
-                    list = AMedialibrary.getInstance().getPlaylists();
+                    list = AbstractMedialibrary.getInstance().getPlaylists();
                     break;
                 case ID_SONGS:
-                    list = AMedialibrary.getInstance().getAudio();
+                    list = AbstractMedialibrary.getInstance().getAudio();
                     break;
                 default:
                     String[] idSections = parentId.split("_");
-                    AMedialibrary ml = AMedialibrary.getInstance();
+                    AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
                     long id = Long.parseLong(idSections[1]);
                     switch (idSections[0]) {
                         case ARTIST_PREFIX:
@@ -244,7 +244,7 @@ public class MediaSessionBrowser implements ExtensionManagerService.ExtensionMan
             if (list != null) {
                 MediaDescriptionCompat.Builder item = new MediaDescriptionCompat.Builder();
                 for (MediaLibraryItem libraryItem : list) {
-                    if (libraryItem.getItemType() == MediaLibraryItem.TYPE_MEDIA && ((AMediaWrapper) libraryItem).getType() != AMediaWrapper.TYPE_AUDIO)
+                    if (libraryItem.getItemType() == MediaLibraryItem.TYPE_MEDIA && ((AbstractMediaWrapper) libraryItem).getType() != AbstractMediaWrapper.TYPE_AUDIO)
                         continue;
                     Bitmap cover = AudioUtil.INSTANCE.readCoverBitmap(Uri.decode(libraryItem.getArtworkMrl()), 256);
                     if (cover == null)
@@ -253,8 +253,8 @@ public class MediaSessionBrowser implements ExtensionManagerService.ExtensionMan
                             .setMediaId(generateMediaId(libraryItem));
                     item.setIconBitmap(cover);
                     if (libraryItem.getItemType() == MediaLibraryItem.TYPE_MEDIA) {
-                        item.setMediaUri(((AMediaWrapper) libraryItem).getUri())
-                                .setSubtitle(MediaUtils.INSTANCE.getMediaSubtitle((AMediaWrapper) libraryItem));
+                        item.setMediaUri(((AbstractMediaWrapper) libraryItem).getUri())
+                                .setSubtitle(MediaUtils.INSTANCE.getMediaSubtitle((AbstractMediaWrapper) libraryItem));
                     } else item.setSubtitle(libraryItem.getDescription());
                     boolean playable = libraryItem.getItemType() == MediaLibraryItem.TYPE_MEDIA ||
                             libraryItem.getItemType() == MediaLibraryItem.TYPE_ALBUM ||
diff --git a/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt b/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt
index d3184103e3..71408f8fbb 100644
--- a/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt
+++ b/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt
@@ -20,13 +20,13 @@ import kotlinx.coroutines.*
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.channels.actor
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.MLServiceLocator
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AAlbum
-import org.videolan.medialibrary.interfaces.media.AFolder
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
-import org.videolan.medialibrary.interfaces.media.APlaylist
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum
+import org.videolan.medialibrary.interfaces.media.AbstractFolder
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist
 import org.videolan.medialibrary.media.*
 import org.videolan.vlc.PlaybackService
 import org.videolan.vlc.R
@@ -47,7 +47,7 @@ private const val TAG = "VLC/MediaUtils"
 object MediaUtils : CoroutineScope {
     override val coroutineContext = Dispatchers.Main.immediate
 
-    fun getSubs(activity: FragmentActivity, mediaList: List<AMediaWrapper>) {
+    fun getSubs(activity: FragmentActivity, mediaList: List<AbstractMediaWrapper>) {
         if (activity is AppCompatActivity) showSubtitleDownloaderDialogFragment(activity, mediaList.map { it.uri })
         else {
             val intent = Intent(activity, DialogActivity::class.java).setAction(DialogActivity.KEY_SUBS_DL)
@@ -58,7 +58,7 @@ object MediaUtils : CoroutineScope {
         }
     }
 
-    fun getSubs(activity: FragmentActivity, media: AMediaWrapper) {
+    fun getSubs(activity: FragmentActivity, media: AbstractMediaWrapper) {
         getSubs(activity, listOf(media))
     }
 
@@ -79,7 +79,7 @@ object MediaUtils : CoroutineScope {
         })
     }
 
-    fun appendMedia(context: Context?, media: List<AMediaWrapper>?) {
+    fun appendMedia(context: Context?, media: List<AbstractMediaWrapper>?) {
         if (media == null || media.isEmpty() || context == null) return
         DialogCallback(context, object : DialogCallback.Runnable {
             override fun run(service: PlaybackService) {
@@ -93,13 +93,13 @@ object MediaUtils : CoroutineScope {
         })
     }
 
-    fun appendMedia(context: Context?, media: AMediaWrapper?) {
+    fun appendMedia(context: Context?, media: AbstractMediaWrapper?) {
         if (media != null) appendMedia(context, arrayListOf(media))
     }
 
-    fun appendMedia(context: Context, array: Array<AMediaWrapper>) = appendMedia(context, array.asList())
+    fun appendMedia(context: Context, array: Array<AbstractMediaWrapper>) = appendMedia(context, array.asList())
 
-    fun insertNext(context: Context?, media: Array<AMediaWrapper>?) {
+    fun insertNext(context: Context?, media: Array<AbstractMediaWrapper>?) {
         if (media == null || context == null) return
         DialogCallback(context, object : DialogCallback.Runnable {
             override fun run(service: PlaybackService) {
@@ -113,12 +113,12 @@ object MediaUtils : CoroutineScope {
         })
     }
 
-    fun insertNext(context: Context?, media: AMediaWrapper?) {
+    fun insertNext(context: Context?, media: AbstractMediaWrapper?) {
         if (media == null || context == null) return
         insertNext(context, arrayOf(media))
     }
 
-    fun openMedia(context: Context?, media: AMediaWrapper?) {
+    fun openMedia(context: Context?, media: AbstractMediaWrapper?) {
         if (media == null || context == null) return
         DialogCallback(context, object : DialogCallback.Runnable {
             override fun run(service: PlaybackService) {
@@ -132,9 +132,9 @@ object MediaUtils : CoroutineScope {
         openMediaNoUi(ctx, media)
     }
 
-    fun openMediaNoUi(uri: Uri) = openMediaNoUi(VLCApplication.appContext, MLServiceLocator.getAMediaWrapper(uri))
+    fun openMediaNoUi(uri: Uri) = openMediaNoUi(VLCApplication.appContext, MLServiceLocator.getAbstractMediaWrapper(uri))
 
-    fun openMediaNoUi(context: Context?, media: AMediaWrapper?) {
+    fun openMediaNoUi(context: Context?, media: AbstractMediaWrapper?) {
         if (media == null || context == null) return
         object : BaseCallBack(context) {
             override fun onChanged(service: PlaybackService?) {
@@ -150,19 +150,19 @@ object MediaUtils : CoroutineScope {
         openList(context, withContext(Dispatchers.IO) { item.tracks }.toList(), position)
     }
 
-    fun playAlbums(context: Context?, provider: MedialibraryProvider<AAlbum>, position: Int, shuffle: Boolean) {
+    fun playAlbums(context: Context?, provider: MedialibraryProvider<AbstractAlbum>, position: Int, shuffle: Boolean) {
         if (context == null) return
         SuspendDialogCallback(context) { service ->
             val count = withContext(Dispatchers.IO) { provider.getTotalCount() }
             when (count) {
                 0 -> null
                 in 1..MEDIALIBRARY_PAGE_SIZE -> withContext(Dispatchers.IO) {
-                    mutableListOf<AMediaWrapper>().apply {
+                    mutableListOf<AbstractMediaWrapper>().apply {
                         for (album in provider.getAll()) album.tracks?.let { addAll(it) }
                     }
                 }
                 else -> withContext(Dispatchers.IO) {
-                    mutableListOf<AMediaWrapper>().apply {
+                    mutableListOf<AbstractMediaWrapper>().apply {
                         var index = 0
                         while (index < count) {
                             val pageCount = min(MEDIALIBRARY_PAGE_SIZE, count - index)
@@ -179,11 +179,11 @@ object MediaUtils : CoroutineScope {
         }
     }
 
-    fun playAll(context: Context?, provider: MedialibraryProvider<AMediaWrapper>, position: Int, shuffle: Boolean) {
+    fun playAll(context: Context?, provider: MedialibraryProvider<AbstractMediaWrapper>, position: Int, shuffle: Boolean) {
         if (context == null) return
         SuspendDialogCallback(context) { service ->
             val count = withContext(Dispatchers.IO) { provider.getTotalCount() }
-            fun play(list: List<AMediaWrapper>) {
+            fun play(list: List<AbstractMediaWrapper>) {
                 service.load(list, if (shuffle) Random().nextInt(min(count, MEDIALIBRARY_PAGE_SIZE)) else position)
                 if (shuffle && !service.isShuffling) service.shuffle()
             }
@@ -192,7 +192,7 @@ object MediaUtils : CoroutineScope {
                 in 1..MEDIALIBRARY_PAGE_SIZE -> play(withContext(Dispatchers.IO) { provider.getAll().toList() })
                 else -> {
                     var index = 0
-                    val appendList = mutableListOf<AMediaWrapper>()
+                    val appendList = mutableListOf<AbstractMediaWrapper>()
                     while (index < count) {
                         val pageCount = min(MEDIALIBRARY_PAGE_SIZE, count - index)
                         val list = withContext(Dispatchers.IO) { provider.getPage(pageCount, index).toList() }
@@ -210,7 +210,7 @@ object MediaUtils : CoroutineScope {
         if (context == null) return
         SuspendDialogCallback(context) { service ->
             val count = withContext(Dispatchers.IO) { provider.getTotalCount() }
-            fun play(list: List<AMediaWrapper>) {
+            fun play(list: List<AbstractMediaWrapper>) {
                 service.load(list, if (shuffle) Random().nextInt(min(count, MEDIALIBRARY_PAGE_SIZE)) else position)
                 if (shuffle && !service.isShuffling) service.shuffle()
             }
@@ -218,7 +218,7 @@ object MediaUtils : CoroutineScope {
                 0 -> return@SuspendDialogCallback
                 in 1..MEDIALIBRARY_PAGE_SIZE -> play(withContext(Dispatchers.IO) {
                     provider.getAll().flatMap {
-                        it.media(provider.type, AMedialibrary.SORT_DEFAULT, false, it.mediaCount(provider.type), 0).toList()
+                        it.media(provider.type, AbstractMedialibrary.SORT_DEFAULT, false, it.mediaCount(provider.type), 0).toList()
                     }
                 })
                 else -> {
@@ -227,7 +227,7 @@ object MediaUtils : CoroutineScope {
                         val pageCount = min(MEDIALIBRARY_PAGE_SIZE, count - index)
                         val list = withContext(Dispatchers.IO) {
                             provider.getPage(pageCount, index).flatMap {
-                                it.media(provider.type, AMedialibrary.SORT_DEFAULT, false, it.mediaCount(provider.type), 0).toList()
+                                it.media(provider.type, AbstractMedialibrary.SORT_DEFAULT, false, it.mediaCount(provider.type), 0).toList()
                             }
                         }
                         if (index == 0) play(list)
@@ -240,7 +240,7 @@ object MediaUtils : CoroutineScope {
     }
 
     @JvmOverloads
-    fun openList(context: Context?, list: List<AMediaWrapper>, position: Int, shuffle: Boolean = false) {
+    fun openList(context: Context?, list: List<AbstractMediaWrapper>, position: Int, shuffle: Boolean = false) {
         if (Util.isListEmpty(list) || context == null) return
         DialogCallback(context, object : DialogCallback.Runnable {
             override fun run(service: PlaybackService) {
@@ -268,21 +268,21 @@ object MediaUtils : CoroutineScope {
         })
     }
 
-    fun getMediaArtist(ctx: Context, media: AMediaWrapper?) = media?.artist
+    fun getMediaArtist(ctx: Context, media: AbstractMediaWrapper?) = media?.artist
             ?: if (media?.nowPlaying != null) "" else getMediaString(ctx, R.string.unknown_artist)
 
-    fun getMediaReferenceArtist(ctx: Context, media: AMediaWrapper?) = getMediaArtist(ctx, media)
+    fun getMediaReferenceArtist(ctx: Context, media: AbstractMediaWrapper?) = getMediaArtist(ctx, media)
 
-    fun getMediaAlbumArtist(ctx: Context, media: AMediaWrapper?) = media?.albumArtist
+    fun getMediaAlbumArtist(ctx: Context, media: AbstractMediaWrapper?) = media?.albumArtist
             ?: getMediaString(ctx, R.string.unknown_artist)
 
-    fun getMediaAlbum(ctx: Context, media: AMediaWrapper?) = media?.album
+    fun getMediaAlbum(ctx: Context, media: AbstractMediaWrapper?) = media?.album
             ?: if (media?.nowPlaying != null) "" else getMediaString(ctx, R.string.unknown_album)
 
-    fun getMediaGenre(ctx: Context, media: AMediaWrapper?) = media?.genre
+    fun getMediaGenre(ctx: Context, media: AbstractMediaWrapper?) = media?.genre
             ?: getMediaString(ctx, R.string.unknown_genre)
 
-    fun getMediaSubtitle(media: AMediaWrapper): String? {
+    fun getMediaSubtitle(media: AbstractMediaWrapper): String? {
         var subtitle = media.nowPlaying ?: media.artist
         if (media.length > 0L) {
             subtitle = if (TextUtils.isEmpty(subtitle)) Tools.millisToString(media.length)
@@ -291,7 +291,7 @@ object MediaUtils : CoroutineScope {
         return subtitle
     }
 
-    fun getMediaTitle(mediaWrapper: AMediaWrapper) = mediaWrapper.title
+    fun getMediaTitle(mediaWrapper: AbstractMediaWrapper) = mediaWrapper.title
             ?: FileUtils.getFileNameFromPath(mediaWrapper.location)!!
 
     fun getContentMediaUri(data: Uri) = try {
@@ -419,7 +419,7 @@ object MediaUtils : CoroutineScope {
         }
     }
 
-    fun retrieveMediaTitle(mw: AMediaWrapper) = try {
+    fun retrieveMediaTitle(mw: AbstractMediaWrapper) = try {
         VLCApplication.appContext.contentResolver.query(mw.uri, null, null, null, null)?.use {
             val nameIndex = it.getColumnIndex(OpenableColumns.DISPLAY_NAME)
             if (nameIndex > -1 && it.count > 0) {
@@ -434,14 +434,14 @@ object MediaUtils : CoroutineScope {
     } catch (ignored: SecurityException) {
     }
 
-    fun deletePlaylist(playlist: APlaylist) = launch(Dispatchers.IO) { playlist.delete() }
+    fun deletePlaylist(playlist: AbstractPlaylist) = launch(Dispatchers.IO) { playlist.delete() }
 }
 
 @WorkerThread
-fun AFolder.getAll(type: Int = AFolder.TYPE_FOLDER_VIDEO, sort: Int = AMedialibrary.SORT_DEFAULT, desc: Boolean = false) : List<AMediaWrapper> {
+fun AbstractFolder.getAll(type: Int = AbstractFolder.TYPE_FOLDER_VIDEO, sort: Int = AbstractMedialibrary.SORT_DEFAULT, desc: Boolean = false) : List<AbstractMediaWrapper> {
     var index = 0
     val count = mediaCount(type)
-    val all = mutableListOf<AMediaWrapper>()
+    val all = mutableListOf<AbstractMediaWrapper>()
     while (index < count) {
         val pageCount = min(MEDIALIBRARY_PAGE_SIZE, count - index)
         val list = media(type, sort, desc, pageCount, index)
@@ -451,7 +451,7 @@ fun AFolder.getAll(type: Int = AFolder.TYPE_FOLDER_VIDEO, sort: Int = AMedialibr
     return all
 }
 
-fun List<AFolder>.getAll(type: Int = AFolder.TYPE_FOLDER_VIDEO, sort: Int = AMedialibrary.SORT_DEFAULT, desc: Boolean = false) : List<AMediaWrapper> {
+fun List<AbstractFolder>.getAll(type: Int = AbstractFolder.TYPE_FOLDER_VIDEO, sort: Int = AbstractMedialibrary.SORT_DEFAULT, desc: Boolean = false) : List<AbstractMediaWrapper> {
     return flatMap { it.getAll(type, sort, desc) }
 }
 
diff --git a/vlc-android/src/org/videolan/vlc/media/MediaWrapperList.kt b/vlc-android/src/org/videolan/vlc/media/MediaWrapperList.kt
index 26a7ba301a..cb64c484a2 100644
--- a/vlc-android/src/org/videolan/vlc/media/MediaWrapperList.kt
+++ b/vlc-android/src/org/videolan/vlc/media/MediaWrapperList.kt
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * AMediaWrapperList.java
+ * MediaWrapperList.java
  *
  * Copyright © 2013-2015 VLC authors and VideoLAN
  * Copyright © 2013 Edward Wang
@@ -20,17 +20,17 @@
  */
 package org.videolan.vlc.media
 
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import java.util.*
 
-class AMediaWrapperList {
+class MediaWrapperList {
 
     /* TODO: add locking */
-    private val internalList = ArrayList<AMediaWrapper>()
+    private val internalList = ArrayList<AbstractMediaWrapper>()
     private val eventListenerList = ArrayList<EventListener>()
     private var videoCount = 0
 
-    val copy: MutableList<AMediaWrapper>
+    val copy: MutableList<AbstractMediaWrapper>
         @Synchronized get() = ArrayList(internalList)
 
     val isAudioList: Boolean
@@ -43,10 +43,10 @@ class AMediaWrapperList {
     }
 
     @Synchronized
-    fun add(media: AMediaWrapper) {
+    fun add(media: AbstractMediaWrapper) {
         internalList.add(media)
         signalEventListeners(EVENT_ADDED, internalList.size - 1, -1, media.location)
-        if (media.type == AMediaWrapper.TYPE_VIDEO)
+        if (media.type == AbstractMediaWrapper.TYPE_VIDEO)
             ++videoCount
     }
 
@@ -90,11 +90,11 @@ class AMediaWrapperList {
     }
 
     @Synchronized
-    fun insert(position: Int, media: AMediaWrapper) {
+    fun insert(position: Int, media: AbstractMediaWrapper) {
         if (position < 0) return
         internalList.add(Math.min(position, internalList.size), media)
         signalEventListeners(EVENT_ADDED, position, -1, media.location)
-        if (media.type == AMediaWrapper.TYPE_VIDEO)
+        if (media.type == AbstractMediaWrapper.TYPE_VIDEO)
             ++videoCount
     }
 
@@ -123,7 +123,7 @@ class AMediaWrapperList {
     @Synchronized
     fun remove(position: Int) {
         if (!isValid(position)) return
-        if (internalList[position].type == AMediaWrapper.TYPE_VIDEO)
+        if (internalList[position].type == AbstractMediaWrapper.TYPE_VIDEO)
             --videoCount
         val uri = internalList[position].location
         internalList.removeAt(position)
@@ -136,7 +136,7 @@ class AMediaWrapperList {
         while (i < internalList.size) {
             val uri = internalList[i].location
             if (uri == location) {
-                if (internalList[i].type == AMediaWrapper.TYPE_VIDEO)
+                if (internalList[i].type == AbstractMediaWrapper.TYPE_VIDEO)
                     --videoCount
                 internalList.removeAt(i)
                 signalEventListeners(EVENT_REMOVED, i, -1, uri)
@@ -152,18 +152,18 @@ class AMediaWrapperList {
     }
 
     @Synchronized
-    fun getMedia(position: Int): AMediaWrapper? {
+    fun getMedia(position: Int): AbstractMediaWrapper? {
         return if (isValid(position)) internalList[position] else null
     }
 
     @Synchronized
-    fun replaceWith(list: List<AMediaWrapper>) {
+    fun replaceWith(list: List<AbstractMediaWrapper>) {
         internalList.clear()
         internalList.addAll(list)
     }
 
     @Synchronized
-    fun map(list: List<AMediaWrapper>) {
+    fun map(list: List<AbstractMediaWrapper>) {
         internalList.addAll(list)
     }
 
@@ -190,7 +190,7 @@ class AMediaWrapperList {
     }
 
     companion object {
-        private const val TAG = "VLC/AMediaWrapperList"
+        private const val TAG = "VLC/MediaWrapperList"
 
         private const val EVENT_ADDED = 0
         private const val EVENT_REMOVED = 1
diff --git a/vlc-android/src/org/videolan/vlc/media/PlayerController.kt b/vlc-android/src/org/videolan/vlc/media/PlayerController.kt
index dc9d04e1f5..96fb1d5418 100644
--- a/vlc-android/src/org/videolan/vlc/media/PlayerController.kt
+++ b/vlc-android/src/org/videolan/vlc/media/PlayerController.kt
@@ -10,10 +10,9 @@ import kotlinx.coroutines.*
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.channels.actor
 import org.videolan.libvlc.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.PlaybackService
-import org.videolan.vlc.gui.preferences.PreferencesActivity
 import org.videolan.vlc.repository.SlaveRepository
 import org.videolan.vlc.util.*
 import kotlin.math.abs
@@ -193,7 +192,7 @@ class PlayerController(val context: Context) : IVLCVout.Callback, MediaPlayer.Ev
         setPlaybackStopped()
     }
 
-    fun setSlaves(media: Media, mw: AMediaWrapper) = launch {
+    fun setSlaves(media: Media, mw: AbstractMediaWrapper) = launch {
         if (mediaplayer.isReleased) return@launch
         val slaves = mw.slaves
         slaves?.let { it.forEach { slave -> media.addSlave(slave) } }
@@ -236,7 +235,7 @@ class PlayerController(val context: Context) : IVLCVout.Callback, MediaPlayer.Ev
      * @param id of the Meta event received, -1 for none
      * @return true if UI needs to be updated
      */
-    internal fun updateCurrentMeta(id: Int, mw: AMediaWrapper?): Boolean {
+    internal fun updateCurrentMeta(id: Int, mw: AbstractMediaWrapper?): Boolean {
         if (id == Media.Meta.Publisher) return false
         mw?.updateMeta(mediaplayer)
         return id != Media.Meta.NowPlaying || mw?.nowPlaying !== null
diff --git a/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt b/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt
index c3fb74a4f3..93e1d2ec7d 100644
--- a/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt
+++ b/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt
@@ -16,9 +16,9 @@ import org.videolan.libvlc.Media
 import org.videolan.libvlc.MediaPlayer
 import org.videolan.libvlc.RendererItem
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.PlaybackService
 import org.videolan.vlc.R
@@ -34,16 +34,16 @@ private const val AUDIO_REPEAT_MODE_KEY = "audio_repeat_mode"
 
 @ObsoleteCoroutinesApi
 @ExperimentalCoroutinesApi
-class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventListener, Media.EventListener, CoroutineScope {
+class PlaylistManager(val service: PlaybackService) : MediaWrapperList.EventListener, Media.EventListener, CoroutineScope {
     override val coroutineContext = Dispatchers.Main.immediate
 
     companion object {
         val showAudioPlayer = MutableLiveData<Boolean>().apply { value = false }
-        private val mediaList = AMediaWrapperList()
+        private val mediaList = MediaWrapperList()
         fun hasMedia() = mediaList.size() != 0
     }
 
-    private val medialibrary by lazy(LazyThreadSafetyMode.NONE) { AMedialibrary.getInstance() }
+    private val medialibrary by lazy(LazyThreadSafetyMode.NONE) { AbstractMedialibrary.getInstance() }
     val player by lazy(LazyThreadSafetyMode.NONE) { PlayerController(service.applicationContext) }
     private val settings by lazy(LazyThreadSafetyMode.NONE) { Settings.getInstance(service) }
     private val ctx by lazy(LazyThreadSafetyMode.NONE) { service.applicationContext }
@@ -89,7 +89,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
     @MainThread
     fun loadLocations(mediaPathList: List<String>, position: Int) {
         launch {
-            val mediaList = ArrayList<AMediaWrapper>()
+            val mediaList = ArrayList<AbstractMediaWrapper>()
             withContext(Dispatchers.IO) {
                 for (location in mediaPathList) {
                     var mediaWrapper = medialibrary.getMedia(location)
@@ -100,7 +100,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
                             continue
                         }
                         Log.v(TAG, "Creating on-the-fly Media object for $location")
-                        mediaWrapper = MLServiceLocator.getAMediaWrapper(Uri.parse(location))
+                        mediaWrapper = MLServiceLocator.getAbstractMediaWrapper(Uri.parse(location))
                         mediaList.add(mediaWrapper)
                     } else
                         mediaList.add(mediaWrapper)
@@ -111,7 +111,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
     }
 
     @MainThread
-    fun load(list: List<AMediaWrapper>, position: Int, mlUpdate: Boolean = false) {
+    fun load(list: List<AbstractMediaWrapper>, position: Int, mlUpdate: Boolean = false) {
         launch {
             saveMediaList()
             savePosition()
@@ -158,7 +158,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
         launch {
             val playList = withContext(Dispatchers.Default) {
                 locations.asSequence().map { Uri.decode(it) }.mapTo(ArrayList(locations.size)) {
-                    MLServiceLocator.getAMediaWrapper(Uri.parse(it))
+                    MLServiceLocator.getAbstractMediaWrapper(Uri.parse(it))
                 }
             }
             // load playlist
@@ -167,7 +167,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
             val position = max(0, settings.getInt(if (audio) "position_in_audio_list" else "position_in_media_list", 0))
             savedTime = settings.getLong(if (audio) "position_in_song" else "position_in_media", -1)
             if (!audio && position < playList.size && settings.getBoolean(VIDEO_PAUSED, false)) {
-                playList[position].addFlags(AMediaWrapper.MEDIA_PAUSED)
+                playList[position].addFlags(AbstractMediaWrapper.MEDIA_PAUSED)
             }
             load(playList, position, true)
             loadingLastPlaylist = false
@@ -283,16 +283,16 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
         }
 
         val mw = mediaList.getMedia(index) ?: return
-        val isVideoPlaying = mw.type == AMediaWrapper.TYPE_VIDEO && player.isVideoPlaying()
-        if (!videoBackground && isVideoPlaying) mw.addFlags(AMediaWrapper.MEDIA_VIDEO)
-        if (videoBackground) mw.addFlags(AMediaWrapper.MEDIA_FORCE_AUDIO)
-        if (isBenchmark) mw.addFlags(AMediaWrapper.MEDIA_BENCHMARK)
+        val isVideoPlaying = mw.type == AbstractMediaWrapper.TYPE_VIDEO && player.isVideoPlaying()
+        if (!videoBackground && isVideoPlaying) mw.addFlags(AbstractMediaWrapper.MEDIA_VIDEO)
+        if (videoBackground) mw.addFlags(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)
+        if (isBenchmark) mw.addFlags(AbstractMediaWrapper.MEDIA_BENCHMARK)
         parsed = false
         player.switchToVideo = false
         if (TextUtils.equals(mw.uri.scheme, "content")) withContext(Dispatchers.IO) { MediaUtils.retrieveMediaTitle(mw) }
 
-        if (mw.type != AMediaWrapper.TYPE_VIDEO || isVideoPlaying || player.hasRenderer
-                || mw.hasFlag(AMediaWrapper.MEDIA_FORCE_AUDIO)) {
+        if (mw.type != AbstractMediaWrapper.TYPE_VIDEO || isVideoPlaying || player.hasRenderer
+                || mw.hasFlag(AbstractMediaWrapper.MEDIA_FORCE_AUDIO)) {
             val uri = withContext(Dispatchers.IO) { FileUtils.getUri(mw.uri) }
             if (uri == null) {
                 skipMedia()
@@ -335,7 +335,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
     @MainThread
     fun switchToVideo(): Boolean {
         val media = getCurrentMedia()
-        if (media === null || media.hasFlag(AMediaWrapper.MEDIA_FORCE_AUDIO) || !player.canSwitchToVideo())
+        if (media === null || media.hasFlag(AbstractMediaWrapper.MEDIA_FORCE_AUDIO) || !player.canSwitchToVideo())
             return false
         val hasRenderer = player.hasRenderer
         videoBackground = false
@@ -353,8 +353,8 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
 
     fun setVideoTrackEnabled(enabled: Boolean) {
         if (!hasMedia() || !player.isPlaying()) return
-        if (enabled) getCurrentMedia()?.addFlags(AMediaWrapper.MEDIA_VIDEO)
-        else getCurrentMedia()?.removeFlags(AMediaWrapper.MEDIA_VIDEO)
+        if (enabled) getCurrentMedia()?.addFlags(AbstractMediaWrapper.MEDIA_VIDEO)
+        else getCurrentMedia()?.removeFlags(AbstractMediaWrapper.MEDIA_VIDEO)
         player.setVideoTrackEnabled(enabled)
     }
 
@@ -410,48 +410,48 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
         val rate = player.getRate()
         val media = withContext(Dispatchers.IO) { medialibrary.findMedia(currentMedia) }
         if (media === null || media.id == 0L) return@launch
-        if (media.type == AMediaWrapper.TYPE_VIDEO || canSwitchToVideo || media.isPodcast) {
+        if (media.type == AbstractMediaWrapper.TYPE_VIDEO || canSwitchToVideo || media.isPodcast) {
             var progress = time / length.toFloat()
             if (progress > 0.95f || length - time < 10000) {
                 //increase seen counter if more than 95% of the media have been seen
                 //and reset progress to 0
-                launch(Dispatchers.IO) { media.setLongMeta(AMediaWrapper.META_SEEN, media.seen+1) }
+                launch(Dispatchers.IO) { media.setLongMeta(AbstractMediaWrapper.META_SEEN, media.seen+1) }
                 progress = 0f
             }
             media.time = if (progress == 0f) 0L else time
-            launch(Dispatchers.IO) { media.setLongMeta(AMediaWrapper.META_PROGRESS, media.time) }
+            launch(Dispatchers.IO) { media.setLongMeta(AbstractMediaWrapper.META_PROGRESS, media.time) }
         }
-        launch(Dispatchers.IO) { media.setStringMeta(AMediaWrapper.META_SPEED, rate.toString()) }
+        launch(Dispatchers.IO) { media.setStringMeta(AbstractMediaWrapper.META_SPEED, rate.toString()) }
     }
 
     fun setSpuTrack(index: Int) {
         if (!player.setSpuTrack(index)) return
         val media = getCurrentMedia() ?: return
-        if (media.id != 0L) launch(Dispatchers.IO) { media.setLongMeta(AMediaWrapper.META_SUBTITLE_TRACK, player.getSpuTrack().toLong()) }
+        if (media.id != 0L) launch(Dispatchers.IO) { media.setLongMeta(AbstractMediaWrapper.META_SUBTITLE_TRACK, player.getSpuTrack().toLong()) }
     }
 
     fun setAudioDelay(delay: Long) {
         if (!player.setAudioDelay(delay)) return
         val media = getCurrentMedia() ?: return
         if (media.id != 0L && settings.getBoolean("save_individual_audio_delay", false)) {
-            launch(Dispatchers.IO) { media.setLongMeta(AMediaWrapper.META_AUDIODELAY, player.getAudioDelay()) }
+            launch(Dispatchers.IO) { media.setLongMeta(AbstractMediaWrapper.META_AUDIODELAY, player.getAudioDelay()) }
         }
     }
 
     fun setSpuDelay(delay: Long) {
         if (!player.setSpuDelay(delay)) return
         val media = getCurrentMedia() ?: return
-        if (media.id != 0L) launch(Dispatchers.IO) { media.setLongMeta(AMediaWrapper.META_SUBTITLE_DELAY, player.getSpuDelay()) }
+        if (media.id != 0L) launch(Dispatchers.IO) { media.setLongMeta(AbstractMediaWrapper.META_SUBTITLE_DELAY, player.getSpuDelay()) }
     }
 
-    private fun loadMediaMeta(media: AMediaWrapper) {
+    private fun loadMediaMeta(media: AbstractMediaWrapper) {
         if (media.id == 0L) return
         if (player.canSwitchToVideo()) {
             if (settings.getBoolean("save_individual_audio_delay", false))
-                player.setAudioDelay(media.getMetaLong(AMediaWrapper.META_AUDIODELAY))
-            player.setSpuTrack(media.getMetaLong(AMediaWrapper.META_SUBTITLE_TRACK).toInt())
-            player.setSpuDelay(media.getMetaLong(AMediaWrapper.META_SUBTITLE_DELAY))
-            val rateString = media.getMetaString(AMediaWrapper.META_SPEED)
+                player.setAudioDelay(media.getMetaLong(AbstractMediaWrapper.META_AUDIODELAY))
+            player.setSpuTrack(media.getMetaLong(AbstractMediaWrapper.META_SUBTITLE_TRACK).toInt())
+            player.setSpuDelay(media.getMetaLong(AbstractMediaWrapper.META_SUBTITLE_DELAY))
+            val rateString = media.getMetaString(AbstractMediaWrapper.META_SPEED)
             if (!rateString.isNullOrEmpty()) {
                 player.setRate(rateString.toFloat(), false)
             }
@@ -505,7 +505,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
         val media = getCurrentMedia()
         if (expand && media !== null) {
             expanding = true
-            nextIndex = expand(media.type == AMediaWrapper.TYPE_STREAM)
+            nextIndex = expand(media.type == AbstractMediaWrapper.TYPE_STREAM)
             expanding = false
         } else {
             nextIndex = -1
@@ -572,7 +572,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
     private suspend fun expand(updateHistory: Boolean): Int {
         val index = currentIndex
         val expandedMedia = getCurrentMedia()
-        val stream = expandedMedia?.type == AMediaWrapper.TYPE_STREAM
+        val stream = expandedMedia?.type == AbstractMediaWrapper.TYPE_STREAM
         val ml = player.expand()
         var ret = -1
 
@@ -583,7 +583,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
             for (i in 0 until ml.count) {
                 val child = ml.getMediaAt(i)
                 withContext(Dispatchers.IO) { child.parse() }
-                mediaList.insert(index+i, MLServiceLocator.getAMediaWrapper(child))
+                mediaList.insert(index+i, MLServiceLocator.getAbstractMediaWrapper(child))
                 child.release()
             }
             mediaList.addEventListener(this)
@@ -593,7 +593,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
                 getCurrentMedia()?.apply {
                     AppScope.launch(Dispatchers.IO) {
                         if (stream) {
-                            type = AMediaWrapper.TYPE_STREAM
+                            type = AbstractMediaWrapper.TYPE_STREAM
                             entryUrl = mrl
                             medialibrary.getMedia(mrl)?.run { if (id > 0) medialibrary.removeExternalMedia(id) }
                         } else if (uri.scheme != "fd") {
@@ -616,15 +616,15 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
 
     fun getMedia(position: Int) = mediaList.getMedia(position)
 
-    private suspend fun getStartTime(mw: AMediaWrapper) : Long {
+    private suspend fun getStartTime(mw: AbstractMediaWrapper) : Long {
         val start = when {
-            mw.hasFlag(AMediaWrapper.MEDIA_FROM_START) -> {
-                mw.removeFlags(AMediaWrapper.MEDIA_FROM_START)
+            mw.hasFlag(AbstractMediaWrapper.MEDIA_FROM_START) -> {
+                mw.removeFlags(AbstractMediaWrapper.MEDIA_FROM_START)
                 0L
             }
             savedTime <= 0L -> when {
                 mw.time > 0L -> mw.time
-                mw.type == AMediaWrapper.TYPE_VIDEO || mw.isPodcast -> withContext(Dispatchers.IO) { medialibrary.findMedia(mw).getMetaLong(AMediaWrapper.META_PROGRESS) }
+                mw.type == AbstractMediaWrapper.TYPE_VIDEO || mw.isPodcast -> withContext(Dispatchers.IO) { medialibrary.findMedia(mw).getMetaLong(AbstractMediaWrapper.META_PROGRESS) }
                 else -> 0L
             }
             else -> savedTime
@@ -652,7 +652,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
      * Append to the current existing playlist
      */
     @MainThread
-    suspend fun append(list: List<AMediaWrapper>) {
+    suspend fun append(list: List<AbstractMediaWrapper>) {
         if (!hasCurrentMedia()) {
             load(list, 0)
             return
@@ -669,7 +669,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
      */
 
     @MainThread
-    fun insertNext(list: List<AMediaWrapper>) {
+    fun insertNext(list: List<AbstractMediaWrapper>) {
         if (!hasCurrentMedia()) {
             load(list, 0)
             return
@@ -685,7 +685,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
     fun moveItem(positionStart: Int, positionEnd: Int) = mediaList.move(positionStart, positionEnd)
 
     @MainThread
-    fun insertItem(position: Int, mw: AMediaWrapper) = mediaList.insert(position, mw)
+    fun insertItem(position: Int, mw: AbstractMediaWrapper) = mediaList.insert(position, mw)
 
 
     @MainThread
@@ -696,7 +696,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
 
     fun getMediaListSize()= mediaList.size()
 
-    fun getMediaList(): List<AMediaWrapper> = mediaList.copy
+    fun getMediaList(): List<AbstractMediaWrapper> = mediaList.copy
 
     fun toggleABRepeat() {
         val time = player.getCurrentTime()
@@ -798,7 +798,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
         }
     }
 
-    private suspend fun savePlaycount(mw: AMediaWrapper) {
+    private suspend fun savePlaycount(mw: AbstractMediaWrapper) {
         if (settings.getBoolean(PLAYBACK_HISTORY, true)) withContext(Dispatchers.IO) {
             var id = mw.id
             if (id == 0L) {
@@ -806,7 +806,7 @@ class PlaylistManager(val service: PlaybackService) : AMediaWrapperList.EventLis
                 if (internalMedia != null && internalMedia.id != 0L)
                     id = internalMedia.id
                 else {
-                    internalMedia = if (mw.type == AMediaWrapper.TYPE_STREAM) {
+                    internalMedia = if (mw.type == AbstractMediaWrapper.TYPE_STREAM) {
                             val media = medialibrary.addStream(Uri.decode(entryUrl ?: mw.uri.toString()), mw.title)
                             entryUrl = null
                             media
diff --git a/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt b/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt
index b864f29455..81ec5db1c3 100644
--- a/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt
@@ -35,9 +35,9 @@ import kotlinx.coroutines.channels.mapNotNullTo
 import org.videolan.libvlc.Media
 import org.videolan.libvlc.util.MediaBrowser
 import org.videolan.libvlc.util.MediaBrowser.EventListener
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.medialibrary.media.Storage
 import org.videolan.vlc.R
@@ -60,7 +60,7 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
     private val showAll = Settings.getInstance(context).getBoolean("browser_show_all_files", true)
 
     val descriptionUpdate = MutableLiveData<Pair<Int, String>>()
-    internal val medialibrary = AMedialibrary.getInstance()
+    internal val medialibrary = AbstractMedialibrary.getInstance()
 
     private val browserActor = actor<BrowserAction>(capacity = Channel.UNLIMITED) {
         for (action in channel) if (isActive) when (action) {
@@ -126,7 +126,7 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
                 position > 0 -> value[position - 1]
                 else -> null
             }
-            ModelsHelper.getHeader(context, AMedialibrary.SORT_ALPHA, item, previous)?.let {
+            ModelsHelper.getHeader(context, AbstractMedialibrary.SORT_ALPHA, item, previous)?.let {
                 launch {
                     headers.put(position, it)
                     (liveHeaders as MutableLiveData<HeadersIndex>).value = headers
@@ -152,8 +152,8 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
     private suspend fun parseSubDirectoriesImpl() {
         if (dataset.value.isEmpty()) return
         val currentMediaList = withContext(Dispatchers.Main) { dataset.value.toList().also { if (url != null) computeHeaders(dataset.value) } }
-        val directories: MutableList<AMediaWrapper> = ArrayList()
-        val files: MutableList<AMediaWrapper> = ArrayList()
+        val directories: MutableList<AbstractMediaWrapper> = ArrayList()
+        val files: MutableList<AbstractMediaWrapper> = ArrayList()
         foldersContentMap.clear()
         withContext(Dispatchers.IO) {
             initBrowser()
@@ -167,13 +167,13 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
                 val item = currentMediaList[currentParsedPosition]
                 val current = when {
                     item.itemType == MediaLibraryItem.TYPE_MEDIA -> {
-                        val mw = item as AMediaWrapper
-                        if (mw.type != AMediaWrapper.TYPE_DIR && mw.type != AMediaWrapper.TYPE_PLAYLIST) continue@loop
+                        val mw = item as AbstractMediaWrapper
+                        if (mw.type != AbstractMediaWrapper.TYPE_DIR && mw.type != AbstractMediaWrapper.TYPE_PLAYLIST) continue@loop
                         if (mw.uri.scheme == "otg" || mw.uri.scheme == "content") continue@loop
                         mw
                     }
                     item.itemType == MediaLibraryItem.TYPE_STORAGE ->
-                        MLServiceLocator.getAMediaWrapper((item as Storage).uri).apply { type = AMediaWrapper.TYPE_DIR }
+                        MLServiceLocator.getAbstractMediaWrapper((item as Storage).uri).apply { type = AbstractMediaWrapper.TYPE_DIR }
                     else -> continue@loop
                 }
                 // request parsing
@@ -183,7 +183,7 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
                 for (media in browserChannel) {
                     val mw = findMedia(media) ?: continue
                     val type = mw.type
-                    if (type == AMediaWrapper.TYPE_DIR) directories.add(mw)
+                    if (type == AbstractMediaWrapper.TYPE_DIR) directories.add(mw)
                     else files.add(mw)
                 }
                 // all subitems are in
@@ -224,15 +224,15 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
         return sb.toString()
     }
 
-    private suspend fun findMedia(media: Media): AMediaWrapper? {
-        val mw = MLServiceLocator.getAMediaWrapper(media)
+    private suspend fun findMedia(media: Media): AbstractMediaWrapper? {
+        val mw = MLServiceLocator.getAbstractMediaWrapper(media)
         media.release()
         if (!mw.isMedia()) {
             if (mw.isBrowserMedia()) return mw
             else if (!showAll) return null
         }
         val uri = mw.uri
-        if ((mw.type == AMediaWrapper.TYPE_AUDIO || mw.type == AMediaWrapper.TYPE_VIDEO)
+        if ((mw.type == AbstractMediaWrapper.TYPE_AUDIO || mw.type == AbstractMediaWrapper.TYPE_VIDEO)
                 && "file" == uri.scheme) return withContext(Dispatchers.IO) {
             medialibrary.getMedia(uri) ?: mw
         }
@@ -276,9 +276,9 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
 
     protected fun removeList(url: String) =  prefetchLists.remove(url)
 
-    fun saveList(media: AMediaWrapper) = foldersContentMap[media]?.let { if (!it.isEmpty()) prefetchLists[media.location] = it }
+    fun saveList(media: AbstractMediaWrapper) = foldersContentMap[media]?.let { if (!it.isEmpty()) prefetchLists[media.location] = it }
 
-    fun isFolderEmpty(mw: AMediaWrapper) = foldersContentMap[mw]?.isEmpty() ?: true
+    fun isFolderEmpty(mw: AbstractMediaWrapper) = foldersContentMap[mw]?.isEmpty() ?: true
 
     companion object {
         private val browserHandler by lazy {
diff --git a/vlc-android/src/org/videolan/vlc/providers/FileBrowserProvider.kt b/vlc-android/src/org/videolan/vlc/providers/FileBrowserProvider.kt
index 84166f9309..ee3858e5b0 100644
--- a/vlc-android/src/org/videolan/vlc/providers/FileBrowserProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/FileBrowserProvider.kt
@@ -28,7 +28,7 @@ import androidx.lifecycle.Observer
 import kotlinx.coroutines.*
 import org.videolan.libvlc.util.AndroidUtil
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.DummyItem
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.ExternalMonitor
@@ -107,8 +107,8 @@ open class FileBrowserProvider(
             val file = File(mediaDirLocation)
             if (!file.exists() || !file.canRead()) continue
             storageAccess = true
-            val directory = MLServiceLocator.getAMediaWrapper(AndroidUtil.PathToUri(mediaDirLocation))
-            directory.type = AMediaWrapper.TYPE_DIR
+            val directory = MLServiceLocator.getAbstractMediaWrapper(AndroidUtil.PathToUri(mediaDirLocation))
+            directory.type = AbstractMediaWrapper.TYPE_DIR
             if (TextUtils.equals(AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY, mediaDirLocation)) {
                 directory.setDisplayTitle(internalmemoryTitle)
                 storagePosition = devices.size
@@ -125,9 +125,9 @@ open class FileBrowserProvider(
         }
         if (!storageAccess) return // For first launch, storage access may not already be granted
         if (AndroidUtil.isLolliPopOrLater && !ExternalMonitor.devices.value.isEmpty()) {
-            val otg = MLServiceLocator.getAMediaWrapper(Uri.parse("otg://")).apply {
+            val otg = MLServiceLocator.getAbstractMediaWrapper(Uri.parse("otg://")).apply {
                 title = context.getString(R.string.otg_device_title)
-                type = AMediaWrapper.TYPE_DIR
+                type = AbstractMediaWrapper.TYPE_DIR
             }
             otgPosition = devices.size
             devices.add(otg)
@@ -171,9 +171,9 @@ open class FileBrowserProvider(
                 otgPosition = -1
             }
         } else if (otgPosition == -1) {
-            val otg = MLServiceLocator.getAMediaWrapper(Uri.parse("otg://")).apply {
+            val otg = MLServiceLocator.getAbstractMediaWrapper(Uri.parse("otg://")).apply {
                 title = context.getString(R.string.otg_device_title)
-                type = AMediaWrapper.TYPE_DIR
+                type = AbstractMediaWrapper.TYPE_DIR
             }
             otgPosition = storagePosition+1
             dataset.add(otgPosition, otg)
diff --git a/vlc-android/src/org/videolan/vlc/providers/FilePickerProvider.kt b/vlc-android/src/org/videolan/vlc/providers/FilePickerProvider.kt
index 2ba39a539e..5c7c5b1c81 100644
--- a/vlc-android/src/org/videolan/vlc/providers/FilePickerProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/FilePickerProvider.kt
@@ -22,7 +22,7 @@ package org.videolan.vlc.providers
 
 import android.content.Context
 import org.videolan.libvlc.util.MediaBrowser
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.util.LiveDataset
 
@@ -38,7 +38,7 @@ class FilePickerProvider(context: Context, dataset: LiveDataset<MediaLibraryItem
     }
 
     override fun addMedia(media: MediaLibraryItem) {
-        if (media is AMediaWrapper && (media.type == AMediaWrapper.TYPE_SUBTITLE || media.type == AMediaWrapper.TYPE_DIR)) super.addMedia(media)
+        if (media is AbstractMediaWrapper && (media.type == AbstractMediaWrapper.TYPE_SUBTITLE || media.type == AbstractMediaWrapper.TYPE_DIR)) super.addMedia(media)
     }
 
     override fun parseSubDirectories() {}
diff --git a/vlc-android/src/org/videolan/vlc/providers/NetworkProvider.kt b/vlc-android/src/org/videolan/vlc/providers/NetworkProvider.kt
index 4cbb8fcd24..94752d95b1 100644
--- a/vlc-android/src/org/videolan/vlc/providers/NetworkProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/NetworkProvider.kt
@@ -24,7 +24,7 @@ import android.content.Context
 import androidx.lifecycle.Observer
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.DummyItem
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.ExternalMonitor
@@ -35,7 +35,7 @@ import org.videolan.vlc.util.Settings
 
 @ExperimentalCoroutinesApi
 @ObsoleteCoroutinesApi
-class NetworkProvider(context: Context, dataset: LiveDataset<MediaLibraryItem>, url: String? = null, showHiddenFiles: Boolean): BrowserProvider(context, dataset, url, showHiddenFiles), Observer<List<AMediaWrapper>> {
+class NetworkProvider(context: Context, dataset: LiveDataset<MediaLibraryItem>, url: String? = null, showHiddenFiles: Boolean): BrowserProvider(context, dataset, url, showHiddenFiles), Observer<List<AbstractMediaWrapper>> {
 
     private val favorites = if (url == null && !Settings.showTvUi) BrowserFavRepository.getInstance(context).networkFavorites else null
 
@@ -83,7 +83,7 @@ class NetworkProvider(context: Context, dataset: LiveDataset<MediaLibraryItem>,
         super.release()
     }
 
-    override fun onChanged(favs: List<AMediaWrapper>?) {
+    override fun onChanged(favs: List<AbstractMediaWrapper>?) {
         val data = dataset.value.toMutableList()
         data.listIterator().run {
             while (hasNext()) {
@@ -94,7 +94,7 @@ class NetworkProvider(context: Context, dataset: LiveDataset<MediaLibraryItem>,
         dataset.value = data.apply { getFavoritesList(favs)?.let { addAll(0, it) } }
     }
 
-    private fun getFavoritesList(favs: List<AMediaWrapper>?): MutableList<MediaLibraryItem>? {
+    private fun getFavoritesList(favs: List<AbstractMediaWrapper>?): MutableList<MediaLibraryItem>? {
         if (favs?.isNotEmpty() == true) {
             val list = mutableListOf<MediaLibraryItem>()
             list.add(0, DummyItem(context.getString(R.string.network_favorites)))
diff --git a/vlc-android/src/org/videolan/vlc/providers/StorageProvider.kt b/vlc-android/src/org/videolan/vlc/providers/StorageProvider.kt
index 49215ce482..9814aaa5d1 100644
--- a/vlc-android/src/org/videolan/vlc/providers/StorageProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/StorageProvider.kt
@@ -27,7 +27,7 @@ import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.channels.filter
 import kotlinx.coroutines.channels.mapTo
 import org.videolan.libvlc.Media
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.medialibrary.media.Storage
 import org.videolan.vlc.R
@@ -65,7 +65,7 @@ class StorageProvider(context: Context, dataset: LiveDataset<MediaLibraryItem>,
 
     override fun addMedia(media: MediaLibraryItem) {
         if (media.itemType == MediaLibraryItem.TYPE_MEDIA) {
-            if ((media as AMediaWrapper).type == AMediaWrapper.TYPE_DIR) super.addMedia(Storage(media.uri))
+            if ((media as AbstractMediaWrapper).type == AbstractMediaWrapper.TYPE_DIR) super.addMedia(Storage(media.uri))
             return
         } else if (media.itemType != MediaLibraryItem.TYPE_STORAGE) return
         super.addMedia(media)
diff --git a/vlc-android/src/org/videolan/vlc/providers/medialibrary/AlbumsProvider.kt b/vlc-android/src/org/videolan/vlc/providers/medialibrary/AlbumsProvider.kt
index 7f7da753f8..f13b67cebe 100644
--- a/vlc-android/src/org/videolan/vlc/providers/medialibrary/AlbumsProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/medialibrary/AlbumsProvider.kt
@@ -22,53 +22,53 @@ package org.videolan.vlc.providers.medialibrary
 
 import android.content.Context
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AAlbum
-import org.videolan.medialibrary.interfaces.media.AArtist
-import org.videolan.medialibrary.interfaces.media.AGenre
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum
+import org.videolan.medialibrary.interfaces.media.AbstractArtist
+import org.videolan.medialibrary.interfaces.media.AbstractGenre
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.util.Settings
 import org.videolan.vlc.viewmodels.SortableModel
 
 
 @ExperimentalCoroutinesApi
-class AlbumsProvider(val parent : MediaLibraryItem?, context: Context, scope: SortableModel) : MedialibraryProvider<AAlbum>(context, scope) {
+class AlbumsProvider(val parent : MediaLibraryItem?, context: Context, scope: SortableModel) : MedialibraryProvider<AbstractAlbum>(context, scope) {
 
     override val sortKey = "${super.sortKey}_${parent?.javaClass?.simpleName}"
     override fun canSortByDuration() = true
     override fun canSortByReleaseDate() = true
 
     init {
-        sort = Settings.getInstance(context).getInt(sortKey, if (parent is AArtist) AMedialibrary.SORT_RELEASEDATE else AMedialibrary.SORT_DEFAULT)
+        sort = Settings.getInstance(context).getInt(sortKey, if (parent is AbstractArtist) AbstractMedialibrary.SORT_RELEASEDATE else AbstractMedialibrary.SORT_DEFAULT)
         desc = Settings.getInstance(context).getBoolean("${sortKey}_desc", false)
     }
 
-    override fun getAll() : Array<AAlbum> = when (parent) {
-        is AArtist -> parent.getAlbums(sort, scope.desc)
-        is AGenre -> parent.getAlbums(sort, scope.desc)
+    override fun getAll() : Array<AbstractAlbum> = when (parent) {
+        is AbstractArtist -> parent.getAlbums(sort, scope.desc)
+        is AbstractGenre -> parent.getAlbums(sort, scope.desc)
         else -> medialibrary.getAlbums(sort, scope.desc)
     }
 
-    override fun getPage(loadSize: Int, startposition: Int) : Array<AAlbum> {
+    override fun getPage(loadSize: Int, startposition: Int) : Array<AbstractAlbum> {
         val list = if (scope.filterQuery == null) when(parent) {
-            is AArtist -> parent.getPagedAlbums(sort, scope.desc, loadSize, startposition)
-            is AGenre -> parent.getPagedAlbums(sort, scope.desc, loadSize, startposition)
+            is AbstractArtist -> parent.getPagedAlbums(sort, scope.desc, loadSize, startposition)
+            is AbstractGenre -> parent.getPagedAlbums(sort, scope.desc, loadSize, startposition)
             else -> medialibrary.getPagedAlbums(sort, scope.desc, loadSize, startposition)
         } else when(parent) {
-            is AArtist -> parent.searchAlbums(scope.filterQuery, sort, scope.desc, loadSize, startposition)
-            is AGenre -> parent.searchAlbums(scope.filterQuery, sort, scope.desc, loadSize, startposition)
+            is AbstractArtist -> parent.searchAlbums(scope.filterQuery, sort, scope.desc, loadSize, startposition)
+            is AbstractGenre -> parent.searchAlbums(scope.filterQuery, sort, scope.desc, loadSize, startposition)
             else -> medialibrary.searchAlbum(scope.filterQuery, sort, scope.desc, loadSize, startposition)
         }
         return list.also { completeHeaders(it, startposition) }
     }
 
     override fun getTotalCount() = if (scope.filterQuery == null) when(parent) {
-        is AArtist -> parent.albumsCount
-        is AGenre -> parent.albumsCount
+        is AbstractArtist -> parent.albumsCount
+        is AbstractGenre -> parent.albumsCount
         else -> medialibrary.albumsCount
     } else when (parent) {
-        is AArtist -> parent.searchAlbumsCount(scope.filterQuery)
-        is AGenre -> parent.searchAlbumsCount(scope.filterQuery)
+        is AbstractArtist -> parent.searchAlbumsCount(scope.filterQuery)
+        is AbstractGenre -> parent.searchAlbumsCount(scope.filterQuery)
         else -> medialibrary.getAlbumsCount(scope.filterQuery)
     }
 }
\ No newline at end of file
diff --git a/vlc-android/src/org/videolan/vlc/providers/medialibrary/ArtistsProvider.kt b/vlc-android/src/org/videolan/vlc/providers/medialibrary/ArtistsProvider.kt
index 8d512e3ec2..630ab33f6d 100644
--- a/vlc-android/src/org/videolan/vlc/providers/medialibrary/ArtistsProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/medialibrary/ArtistsProvider.kt
@@ -22,16 +22,16 @@ package org.videolan.vlc.providers.medialibrary
 
 import android.content.Context
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AArtist
+import org.videolan.medialibrary.interfaces.media.AbstractArtist
 import org.videolan.vlc.viewmodels.SortableModel
 
 
 @ExperimentalCoroutinesApi
-class ArtistsProvider(context: Context, scope: SortableModel, var showAll: Boolean) : MedialibraryProvider<AArtist>(context, scope) {
+class ArtistsProvider(context: Context, scope: SortableModel, var showAll: Boolean) : MedialibraryProvider<AbstractArtist>(context, scope) {
 
-    override fun getAll() : Array<AArtist> = medialibrary.getArtists(showAll, sort, scope.desc)
+    override fun getAll() : Array<AbstractArtist> = medialibrary.getArtists(showAll, sort, scope.desc)
 
-    override fun getPage(loadSize: Int, startposition: Int): Array<AArtist> {
+    override fun getPage(loadSize: Int, startposition: Int): Array<AbstractArtist> {
         val list = if (scope.filterQuery == null) medialibrary.getPagedArtists(showAll, sort, scope.desc, loadSize, startposition)
         else medialibrary.searchArtist(scope.filterQuery, sort, scope.desc, loadSize, startposition)
         return list.also { completeHeaders(it, startposition) }
diff --git a/vlc-android/src/org/videolan/vlc/providers/medialibrary/FoldersProvider.kt b/vlc-android/src/org/videolan/vlc/providers/medialibrary/FoldersProvider.kt
index da4318b4b8..187b2eb345 100644
--- a/vlc-android/src/org/videolan/vlc/providers/medialibrary/FoldersProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/medialibrary/FoldersProvider.kt
@@ -22,16 +22,16 @@ package org.videolan.vlc.providers.medialibrary
 
 import android.content.Context
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AFolder
+import org.videolan.medialibrary.interfaces.media.AbstractFolder
 import org.videolan.vlc.viewmodels.SortableModel
 
 
 @ExperimentalCoroutinesApi
-class FoldersProvider(context: Context, scope: SortableModel, val type: Int) : MedialibraryProvider<AFolder>(context, scope) {
-    override fun getAll() : Array<AFolder> = medialibrary.getFolders(type, sort, scope.desc, getTotalCount(), 0)
+class FoldersProvider(context: Context, scope: SortableModel, val type: Int) : MedialibraryProvider<AbstractFolder>(context, scope) {
+    override fun getAll() : Array<AbstractFolder> = medialibrary.getFolders(type, sort, scope.desc, getTotalCount(), 0)
 
     override fun getTotalCount() = medialibrary.getFoldersCount(type)
 
-    override fun getPage(loadSize: Int, startposition: Int) : Array<AFolder> = medialibrary.getFolders(type, sort, scope.desc, loadSize, startposition).also { completeHeaders(it, startposition) }
+    override fun getPage(loadSize: Int, startposition: Int) : Array<AbstractFolder> = medialibrary.getFolders(type, sort, scope.desc, loadSize, startposition).also { completeHeaders(it, startposition) }
 
 }
\ No newline at end of file
diff --git a/vlc-android/src/org/videolan/vlc/providers/medialibrary/GenresProvider.kt b/vlc-android/src/org/videolan/vlc/providers/medialibrary/GenresProvider.kt
index 6f783c8b64..6becc155fd 100644
--- a/vlc-android/src/org/videolan/vlc/providers/medialibrary/GenresProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/medialibrary/GenresProvider.kt
@@ -22,16 +22,16 @@ package org.videolan.vlc.providers.medialibrary
 
 import android.content.Context
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AGenre
+import org.videolan.medialibrary.interfaces.media.AbstractGenre
 import org.videolan.vlc.viewmodels.SortableModel
 
 
 @ExperimentalCoroutinesApi
-class GenresProvider(context: Context, scope: SortableModel) : MedialibraryProvider<AGenre>(context, scope)  {
+class GenresProvider(context: Context, scope: SortableModel) : MedialibraryProvider<AbstractGenre>(context, scope)  {
 
-    override fun getAll() : Array<AGenre> = medialibrary.getGenres(sort, scope.desc)
+    override fun getAll() : Array<AbstractGenre> = medialibrary.getGenres(sort, scope.desc)
 
-    override fun getPage(loadSize: Int, startposition: Int) : Array<AGenre> {
+    override fun getPage(loadSize: Int, startposition: Int) : Array<AbstractGenre> {
         val list = if (scope.filterQuery == null) medialibrary.getPagedGenres(sort, scope.desc, loadSize, startposition)
         else medialibrary.searchGenre(scope.filterQuery, sort, scope.desc, loadSize, startposition)
         return list.also { completeHeaders(it, startposition) }
diff --git a/vlc-android/src/org/videolan/vlc/providers/medialibrary/MedialibraryProvider.kt b/vlc-android/src/org/videolan/vlc/providers/medialibrary/MedialibraryProvider.kt
index a36f3b3f8d..76e349157b 100644
--- a/vlc-android/src/org/videolan/vlc/providers/medialibrary/MedialibraryProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/medialibrary/MedialibraryProvider.kt
@@ -29,7 +29,7 @@ import androidx.paging.toLiveData
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.launch
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.providers.HeaderProvider
 import org.videolan.vlc.providers.HeadersIndex
@@ -37,13 +37,13 @@ import org.videolan.vlc.util.*
 import org.videolan.vlc.viewmodels.SortableModel
 
 abstract class MedialibraryProvider<T : MediaLibraryItem>(val context: Context, val scope: SortableModel) : HeaderProvider() {
-    protected val medialibrary = AMedialibrary.getInstance()
+    protected val medialibrary = AbstractMedialibrary.getInstance()
     private lateinit var dataSource : DataSource<Int, T>
     val loading = MutableLiveData<Boolean>().apply { value = false }
     @Volatile private var isRefreshing = false
 
     protected open val sortKey : String = this.javaClass.simpleName
-    var sort = AMedialibrary.SORT_DEFAULT
+    var sort = AbstractMedialibrary.SORT_DEFAULT
     var desc = false
 
     private val pagingConfig = Config(
@@ -74,7 +74,7 @@ abstract class MedialibraryProvider<T : MediaLibraryItem>(val context: Context,
     open fun sort(sort: Int) {
         if (canSortBy(sort)) {
             desc = when (this.sort) {
-                AMedialibrary.SORT_DEFAULT -> sort == AMedialibrary.SORT_ALPHA
+                AbstractMedialibrary.SORT_DEFAULT -> sort == AbstractMedialibrary.SORT_ALPHA
                 sort -> !desc
                 else -> false
             }
diff --git a/vlc-android/src/org/videolan/vlc/providers/medialibrary/PlaylistsProvider.kt b/vlc-android/src/org/videolan/vlc/providers/medialibrary/PlaylistsProvider.kt
index 1046243036..a26a81f179 100644
--- a/vlc-android/src/org/videolan/vlc/providers/medialibrary/PlaylistsProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/medialibrary/PlaylistsProvider.kt
@@ -22,16 +22,16 @@ package org.videolan.vlc.providers.medialibrary
 
 import android.content.Context
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.APlaylist
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist
 import org.videolan.vlc.viewmodels.SortableModel
 
 
 @ExperimentalCoroutinesApi
-class PlaylistsProvider(context: Context, scope: SortableModel) : MedialibraryProvider<APlaylist>(context, scope) {
+class PlaylistsProvider(context: Context, scope: SortableModel) : MedialibraryProvider<AbstractPlaylist>(context, scope) {
 
-    override fun getAll() : Array<APlaylist> = medialibrary.getPlaylists(sort, scope.desc)
+    override fun getAll() : Array<AbstractPlaylist> = medialibrary.getPlaylists(sort, scope.desc)
 
-    override fun getPage(loadSize: Int, startposition: Int)  : Array<APlaylist> {
+    override fun getPage(loadSize: Int, startposition: Int)  : Array<AbstractPlaylist> {
         val list = if (scope.filterQuery == null) medialibrary.getPagedPlaylists(sort, scope.desc, loadSize, startposition)
         else medialibrary.searchPlaylist(scope.filterQuery, sort, scope.desc, loadSize, startposition)
         return list.also { completeHeaders(it, startposition) }
diff --git a/vlc-android/src/org/videolan/vlc/providers/medialibrary/TracksProvider.kt b/vlc-android/src/org/videolan/vlc/providers/medialibrary/TracksProvider.kt
index 6062e5bc4b..0afe631ec7 100644
--- a/vlc-android/src/org/videolan/vlc/providers/medialibrary/TracksProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/medialibrary/TracksProvider.kt
@@ -22,7 +22,7 @@ package org.videolan.vlc.providers.medialibrary
 
 import android.content.Context
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.interfaces.media.*
 import org.videolan.medialibrary.media.*
 import org.videolan.vlc.util.Settings
@@ -30,7 +30,7 @@ import org.videolan.vlc.viewmodels.SortableModel
 
 
 @ExperimentalCoroutinesApi
-class TracksProvider(val parent : MediaLibraryItem?, context: Context, scope: SortableModel) : MedialibraryProvider<AMediaWrapper>(context, scope) {
+class TracksProvider(val parent : MediaLibraryItem?, context: Context, scope: SortableModel) : MedialibraryProvider<AbstractMediaWrapper>(context, scope) {
 
     override val sortKey = "${super.sortKey}_${parent?.javaClass?.simpleName}"
     override fun canSortByDuration() = true
@@ -38,45 +38,45 @@ class TracksProvider(val parent : MediaLibraryItem?, context: Context, scope: So
     override fun canSortByLastModified() = true
 
     init {
-        sort = Settings.getInstance(context).getInt(sortKey, AMedialibrary.SORT_DEFAULT)
-        desc = Settings.getInstance(context).getBoolean("${sortKey}_desc", parent is AArtist)
-        if (sort == AMedialibrary.SORT_DEFAULT) sort = when (parent) {
-            is AArtist -> AMedialibrary.SORT_ALBUM
-            is AAlbum -> AMedialibrary.SORT_DEFAULT
-            else -> AMedialibrary.SORT_ALPHA
+        sort = Settings.getInstance(context).getInt(sortKey, AbstractMedialibrary.SORT_DEFAULT)
+        desc = Settings.getInstance(context).getBoolean("${sortKey}_desc", parent is AbstractArtist)
+        if (sort == AbstractMedialibrary.SORT_DEFAULT) sort = when (parent) {
+            is AbstractArtist -> AbstractMedialibrary.SORT_ALBUM
+            is AbstractAlbum -> AbstractMedialibrary.SORT_DEFAULT
+            else -> AbstractMedialibrary.SORT_ALPHA
         }
     }
 
-    override fun getAll(): Array<AMediaWrapper> = parent?.tracks ?: medialibrary.getAudio(sort, scope.desc)
+    override fun getAll(): Array<AbstractMediaWrapper> = parent?.tracks ?: medialibrary.getAudio(sort, scope.desc)
 
-    override fun getPage(loadSize: Int, startposition: Int) : Array<AMediaWrapper> {
+    override fun getPage(loadSize: Int, startposition: Int) : Array<AbstractMediaWrapper> {
         val list = if (scope.filterQuery == null) when(parent) {
-            is AArtist -> parent.getPagedTracks(sort, scope.desc, loadSize, startposition)
-            is AAlbum -> parent.getPagedTracks(sort, scope.desc, loadSize, startposition)
-            is AGenre -> parent.getPagedTracks(sort, scope.desc, loadSize, startposition)
-            is APlaylist -> parent.getPagedTracks(loadSize, startposition)
+            is AbstractArtist -> parent.getPagedTracks(sort, scope.desc, loadSize, startposition)
+            is AbstractAlbum -> parent.getPagedTracks(sort, scope.desc, loadSize, startposition)
+            is AbstractGenre -> parent.getPagedTracks(sort, scope.desc, loadSize, startposition)
+            is AbstractPlaylist -> parent.getPagedTracks(loadSize, startposition)
             else -> medialibrary.getPagedAudio(sort, scope.desc, loadSize, startposition)
         } else when(parent) {
-            is AArtist -> parent.searchTracks(scope.filterQuery, sort, scope.desc, loadSize, startposition)
-            is AAlbum -> parent.searchTracks(scope.filterQuery, sort, scope.desc, loadSize, startposition)
-            is AGenre -> parent.searchTracks(scope.filterQuery, sort, scope.desc, loadSize, startposition)
-            is APlaylist -> parent.searchTracks(scope.filterQuery, sort, scope.desc, loadSize, startposition)
+            is AbstractArtist -> parent.searchTracks(scope.filterQuery, sort, scope.desc, loadSize, startposition)
+            is AbstractAlbum -> parent.searchTracks(scope.filterQuery, sort, scope.desc, loadSize, startposition)
+            is AbstractGenre -> parent.searchTracks(scope.filterQuery, sort, scope.desc, loadSize, startposition)
+            is AbstractPlaylist -> parent.searchTracks(scope.filterQuery, sort, scope.desc, loadSize, startposition)
             else -> medialibrary.searchAudio(scope.filterQuery, sort, scope.desc, loadSize, startposition)
         }
         return list.also { completeHeaders(it, startposition) }
     }
 
     override fun getTotalCount() = if (scope.filterQuery == null) when (parent) {
-        is AAlbum -> parent.realTracksCount
-        is APlaylist -> parent.realTracksCount
-        is AArtist,
-        is AGenre -> parent.tracksCount
+        is AbstractAlbum -> parent.realTracksCount
+        is AbstractPlaylist -> parent.realTracksCount
+        is AbstractArtist,
+        is AbstractGenre -> parent.tracksCount
         else -> medialibrary.audioCount
     } else when(parent) {
-        is AArtist -> parent.searchTracksCount(scope.filterQuery)
-        is AAlbum -> parent.searchTracksCount(scope.filterQuery)
-        is AGenre -> parent.searchTracksCount(scope.filterQuery)
-        is APlaylist -> parent.searchTracksCount(scope.filterQuery)
+        is AbstractArtist -> parent.searchTracksCount(scope.filterQuery)
+        is AbstractAlbum -> parent.searchTracksCount(scope.filterQuery)
+        is AbstractGenre -> parent.searchTracksCount(scope.filterQuery)
+        is AbstractPlaylist -> parent.searchTracksCount(scope.filterQuery)
         else ->medialibrary.getAudioCount(scope.filterQuery)
     }
 }
\ No newline at end of file
diff --git a/vlc-android/src/org/videolan/vlc/providers/medialibrary/VideosProvider.kt b/vlc-android/src/org/videolan/vlc/providers/medialibrary/VideosProvider.kt
index 878ed0ffce..0f92690198 100644
--- a/vlc-android/src/org/videolan/vlc/providers/medialibrary/VideosProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/providers/medialibrary/VideosProvider.kt
@@ -22,40 +22,40 @@ package org.videolan.vlc.providers.medialibrary
 
 import android.content.Context
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AFolder
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractFolder
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.media.getAll
 import org.videolan.vlc.viewmodels.SortableModel
 
 
 @ExperimentalCoroutinesApi
-class VideosProvider(val folder : AFolder?, context: Context, scope: SortableModel) : MedialibraryProvider<AMediaWrapper>(context, scope){
+class VideosProvider(val folder : AbstractFolder?, context: Context, scope: SortableModel) : MedialibraryProvider<AbstractMediaWrapper>(context, scope){
 
     override fun canSortByFileNameName() = true
     override fun canSortByDuration() = true
     override fun canSortByLastModified() = folder == null
 
     override fun getTotalCount() = if (scope.filterQuery == null) when {
-        folder !== null -> folder.mediaCount(AFolder.TYPE_FOLDER_VIDEO)
+        folder !== null -> folder.mediaCount(AbstractFolder.TYPE_FOLDER_VIDEO)
         else -> medialibrary.videoCount
     } else when {
-        folder !== null -> folder.searchTracksCount(scope.filterQuery, AFolder.TYPE_FOLDER_VIDEO)
+        folder !== null -> folder.searchTracksCount(scope.filterQuery, AbstractFolder.TYPE_FOLDER_VIDEO)
         else -> medialibrary.getVideoCount(scope.filterQuery)
     }
 
-    override fun getPage(loadSize: Int, startposition: Int): Array<AMediaWrapper> {
+    override fun getPage(loadSize: Int, startposition: Int): Array<AbstractMediaWrapper> {
         val list = if (scope.filterQuery == null) when {
-            folder !== null -> folder.media(AFolder.TYPE_FOLDER_VIDEO, sort, scope.desc, loadSize, startposition)
+            folder !== null -> folder.media(AbstractFolder.TYPE_FOLDER_VIDEO, sort, scope.desc, loadSize, startposition)
             else -> medialibrary.getPagedVideos(sort, scope.desc, loadSize, startposition)
         } else when {
-            folder !== null -> folder.searchTracks(scope.filterQuery, AFolder.TYPE_FOLDER_VIDEO, sort, scope.desc, loadSize, startposition)
+            folder !== null -> folder.searchTracks(scope.filterQuery, AbstractFolder.TYPE_FOLDER_VIDEO, sort, scope.desc, loadSize, startposition)
             else -> medialibrary.searchVideo(scope.filterQuery, sort, scope.desc, loadSize, startposition)
         }
         return list.also { completeHeaders(it, startposition) }
     }
 
-    override fun getAll(): Array<AMediaWrapper> = when {
-        folder !== null -> folder.getAll(AFolder.TYPE_FOLDER_VIDEO, sort, scope.desc).toTypedArray()
+    override fun getAll(): Array<AbstractMediaWrapper> = when {
+        folder !== null -> folder.getAll(AbstractFolder.TYPE_FOLDER_VIDEO, sort, scope.desc).toTypedArray()
         else -> medialibrary.videos
     }
 }
\ No newline at end of file
diff --git a/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt b/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt
index e41094a2a6..07e0254ca9 100644
--- a/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt
+++ b/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt
@@ -26,7 +26,7 @@ import android.net.Uri
 import androidx.annotation.WorkerThread
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.tools.IOScopedObject
 import org.videolan.tools.SingletonHolder
 import org.videolan.vlc.ExternalMonitor
@@ -56,7 +56,7 @@ class BrowserFavRepository(private val browserFavDao: BrowserFavDao) : IOScopedO
     }
 
     val networkFavorites by lazy {
-        MediatorLiveData<List<AMediaWrapper>>().apply {
+        MediatorLiveData<List<AbstractMediaWrapper>>().apply {
             addSource(networkFavs) { value = convertFavorites(it).filterNetworkFavs() }
             addSource(ExternalMonitor.connected) {
                 launch(Dispatchers.Main.immediate) {
@@ -72,13 +72,13 @@ class BrowserFavRepository(private val browserFavDao: BrowserFavDao) : IOScopedO
 
     fun deleteBrowserFav(uri: Uri) = launch { browserFavDao.delete(uri) }
 
-    private fun List<AMediaWrapper>.filterNetworkFavs() : List<AMediaWrapper> {
+    private fun List<AbstractMediaWrapper>.filterNetworkFavs() : List<AbstractMediaWrapper> {
         return when {
             isEmpty() -> this
             !ExternalMonitor.isConnected -> emptyList()
             !ExternalMonitor.allowLan() -> {
                 val schemes = Arrays.asList("ftp", "sftp", "ftps", "http", "https")
-                mutableListOf<AMediaWrapper>().apply { this@filterNetworkFavs.filterTo(this) { schemes.contains(it.uri.scheme) } }
+                mutableListOf<AbstractMediaWrapper>().apply { this@filterNetworkFavs.filterTo(this) { schemes.contains(it.uri.scheme) } }
             }
             else -> this
         }
diff --git a/vlc-android/src/org/videolan/vlc/repository/DirectoryRepository.kt b/vlc-android/src/org/videolan/vlc/repository/DirectoryRepository.kt
index ed2464031a..9b2a8885f2 100644
--- a/vlc-android/src/org/videolan/vlc/repository/DirectoryRepository.kt
+++ b/vlc-android/src/org/videolan/vlc/repository/DirectoryRepository.kt
@@ -7,7 +7,7 @@ import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import org.videolan.libvlc.util.AndroidUtil
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.tools.IOScopedObject
 import org.videolan.tools.SingletonHolder
 import org.videolan.vlc.R
@@ -50,9 +50,9 @@ class DirectoryRepository (private val customDirectoryDao: CustomDirectoryDao) :
     companion object : SingletonHolder<DirectoryRepository, Context>({ DirectoryRepository(MediaDatabase.getInstance(it).customDirectoryDao()) })
 }
 
-fun createDirectory(it: String, context: Context): AMediaWrapper {
-    val directory = MLServiceLocator.getAMediaWrapper(AndroidUtil.PathToUri(it))
-    directory.type = AMediaWrapper.TYPE_DIR
+fun createDirectory(it: String, context: Context): AbstractMediaWrapper {
+    val directory = MLServiceLocator.getAbstractMediaWrapper(AndroidUtil.PathToUri(it))
+    directory.type = AbstractMediaWrapper.TYPE_DIR
     if (TextUtils.equals(EXTERNAL_PUBLIC_DIRECTORY, it)) {
         directory.setDisplayTitle(context.resources.getString(R.string.internal_memory))
     } else {
diff --git a/vlc-android/src/org/videolan/vlc/repository/SlaveRepository.kt b/vlc-android/src/org/videolan/vlc/repository/SlaveRepository.kt
index 581f76981e..0b2e48cf8c 100644
--- a/vlc-android/src/org/videolan/vlc/repository/SlaveRepository.kt
+++ b/vlc-android/src/org/videolan/vlc/repository/SlaveRepository.kt
@@ -28,7 +28,7 @@ import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import org.videolan.libvlc.Media
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.tools.IOScopedObject
 import org.videolan.tools.SingletonHolder
 import org.videolan.vlc.database.MediaDatabase
@@ -44,7 +44,7 @@ class SlaveRepository(private val slaveDao:SlaveDao) : IOScopedObject() {
         }
     }
 
-    fun saveSlaves(mw: AMediaWrapper): List<Job>? {
+    fun saveSlaves(mw: AbstractMediaWrapper): List<Job>? {
         return mw.slaves?.let{
             it.map { saveSlave(mw.location, it.type, it.priority, it.uri) }
         }
diff --git a/vlc-android/src/org/videolan/vlc/util/Browserutils.kt b/vlc-android/src/org/videolan/vlc/util/Browserutils.kt
index c604605d6e..28d9234729 100644
--- a/vlc-android/src/org/videolan/vlc/util/Browserutils.kt
+++ b/vlc-android/src/org/videolan/vlc/util/Browserutils.kt
@@ -22,7 +22,7 @@ package org.videolan.vlc.util
 
 import android.net.Uri
 import org.videolan.medialibrary.MLServiceLocator
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.database.models.BrowserFav
 
@@ -33,9 +33,9 @@ fun isSchemeSupported(scheme: String?) = when(scheme) {
 }
 
 fun convertFavorites(browserFavs: List<BrowserFav>?) = browserFavs?.map { (uri, _, title, iconUrl) ->
-    MLServiceLocator.getAMediaWrapper(uri).apply {
+    MLServiceLocator.getAbstractMediaWrapper(uri).apply {
         setDisplayTitle(Uri.decode(title))
-        type = AMediaWrapper.TYPE_DIR
+        type = AbstractMediaWrapper.TYPE_DIR
         iconUrl?.let { artworkURL = Uri.decode(it) }
         setStateFlags(MediaLibraryItem.FLAG_FAVORITE)
     }
diff --git a/vlc-android/src/org/videolan/vlc/util/FileUtils.kt b/vlc-android/src/org/videolan/vlc/util/FileUtils.kt
index 7483d799c4..817fd15f52 100644
--- a/vlc-android/src/org/videolan/vlc/util/FileUtils.kt
+++ b/vlc-android/src/org/videolan/vlc/util/FileUtils.kt
@@ -40,7 +40,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.withContext
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.VLCApplication
 import org.videolan.vlc.media.MediaUtils
@@ -287,7 +287,7 @@ object FileUtils {
         })
     }
 
-    fun canSave(mw: AMediaWrapper?): Boolean {
+    fun canSave(mw: AbstractMediaWrapper?): Boolean {
         if (mw == null || mw.uri == null) return false
         val scheme = mw.uri.scheme
         return (TextUtils.equals(scheme, "file") || TextUtils.equals(scheme, "smb")
diff --git a/vlc-android/src/org/videolan/vlc/util/FilterDelegate.kt b/vlc-android/src/org/videolan/vlc/util/FilterDelegate.kt
index 007a8845f3..1f7ed5d7b7 100644
--- a/vlc-android/src/org/videolan/vlc/util/FilterDelegate.kt
+++ b/vlc-android/src/org/videolan/vlc/util/FilterDelegate.kt
@@ -3,7 +3,7 @@ package org.videolan.vlc.util
 import androidx.lifecycle.MutableLiveData
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.VLCApplication
 import org.videolan.vlc.media.MediaUtils
@@ -45,11 +45,11 @@ open class FilterDelegate<T : MediaLibraryItem>(protected val dataset: MutableLi
     }
 }
 
-class PlaylistFilterDelegate(dataset: MutableLiveData<out List<AMediaWrapper>>) : FilterDelegate<AMediaWrapper>(dataset) {
+class PlaylistFilterDelegate(dataset: MutableLiveData<out List<AbstractMediaWrapper>>) : FilterDelegate<AbstractMediaWrapper>(dataset) {
 
-    override suspend fun filteringJob(charSequence: CharSequence?): MutableList<AMediaWrapper>? {
+    override suspend fun filteringJob(charSequence: CharSequence?): MutableList<AbstractMediaWrapper>? {
         if (charSequence !== null) initSource()?.let { list ->
-            return withContext(Dispatchers.Default) { mutableListOf<AMediaWrapper>().apply {
+            return withContext(Dispatchers.Default) { mutableListOf<AbstractMediaWrapper>().apply {
                 val queryStrings = charSequence.trim().toString().split(" ").asSequence().filter { it.isNotEmpty() }.map { it.toLowerCase() }.toList()
                 for (media in list) {
                     val title = MediaUtils.getMediaTitle(media).toLowerCase()
diff --git a/vlc-android/src/org/videolan/vlc/util/Kextensions.kt b/vlc-android/src/org/videolan/vlc/util/Kextensions.kt
index 0ee3960d2e..32ba8a9e8f 100644
--- a/vlc-android/src/org/videolan/vlc/util/Kextensions.kt
+++ b/vlc-android/src/org/videolan/vlc/util/Kextensions.kt
@@ -21,8 +21,8 @@ import androidx.lifecycle.*
 import kotlinx.coroutines.*
 import org.videolan.libvlc.Media
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.VLCApplication
 import org.videolan.vlc.startMedialibrary
@@ -72,21 +72,21 @@ suspend fun retry (
 }
 
 fun Media?.canExpand() = this != null && (type == Media.Type.Directory || type == Media.Type.Playlist)
-fun AMediaWrapper?.isMedia() = this != null && (type == AMediaWrapper.TYPE_AUDIO || type == AMediaWrapper.TYPE_VIDEO)
-fun AMediaWrapper?.isBrowserMedia() = this != null && (isMedia() || type == AMediaWrapper.TYPE_DIR || type == AMediaWrapper.TYPE_PLAYLIST)
+fun AbstractMediaWrapper?.isMedia() = this != null && (type == AbstractMediaWrapper.TYPE_AUDIO || type == AbstractMediaWrapper.TYPE_VIDEO)
+fun AbstractMediaWrapper?.isBrowserMedia() = this != null && (isMedia() || type == AbstractMediaWrapper.TYPE_DIR || type == AbstractMediaWrapper.TYPE_PLAYLIST)
 
 fun Context.getAppSystemService(name: String) = applicationContext.getSystemService(name)!!
 
 fun Long.random() = (Random().nextFloat() * this).toLong()
 
 @ExperimentalCoroutinesApi
-suspend inline fun <reified T> Context.getFromMl(crossinline block: AMedialibrary.() -> T) = withContext(Dispatchers.IO) {
-    val ml = AMedialibrary.getInstance()
+suspend inline fun <reified T> Context.getFromMl(crossinline block: AbstractMedialibrary.() -> T) = withContext(Dispatchers.IO) {
+    val ml = AbstractMedialibrary.getInstance()
     if (ml.isStarted) block.invoke(ml)
     else {
         val scan = Settings.getInstance(this@getFromMl).getInt(KEY_MEDIALIBRARY_SCAN, ML_SCAN_ON) == ML_SCAN_ON
         suspendCancellableCoroutine { continuation ->
-            val listener = object : AMedialibrary.OnMedialibraryReadyListener {
+            val listener = object : AbstractMedialibrary.OnMedialibraryReadyListener {
                 override fun onMedialibraryReady() {
                     val cb = this
                     if (!continuation.isCompleted) launch(start = CoroutineStart.UNDISPATCHED) {
@@ -105,14 +105,14 @@ suspend inline fun <reified T> Context.getFromMl(crossinline block: AMedialibrar
 }
 
 
-fun List<AMediaWrapper>.getWithMLMeta() : List<AMediaWrapper> {
-    if (this is MutableList<AMediaWrapper>) return updateWithMLMeta()
-    val list = mutableListOf<AMediaWrapper>()
+fun List<AbstractMediaWrapper>.getWithMLMeta() : List<AbstractMediaWrapper> {
+    if (this is MutableList<AbstractMediaWrapper>) return updateWithMLMeta()
+    val list = mutableListOf<AbstractMediaWrapper>()
     val ml = VLCApplication.mlInstance
     for (media in this) {
         if (media.id == 0L) {
             val mw = ml.findMedia(media)
-            if (mw.id != 0L) if (mw.type == AMediaWrapper.TYPE_ALL) mw.type = media.type
+            if (mw.id != 0L) if (mw.type == AbstractMediaWrapper.TYPE_ALL) mw.type = media.type
             list.add(mw)
         }
     }
@@ -120,7 +120,7 @@ fun List<AMediaWrapper>.getWithMLMeta() : List<AMediaWrapper> {
 }
 
 
-fun MutableList<AMediaWrapper>.updateWithMLMeta() : MutableList<AMediaWrapper> {
+fun MutableList<AbstractMediaWrapper>.updateWithMLMeta() : MutableList<AbstractMediaWrapper> {
     val iter = listIterator()
     val ml = VLCApplication.mlInstance
     try {
@@ -129,7 +129,7 @@ fun MutableList<AMediaWrapper>.updateWithMLMeta() : MutableList<AMediaWrapper> {
             if (media.id == 0L) {
                 val mw = ml.findMedia(media)
                 if (mw!!.id != 0L) {
-                    if (mw.type == AMediaWrapper.TYPE_ALL) mw.type = media.getType()
+                    if (mw.type == AbstractMediaWrapper.TYPE_ALL) mw.type = media.getType()
                     iter.set(mw)
                 }
             }
diff --git a/vlc-android/src/org/videolan/vlc/util/ModelsHelper.kt b/vlc-android/src/org/videolan/vlc/util/ModelsHelper.kt
index a82e605795..c0bc784b2c 100644
--- a/vlc-android/src/org/videolan/vlc/util/ModelsHelper.kt
+++ b/vlc-android/src/org/videolan/vlc/util/ModelsHelper.kt
@@ -7,10 +7,10 @@ import kotlinx.coroutines.withContext
 import org.videolan.libvlc.Media
 import org.videolan.libvlc.MediaPlayer
 
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AAlbum
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
-import org.videolan.medialibrary.interfaces.media.APlaylist
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist
 import org.videolan.medialibrary.media.DummyItem
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.PlaybackService
@@ -38,9 +38,9 @@ object ModelsHelper {
     internal suspend fun splitList(sort: Int, items: Collection<MediaLibraryItem>) = withContext(Dispatchers.IO) {
         val array = mutableMapOf<String, MutableList<MediaLibraryItem>>()
         when (sort) {
-            AMedialibrary.SORT_DEFAULT,
-            AMedialibrary.SORT_FILENAME,
-            AMedialibrary.SORT_ALPHA -> {
+            AbstractMedialibrary.SORT_DEFAULT,
+            AbstractMedialibrary.SORT_FILENAME,
+            AbstractMedialibrary.SORT_ALPHA -> {
                 var currentLetter: String? = null
                 for (item in items) {
                     if (item.itemType == MediaLibraryItem.TYPE_DUMMY) continue
@@ -53,7 +53,7 @@ object ModelsHelper {
                     array[letter]?.add(item)
                 }
             }
-            AMedialibrary.SORT_DURATION -> {
+            AbstractMedialibrary.SORT_DURATION -> {
                 var currentLengthCategory: String? = null
                 for (item in items) {
                     if (item.itemType == MediaLibraryItem.TYPE_DUMMY) continue
@@ -66,7 +66,7 @@ object ModelsHelper {
                     array[currentLengthCategory]?.add(item)
                 }
             }
-            AMedialibrary.SORT_RELEASEDATE -> {
+            AbstractMedialibrary.SORT_RELEASEDATE -> {
                 var currentYear: String? = null
                 for (item in items) {
                     if (item.itemType == MediaLibraryItem.TYPE_DUMMY) continue
@@ -78,11 +78,11 @@ object ModelsHelper {
                     array[currentYear]?.add(item)
                 }
             }
-            AMedialibrary.SORT_ARTIST -> {
+            AbstractMedialibrary.SORT_ARTIST -> {
                 var currentArtist: String? = null
                 for (item in items) {
                     if (item.itemType == MediaLibraryItem.TYPE_DUMMY) continue
-                    val artist = (item as AMediaWrapper).artist ?: ""
+                    val artist = (item as AbstractMediaWrapper).artist ?: ""
                     if (currentArtist === null || !TextUtils.equals(currentArtist, artist)) {
                         currentArtist = artist
                         if (array[currentArtist].isNullOrEmpty()) array[currentArtist] = mutableListOf()
@@ -90,11 +90,11 @@ object ModelsHelper {
                     array[currentArtist]?.add(item)
                 }
             }
-            AMedialibrary.SORT_ALBUM -> {
+            AbstractMedialibrary.SORT_ALBUM -> {
                 var currentAlbum: String? = null
                 for (item in items) {
                     if (item.itemType == MediaLibraryItem.TYPE_DUMMY) continue
-                    val album = (item as AMediaWrapper).album ?: ""
+                    val album = (item as AbstractMediaWrapper).album ?: ""
                     if (currentAlbum === null || !TextUtils.equals(currentAlbum, album)) {
                         currentAlbum = album
                         if (array[currentAlbum].isNullOrEmpty()) array[currentAlbum] = mutableListOf()
@@ -103,7 +103,7 @@ object ModelsHelper {
                 }
             }
         }
-        if (sort == AMedialibrary.SORT_DEFAULT || sort == AMedialibrary.SORT_FILENAME || sort == AMedialibrary.SORT_ALPHA)
+        if (sort == AbstractMedialibrary.SORT_DEFAULT || sort == AbstractMedialibrary.SORT_FILENAME || sort == AbstractMedialibrary.SORT_ALPHA)
             array.toSortedMap()
         else array
     }
@@ -113,9 +113,9 @@ object ModelsHelper {
     }
 
     fun getHeader(context: Context?, sort: Int, item: MediaLibraryItem, aboveItem: MediaLibraryItem?) = if (context !== null) when (sort) {
-        AMedialibrary.SORT_DEFAULT,
-        AMedialibrary.SORT_FILENAME,
-        AMedialibrary.SORT_ALPHA -> {
+        AbstractMedialibrary.SORT_DEFAULT,
+        AbstractMedialibrary.SORT_FILENAME,
+        AbstractMedialibrary.SORT_ALPHA -> {
             val letter = if (item.title.isEmpty() || !Character.isLetter(item.title[0]) || ModelsHelper.isSpecialItem(item)) "#" else item.title.substring(0, 1).toUpperCase()
             if (aboveItem == null) letter
             else {
@@ -123,7 +123,7 @@ object ModelsHelper {
                 if (letter != previous) letter else null
             }
         }
-        AMedialibrary.SORT_DURATION -> {
+        AbstractMedialibrary.SORT_DURATION -> {
             val length = getLength(item)
             val lengthCategory = lengthToCategory(length)
             if (aboveItem == null) lengthCategory
@@ -132,7 +132,7 @@ object ModelsHelper {
                 if (lengthCategory != previous) lengthCategory else null
             }
         }
-        AMedialibrary.SORT_RELEASEDATE -> {
+        AbstractMedialibrary.SORT_RELEASEDATE -> {
             val year = getYear(item)
             if (aboveItem == null) year
             else {
@@ -140,28 +140,28 @@ object ModelsHelper {
                 if (year != previous) year else null
             }
         }
-        AMedialibrary.SORT_LASTMODIFICATIONDATE -> {
-            val timestamp = (item as AMediaWrapper).lastModified
+        AbstractMedialibrary.SORT_LASTMODIFICATIONDATE -> {
+            val timestamp = (item as AbstractMediaWrapper).lastModified
             val category = getTimeCategory(timestamp)
             if (aboveItem == null) getTimeCategoryString(context, category)
             else {
-                val prevCat = getTimeCategory((aboveItem as AMediaWrapper).lastModified)
+                val prevCat = getTimeCategory((aboveItem as AbstractMediaWrapper).lastModified)
                 if (prevCat != category) getTimeCategoryString(context, category) else null
             }
         }
-        AMedialibrary.SORT_ARTIST -> {
-            val artist = (item as AMediaWrapper).artist ?: ""
+        AbstractMedialibrary.SORT_ARTIST -> {
+            val artist = (item as AbstractMediaWrapper).artist ?: ""
             if (aboveItem == null) artist
             else {
-                val previous = (aboveItem as AMediaWrapper).artist ?: ""
+                val previous = (aboveItem as AbstractMediaWrapper).artist ?: ""
                 if (artist != previous) artist else null
             }
         }
-        AMedialibrary.SORT_ALBUM -> {
-            val album = (item as AMediaWrapper).album ?: ""
+        AbstractMedialibrary.SORT_ALBUM -> {
+            val album = (item as AbstractMediaWrapper).album ?: ""
             if (aboveItem == null) album
             else {
-                val previous = (aboveItem as AMediaWrapper).album ?: ""
+                val previous = (aboveItem as AbstractMediaWrapper).album ?: ""
                 if (album != previous) album else null
             }
         }
@@ -189,12 +189,12 @@ object ModelsHelper {
 
     private fun isSpecialItem(item: MediaLibraryItem) = item.itemType == MediaLibraryItem.TYPE_ARTIST
             && (item.id == 1L || item.id == 2L) || item.itemType == MediaLibraryItem.TYPE_ALBUM
-            && item.title == AAlbum.SpecialRes.UNKNOWN_ALBUM
+            && item.title == AbstractAlbum.SpecialRes.UNKNOWN_ALBUM
 
     private fun getLength(media: MediaLibraryItem): Int {
         return when {
-            media.itemType == MediaLibraryItem.TYPE_ALBUM -> (media as AAlbum).duration
-            media.itemType == MediaLibraryItem.TYPE_MEDIA -> (media as AMediaWrapper).length.toInt()
+            media.itemType == MediaLibraryItem.TYPE_ALBUM -> (media as AbstractAlbum).duration
+            media.itemType == MediaLibraryItem.TYPE_MEDIA -> (media as AbstractMediaWrapper).length.toInt()
             else -> 0
         }
     }
@@ -218,22 +218,22 @@ object ModelsHelper {
 
     private fun getYear(media: MediaLibraryItem): String {
         return when (media.itemType) {
-            MediaLibraryItem.TYPE_ALBUM -> if ((media as AAlbum).releaseYear == 0) "-" else media.releaseYear.toString()
-            MediaLibraryItem.TYPE_MEDIA -> if ((media as AMediaWrapper).date == null) "-" else media.date
+            MediaLibraryItem.TYPE_ALBUM -> if ((media as AbstractAlbum).releaseYear == 0) "-" else media.releaseYear.toString()
+            MediaLibraryItem.TYPE_MEDIA -> if ((media as AbstractMediaWrapper).date == null) "-" else media.date
             else -> "-"
         }
     }
 
     fun getTracksCount(media: MediaLibraryItem): Int {
         return when (media.itemType) {
-            MediaLibraryItem.TYPE_ALBUM -> (media as AAlbum).tracksCount
-            MediaLibraryItem.TYPE_PLAYLIST -> (media as APlaylist).tracksCount
+            MediaLibraryItem.TYPE_ALBUM -> (media as AbstractAlbum).tracksCount
+            MediaLibraryItem.TYPE_PLAYLIST -> (media as AbstractPlaylist).tracksCount
             else -> 0
         }
     }
 }
 
-object EmptyMLCallbacks : AMedialibrary.MediaCb, AMedialibrary.ArtistsCb, AMedialibrary.AlbumsCb, AMedialibrary.GenresCb, AMedialibrary.PlaylistsCb {
+object EmptyMLCallbacks : AbstractMedialibrary.MediaCb, AbstractMedialibrary.ArtistsCb, AbstractMedialibrary.AlbumsCb, AbstractMedialibrary.GenresCb, AbstractMedialibrary.PlaylistsCb {
     override fun onMediaAdded() {}
     override fun onMediaModified() {}
     override fun onMediaDeleted() {}
@@ -262,31 +262,31 @@ interface RefreshModel {
 }
 
 fun SortableModel.canSortBy(sort: Int) = when (sort) {
-    AMedialibrary.SORT_DEFAULT -> true
-    AMedialibrary.SORT_ALPHA -> canSortByName()
-    AMedialibrary.SORT_FILENAME -> canSortByFileNameName()
-    AMedialibrary.SORT_DURATION -> canSortByDuration()
-    AMedialibrary.SORT_INSERTIONDATE -> canSortByInsertionDate()
-    AMedialibrary.SORT_LASTMODIFICATIONDATE -> canSortByLastModified()
-    AMedialibrary.SORT_RELEASEDATE -> canSortByReleaseDate()
-    AMedialibrary.SORT_FILESIZE -> canSortByFileSize()
-    AMedialibrary.SORT_ARTIST -> canSortByArtist()
-    AMedialibrary.SORT_ALBUM -> canSortByAlbum()
-    AMedialibrary.SORT_PLAYCOUNT -> canSortByPlayCount()
+    AbstractMedialibrary.SORT_DEFAULT -> true
+    AbstractMedialibrary.SORT_ALPHA -> canSortByName()
+    AbstractMedialibrary.SORT_FILENAME -> canSortByFileNameName()
+    AbstractMedialibrary.SORT_DURATION -> canSortByDuration()
+    AbstractMedialibrary.SORT_INSERTIONDATE -> canSortByInsertionDate()
+    AbstractMedialibrary.SORT_LASTMODIFICATIONDATE -> canSortByLastModified()
+    AbstractMedialibrary.SORT_RELEASEDATE -> canSortByReleaseDate()
+    AbstractMedialibrary.SORT_FILESIZE -> canSortByFileSize()
+    AbstractMedialibrary.SORT_ARTIST -> canSortByArtist()
+    AbstractMedialibrary.SORT_ALBUM -> canSortByAlbum()
+    AbstractMedialibrary.SORT_PLAYCOUNT -> canSortByPlayCount()
     else -> false
 }
 
 fun MedialibraryProvider<*>.canSortBy(sort: Int) = when (sort) {
-    AMedialibrary.SORT_DEFAULT -> true
-    AMedialibrary.SORT_ALPHA -> canSortByName()
-    AMedialibrary.SORT_FILENAME -> canSortByFileNameName()
-    AMedialibrary.SORT_DURATION -> canSortByDuration()
-    AMedialibrary.SORT_INSERTIONDATE -> canSortByInsertionDate()
-    AMedialibrary.SORT_LASTMODIFICATIONDATE -> canSortByLastModified()
-    AMedialibrary.SORT_RELEASEDATE -> canSortByReleaseDate()
-    AMedialibrary.SORT_FILESIZE -> canSortByFileSize()
-    AMedialibrary.SORT_ARTIST -> canSortByArtist()
-    AMedialibrary.SORT_ALBUM -> canSortByAlbum()
-    AMedialibrary.SORT_PLAYCOUNT -> canSortByPlayCount()
+    AbstractMedialibrary.SORT_DEFAULT -> true
+    AbstractMedialibrary.SORT_ALPHA -> canSortByName()
+    AbstractMedialibrary.SORT_FILENAME -> canSortByFileNameName()
+    AbstractMedialibrary.SORT_DURATION -> canSortByDuration()
+    AbstractMedialibrary.SORT_INSERTIONDATE -> canSortByInsertionDate()
+    AbstractMedialibrary.SORT_LASTMODIFICATIONDATE -> canSortByLastModified()
+    AbstractMedialibrary.SORT_RELEASEDATE -> canSortByReleaseDate()
+    AbstractMedialibrary.SORT_FILESIZE -> canSortByFileSize()
+    AbstractMedialibrary.SORT_ARTIST -> canSortByArtist()
+    AbstractMedialibrary.SORT_ALBUM -> canSortByAlbum()
+    AbstractMedialibrary.SORT_PLAYCOUNT -> canSortByPlayCount()
     else -> false
 }
\ No newline at end of file
diff --git a/vlc-android/src/org/videolan/vlc/util/ThumbnailsProvider.kt b/vlc-android/src/org/videolan/vlc/util/ThumbnailsProvider.kt
index d88e749854..b8936c8ce1 100644
--- a/vlc-android/src/org/videolan/vlc/util/ThumbnailsProvider.kt
+++ b/vlc-android/src/org/videolan/vlc/util/ThumbnailsProvider.kt
@@ -13,10 +13,10 @@ import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.withContext
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.AMedialibrary.THUMBS_FOLDER_NAME
-import org.videolan.medialibrary.interfaces.media.AFolder
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary.THUMBS_FOLDER_NAME
+import org.videolan.medialibrary.interfaces.media.AbstractFolder
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.VLCApplication
 import org.videolan.vlc.gui.helpers.AudioUtil.readCoverBitmap
@@ -41,22 +41,21 @@ object ThumbnailsProvider {
     private val lock = Any()
 
     @WorkerThread
-    fun getFolderThumbnail(folder: AFolder, width: Int): Bitmap? {
-        val media = listOf(*folder.media(AFolder.TYPE_FOLDER_VIDEO, AMedialibrary.SORT_DEFAULT, true, 4, 0))
+    fun getFolderThumbnail(folder: AbstractFolder, width: Int): Bitmap? {
+        val media = listOf(*folder.media(AbstractFolder.TYPE_FOLDER_VIDEO, AbstractMedialibrary.SORT_DEFAULT, true, 4, 0))
         return getComposedImage("folder:" + folder.title, media, width)
     }
 
     @WorkerThread
-    fun getMediaThumbnail(item: AMediaWrapper, width: Int): Bitmap? {
-        if (item.type == AMediaWrapper.TYPE_GROUP) return getComposedImage("group:" + item.title, (item as MediaGroup).all, width)
-        return if (item.type == AMediaWrapper.TYPE_VIDEO && TextUtils.isEmpty(item.artworkMrl))
+    fun getMediaThumbnail(item: AbstractMediaWrapper, width: Int): Bitmap? {
+        return if (item.type == AbstractMediaWrapper.TYPE_VIDEO && TextUtils.isEmpty(item.artworkMrl))
             getVideoThumbnail(item, width)
         else
             readCoverBitmap(Uri.decode(item.artworkMrl), width)
     }
 
     fun getMediaCacheKey(isMedia: Boolean, item: MediaLibraryItem): String? {
-        if (isMedia && (item as AMediaWrapper).type == AMediaWrapper.TYPE_VIDEO && TextUtils.isEmpty(item.getArtworkMrl())) {
+        if (isMedia && (item as AbstractMediaWrapper).type == AbstractMediaWrapper.TYPE_VIDEO && TextUtils.isEmpty(item.getArtworkMrl())) {
             if (appDir == null) appDir = VLCApplication.appContext.getExternalFilesDir(null)
             val hasCache = appDir != null && appDir!!.exists()
             if (hasCache && cacheDir == null) cacheDir = appDir!!.absolutePath + THUMBS_FOLDER_NAME
@@ -66,7 +65,7 @@ object ThumbnailsProvider {
     }
 
     @WorkerThread
-    fun getVideoThumbnail(media: AMediaWrapper, width: Int): Bitmap? {
+    fun getVideoThumbnail(media: AbstractMediaWrapper, width: Int): Bitmap? {
         val filePath = media.uri.path ?: return null
         if (appDir == null) appDir = VLCApplication.appContext.getExternalFilesDir(null)
         val hasCache = appDir?.exists() == true
@@ -86,12 +85,12 @@ object ThumbnailsProvider {
                 media.artworkURL = thumbPath
             }
         } else if (media.id != 0L) {
-            AMedialibrary.getInstance().requestThumbnail(media.id)
+            AbstractMedialibrary.getInstance().requestThumbnail(media.id)
         }
         return bitmap
     }
 
-    suspend fun getPlaylistImage(key: String, mediaList: List<AMediaWrapper>, width: Int): Bitmap? {
+    suspend fun getPlaylistImage(key: String, mediaList: List<AbstractMediaWrapper>, width: Int): Bitmap? {
         var composedImage = BitmapCache.getBitmapFromMemCache(key)
         if (composedImage == null) {
             composedImage = composePlaylistImage(mediaList, width)
@@ -105,7 +104,7 @@ object ThumbnailsProvider {
      * @param mediaList The track list of the playlist
      * @return a Bitmap object
      */
-    private suspend fun composePlaylistImage(mediaList: List<AMediaWrapper>, width: Int): Bitmap? {
+    private suspend fun composePlaylistImage(mediaList: List<AbstractMediaWrapper>, width: Int): Bitmap? {
         if (mediaList.isEmpty()) {
             return null
         }
@@ -117,7 +116,7 @@ object ThumbnailsProvider {
             return obtainBitmap(mediaList[0], width)
         }
 
-        val artworks = ArrayList<AMediaWrapper>()
+        val artworks = ArrayList<AbstractMediaWrapper>()
         for (mediaWrapper in mediaList) {
 
             val artworkAlreadyHere = artworks.any { it.artworkURL == mediaWrapper.artworkURL }
@@ -169,15 +168,15 @@ object ThumbnailsProvider {
 
     suspend fun obtainBitmap(item: MediaLibraryItem, width: Int) = withContext(Dispatchers.IO) {
         when (item) {
-            is AMediaWrapper -> getMediaThumbnail(item, width)
-            is AFolder -> getFolderThumbnail(item, width)
+            is AbstractMediaWrapper -> getMediaThumbnail(item, width)
+            is AbstractFolder -> getFolderThumbnail(item, width)
             else -> readCoverBitmap(Uri.decode(item.artworkMrl), width)
         }
     }
 
 
     @WorkerThread
-    fun getComposedImage(key: String, mediaList: List<AMediaWrapper>, width: Int): Bitmap? {
+    fun getComposedImage(key: String, mediaList: List<AbstractMediaWrapper>, width: Int): Bitmap? {
         var composedImage = BitmapCache.getBitmapFromMemCache(key)
         if (composedImage == null) {
             composedImage = composeImage(mediaList, width)
@@ -191,7 +190,7 @@ object ThumbnailsProvider {
      * @param mediaList The media list from which will extract thumbnails
      * @return a Bitmap object
      */
-    private fun composeImage(mediaList: List<AMediaWrapper>, imageWidth: Int): Bitmap? {
+    private fun composeImage(mediaList: List<AbstractMediaWrapper>, imageWidth: Int): Bitmap? {
         val sourcesImages = arrayOfNulls<Bitmap>(min(MAX_IMAGES, mediaList.size))
         var count = 0
         var minWidth = Integer.MAX_VALUE
diff --git a/vlc-android/src/org/videolan/vlc/util/TvChannels.kt b/vlc-android/src/org/videolan/vlc/util/TvChannels.kt
index 9a4c3abb39..ac1bf01edf 100644
--- a/vlc-android/src/org/videolan/vlc/util/TvChannels.kt
+++ b/vlc-android/src/org/videolan/vlc/util/TvChannels.kt
@@ -31,7 +31,7 @@ import androidx.annotation.RequiresApi
 import androidx.tvprovider.media.tv.TvContractCompat
 import androidx.tvprovider.media.tv.WatchNextProgram
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.BuildConfig
 import org.videolan.vlc.PreviewVideoInputService
 import org.videolan.vlc.R
@@ -91,7 +91,7 @@ fun Context.launchChannelUpdate() = AppScope.launch {
     updatePrograms(this@launchChannelUpdate, id)
 }
 
-suspend fun setResumeProgram(context: Context, mw: AMediaWrapper) {
+suspend fun setResumeProgram(context: Context, mw: AbstractMediaWrapper) {
     var cursor: Cursor? = null
     var isProgramPresent = false
     val mw = context.getFromMl { findMedia(mw) }
@@ -133,7 +133,7 @@ suspend fun setResumeProgram(context: Context, mw: AMediaWrapper) {
 
 }
 
-private suspend fun AMediaWrapper.artUri() : Uri {
+private suspend fun AbstractMediaWrapper.artUri() : Uri {
     if (!isThumbnailGenerated) {
         withContext(Dispatchers.IO) { ThumbnailsProvider.getVideoThumbnail(this@artUri, 512) }
     }
diff --git a/vlc-android/src/org/videolan/vlc/util/Util.kt b/vlc-android/src/org/videolan/vlc/util/Util.kt
index 0e99e0cc99..b2435c236d 100644
--- a/vlc-android/src/org/videolan/vlc/util/Util.kt
+++ b/vlc-android/src/org/videolan/vlc/util/Util.kt
@@ -30,7 +30,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import org.videolan.libvlc.Dialog
 import org.videolan.libvlc.util.AndroidUtil
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.R
 import org.videolan.vlc.VLCApplication
 import org.videolan.vlc.gui.helpers.hf.WriteExternalDelegate
@@ -135,7 +135,7 @@ object Util {
         })
     }
 
-    fun checkWritePermission(activity: FragmentActivity, media: AMediaWrapper, callback: Runnable): Boolean {
+    fun checkWritePermission(activity: FragmentActivity, media: AbstractMediaWrapper, callback: Runnable): Boolean {
         val uri = media.uri
         if ("file" != uri.scheme) return false
         if (uri.path!!.startsWith(AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY)) {
diff --git a/vlc-android/src/org/videolan/vlc/util/VLCOptions.kt b/vlc-android/src/org/videolan/vlc/util/VLCOptions.kt
index 708c276231..316b12a007 100644
--- a/vlc-android/src/org/videolan/vlc/util/VLCOptions.kt
+++ b/vlc-android/src/org/videolan/vlc/util/VLCOptions.kt
@@ -32,7 +32,7 @@ import org.videolan.libvlc.MediaPlayer
 import org.videolan.libvlc.util.AndroidUtil
 import org.videolan.libvlc.util.HWDecoderUtil
 import org.videolan.libvlc.util.VLCUtil
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.PlaybackService
 import org.videolan.vlc.R
 import org.videolan.vlc.VLCApplication
@@ -200,10 +200,10 @@ object VLCOptions {
     }
 
     fun setMediaOptions(media: Media, context: Context, flags: Int) {
-        val noHardwareAcceleration = flags and AMediaWrapper.MEDIA_NO_HWACCEL != 0
-        val noVideo = flags and AMediaWrapper.MEDIA_VIDEO == 0
-        val benchmark = flags and AMediaWrapper.MEDIA_BENCHMARK != 0
-        val paused = flags and AMediaWrapper.MEDIA_PAUSED != 0
+        val noHardwareAcceleration = flags and AbstractMediaWrapper.MEDIA_NO_HWACCEL != 0
+        val noVideo = flags and AbstractMediaWrapper.MEDIA_VIDEO == 0
+        val benchmark = flags and AbstractMediaWrapper.MEDIA_BENCHMARK != 0
+        val paused = flags and AbstractMediaWrapper.MEDIA_PAUSED != 0
         var hardwareAcceleration = HW_ACCELERATION_DISABLED
         val prefs = Settings.getInstance(context)
 
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/HistoryModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/HistoryModel.kt
index 2362405b91..a93b177b2b 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/HistoryModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/HistoryModel.kt
@@ -25,9 +25,9 @@ import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 
-class HistoryModel(context: Context) : MedialibraryModel<AMediaWrapper>(context) {
+class HistoryModel(context: Context) : MedialibraryModel<AbstractMediaWrapper>(context) {
 
     override fun canSortByName() = false
 
@@ -35,7 +35,7 @@ class HistoryModel(context: Context) : MedialibraryModel<AMediaWrapper>(context)
         dataset.value = withContext(Dispatchers.Default) { medialibrary.lastMediaPlayed().toMutableList() }
     }
 
-    fun moveUp(media: AMediaWrapper) {
+    fun moveUp(media: AbstractMediaWrapper) {
         dataset.value = dataset.value.apply {
             remove(media)
             add(0, media)
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/MedialibraryModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/MedialibraryModel.kt
index 7afc36bdfe..a795afa515 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/MedialibraryModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/MedialibraryModel.kt
@@ -23,14 +23,14 @@ package org.videolan.vlc.viewmodels
 import android.content.Context
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.media.MediaLibraryItem
 
 @ObsoleteCoroutinesApi
 @ExperimentalCoroutinesApi
-abstract class MedialibraryModel<T : MediaLibraryItem>(context: Context) : BaseModel<T>(context), AMedialibrary.OnMedialibraryReadyListener, AMedialibrary.OnDeviceChangeListener {
+abstract class MedialibraryModel<T : MediaLibraryItem>(context: Context) : BaseModel<T>(context), AbstractMedialibrary.OnMedialibraryReadyListener, AbstractMedialibrary.OnDeviceChangeListener {
 
-    val medialibrary = AMedialibrary.getInstance()
+    val medialibrary = AbstractMedialibrary.getInstance()
 
     init {
         medialibrary.apply {
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/MedialibraryViewModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/MedialibraryViewModel.kt
index 9295c37a98..2e64236a92 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/MedialibraryViewModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/MedialibraryViewModel.kt
@@ -1,15 +1,15 @@
 package org.videolan.vlc.viewmodels
 
 import android.content.Context
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.providers.medialibrary.MedialibraryProvider
 
 
 abstract class MedialibraryViewModel(context: Context) : SortableModel(context),
-        AMedialibrary.OnMedialibraryReadyListener, AMedialibrary.OnDeviceChangeListener  {
+        AbstractMedialibrary.OnMedialibraryReadyListener, AbstractMedialibrary.OnDeviceChangeListener  {
 
-    val medialibrary = AMedialibrary.getInstance().apply {
+    val medialibrary = AbstractMedialibrary.getInstance().apply {
         addOnMedialibraryReadyListener(this@MedialibraryViewModel)
         addOnDeviceChangeListener(this@MedialibraryViewModel)
     }
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
index ba299214f7..b4d7042fde 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
@@ -29,7 +29,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.launch
 import org.videolan.medialibrary.Tools
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.vlc.PlaybackService
 import org.videolan.vlc.media.PlaylistManager
 import org.videolan.vlc.util.EmptyPBSCallback
@@ -42,8 +42,8 @@ import org.videolan.vlc.util.REPEAT_NONE
 class PlaylistModel : ScopedModel(), PlaybackService.Callback by EmptyPBSCallback, Observer<PlaybackService> {
 
     var service: PlaybackService? = null
-    val dataset = LiveDataset<AMediaWrapper>()
-    private var originalDataset : MutableList<AMediaWrapper>? = null
+    val dataset = LiveDataset<AbstractMediaWrapper>()
+    private var originalDataset : MutableList<AbstractMediaWrapper>? = null
     val selection : Int
         get() = if (filtering) -1 else service?.playlistManager?.currentIndex ?: -1
     private var filtering = false
@@ -65,7 +65,7 @@ class PlaylistModel : ScopedModel(), PlaybackService.Callback by EmptyPBSCallbac
 
     override fun update() {
         service?.run {
-            dataset.value = medias.toMutableList()
+            dataset.value = media.toMutableList()
             playerState.value = PlayerState(isPlaying, title, artist)
         }
     }
@@ -73,7 +73,7 @@ class PlaylistModel : ScopedModel(), PlaybackService.Callback by EmptyPBSCallbac
     val hasMedia
         get() = service?.hasMedia() ?: false
 
-    fun insertMedia(position: Int, media: AMediaWrapper) = service?.insertItem(position, media)
+    fun insertMedia(position: Int, media: AbstractMediaWrapper) = service?.insertItem(position, media)
 
     fun remove(position: Int) = service?.remove(position)
 
@@ -103,7 +103,7 @@ class PlaylistModel : ScopedModel(), PlaybackService.Callback by EmptyPBSCallbac
         super.onCleared()
     }
 
-    fun getPlaylistPosition(position: Int, media: AMediaWrapper): Int {
+    fun getPlaylistPosition(position: Int, media: AbstractMediaWrapper): Int {
         val list = originalDataset ?: dataset.value
         if (position in 0 until list.size && list[position] == media) return position
         else {
@@ -164,24 +164,24 @@ class PlaylistModel : ScopedModel(), PlaybackService.Callback by EmptyPBSCallbac
             service?.repeatType = value
         }
 
-    val currentMediaWrapper : AMediaWrapper?
+    val currentMediaWrapper : AbstractMediaWrapper?
         get() = service?.currentMediaWrapper
 
     val currentMediaPosition : Int
         get() = service?.currentMediaPosition ?: -1
 
     val medias
-        get() = service?.medias
+        get() = service?.media
 
     fun shuffle() = service?.shuffle()
 
-    fun load(medialist: List<AMediaWrapper>, position: Int) = service?.load(medialist, position)
+    fun load(medialist: List<AbstractMediaWrapper>, position: Int) = service?.load(medialist, position)
 
     fun switchToVideo() : Boolean {
         service?.apply {
             if (PlaylistManager.hasMedia() && !isVideoPlaying && !hasRenderer()) {
                 currentMediaWrapper?.run {
-                    if (!hasFlag(AMediaWrapper.MEDIA_FORCE_AUDIO) && canSwitchToVideo()) {
+                    if (!hasFlag(AbstractMediaWrapper.MEDIA_FORCE_AUDIO) && canSwitchToVideo()) {
                         switchToVideo()
                         return true
                     }
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/SortableModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/SortableModel.kt
index ba06b90354..cd0c3f88d0 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/SortableModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/SortableModel.kt
@@ -1,7 +1,7 @@
 package org.videolan.vlc.viewmodels
 
 import android.content.Context
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.vlc.util.RefreshModel
 import org.videolan.vlc.util.Settings
 import org.videolan.vlc.util.canSortBy
@@ -9,7 +9,7 @@ import org.videolan.vlc.util.canSortBy
 abstract class SortableModel(protected val context: Context): ScopedModel(), RefreshModel {
 
     protected open val sortKey : String = this.javaClass.simpleName
-    var sort = AMedialibrary.SORT_DEFAULT
+    var sort = AbstractMedialibrary.SORT_DEFAULT
     var desc = false
 
     var filterQuery : String? = null
@@ -30,7 +30,7 @@ abstract class SortableModel(protected val context: Context): ScopedModel(), Ref
     open fun sort(sort: Int) {
         if (canSortBy(sort)) {
             desc = when (this.sort) {
-                AMedialibrary.SORT_DEFAULT -> sort == AMedialibrary.SORT_ALPHA
+                AbstractMedialibrary.SORT_DEFAULT -> sort == AbstractMedialibrary.SORT_ALPHA
                 sort -> !desc
                 else -> false
             }
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt
index edd9299e19..84e712c928 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt
@@ -27,10 +27,10 @@ import androidx.lifecycle.ViewModelProvider
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 
 
-class StreamsModel(context: Context) : MedialibraryModel<AMediaWrapper>(context) {
+class StreamsModel(context: Context) : MedialibraryModel<AbstractMediaWrapper>(context) {
      val observableSearchText = ObservableField<String>()
 
     init {
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/browser/BrowserModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/browser/BrowserModel.kt
index 8feb3d6c39..4c0c2a769e 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/browser/BrowserModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/browser/BrowserModel.kt
@@ -27,7 +27,7 @@ import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelProviders
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.providers.*
 import org.videolan.vlc.repository.DirectoryRepository
@@ -67,9 +67,9 @@ open class BrowserModel(context: Context, val url: String?, type: Int, showHidde
         }
     }
 
-    fun saveList(media: AMediaWrapper) = provider.saveList(media)
+    fun saveList(media: AbstractMediaWrapper) = provider.saveList(media)
 
-    fun isFolderEmpty(mw: AMediaWrapper) = provider.isFolderEmpty(mw)
+    fun isFolderEmpty(mw: AbstractMediaWrapper) = provider.isFolderEmpty(mw)
 
     fun getDescriptionUpdate() = provider.descriptionUpdate
 
@@ -99,10 +99,10 @@ open class BrowserModel(context: Context, val url: String?, type: Int, showHidde
 private val ascComp by lazy {
     Comparator<MediaLibraryItem> { item1, item2 ->
         if (item1?.itemType == MediaLibraryItem.TYPE_MEDIA) {
-            val type1 = (item1 as AMediaWrapper).type
-            val type2 = (item2 as AMediaWrapper).type
-            if (type1 == AMediaWrapper.TYPE_DIR && type2 != AMediaWrapper.TYPE_DIR) return@Comparator -1
-            else if (type1 != AMediaWrapper.TYPE_DIR && type2 == AMediaWrapper.TYPE_DIR) return@Comparator 1
+            val type1 = (item1 as AbstractMediaWrapper).type
+            val type2 = (item2 as AbstractMediaWrapper).type
+            if (type1 == AbstractMediaWrapper.TYPE_DIR && type2 != AbstractMediaWrapper.TYPE_DIR) return@Comparator -1
+            else if (type1 != AbstractMediaWrapper.TYPE_DIR && type2 == AbstractMediaWrapper.TYPE_DIR) return@Comparator 1
         }
         item1?.title?.toLowerCase()?.compareTo(item2?.title?.toLowerCase() ?: "") ?: -1
     }
@@ -110,10 +110,10 @@ private val ascComp by lazy {
 private val descComp by lazy {
     Comparator<MediaLibraryItem> { item1, item2 ->
         if (item1?.itemType == MediaLibraryItem.TYPE_MEDIA) {
-            val type1 = (item1 as AMediaWrapper).type
-            val type2 = (item2 as AMediaWrapper).type
-            if (type1 == AMediaWrapper.TYPE_DIR && type2 != AMediaWrapper.TYPE_DIR) return@Comparator -1
-            else if (type1 != AMediaWrapper.TYPE_DIR && type2 == AMediaWrapper.TYPE_DIR) return@Comparator 1
+            val type1 = (item1 as AbstractMediaWrapper).type
+            val type2 = (item2 as AbstractMediaWrapper).type
+            if (type1 == AbstractMediaWrapper.TYPE_DIR && type2 != AbstractMediaWrapper.TYPE_DIR) return@Comparator -1
+            else if (type1 != AbstractMediaWrapper.TYPE_DIR && type2 == AbstractMediaWrapper.TYPE_DIR) return@Comparator 1
         }
         item2?.title?.toLowerCase()?.compareTo(item1?.title?.toLowerCase() ?: "") ?: -1
     }
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/mobile/AlbumSongsViewModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/mobile/AlbumSongsViewModel.kt
index 8aae81406b..2d6529d7a2 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/mobile/AlbumSongsViewModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/mobile/AlbumSongsViewModel.kt
@@ -26,9 +26,9 @@ import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelProviders
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AAlbum
-import org.videolan.medialibrary.interfaces.media.AArtist
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum
+import org.videolan.medialibrary.interfaces.media.AbstractArtist
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.gui.audio.AudioAlbumsSongsFragment
 import org.videolan.vlc.providers.medialibrary.AlbumsProvider
@@ -38,9 +38,9 @@ import org.videolan.vlc.viewmodels.MedialibraryViewModel
 
 @ExperimentalCoroutinesApi
 class AlbumSongsViewModel(context: Context, val parent: MediaLibraryItem) : MedialibraryViewModel(context),
-        AMedialibrary.MediaCb,
-        AMedialibrary.ArtistsCb by EmptyMLCallbacks,
-        AMedialibrary.AlbumsCb by EmptyMLCallbacks {
+        AbstractMedialibrary.MediaCb,
+        AbstractMedialibrary.ArtistsCb by EmptyMLCallbacks,
+        AbstractMedialibrary.AlbumsCb by EmptyMLCallbacks {
 
     val albumsProvider = AlbumsProvider(parent, context, this)
     val tracksProvider = TracksProvider(parent, context, this)
@@ -48,8 +48,8 @@ class AlbumSongsViewModel(context: Context, val parent: MediaLibraryItem) : Medi
 
     init {
         when (parent) {
-            is AArtist -> medialibrary.addArtistsCb(this@AlbumSongsViewModel)
-            is AAlbum -> medialibrary.addAlbumsCb(this@AlbumSongsViewModel)
+            is AbstractArtist -> medialibrary.addArtistsCb(this@AlbumSongsViewModel)
+            is AbstractAlbum -> medialibrary.addAlbumsCb(this@AlbumSongsViewModel)
             else -> medialibrary.addMediaCb(this@AlbumSongsViewModel)
         }
     }
@@ -66,8 +66,8 @@ class AlbumSongsViewModel(context: Context, val parent: MediaLibraryItem) : Medi
 
     override fun onCleared() {
         when (parent) {
-            is AArtist -> medialibrary.removeArtistsCb(this)
-            is AAlbum -> medialibrary.removeAlbumsCb(this)
+            is AbstractArtist -> medialibrary.removeArtistsCb(this)
+            is AbstractAlbum -> medialibrary.removeAlbumsCb(this)
             else -> medialibrary.removeMediaCb(this)
         }
         super.onCleared()
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/mobile/AudioBrowserViewModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/mobile/AudioBrowserViewModel.kt
index 54a4b3b7fa..4e9a4049d3 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/mobile/AudioBrowserViewModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/mobile/AudioBrowserViewModel.kt
@@ -26,7 +26,7 @@ import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelProviders
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.AMedialibrary
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
 import org.videolan.vlc.gui.audio.AudioBrowserFragment
 import org.videolan.vlc.providers.medialibrary.AlbumsProvider
 import org.videolan.vlc.providers.medialibrary.ArtistsProvider
@@ -40,10 +40,10 @@ import org.videolan.vlc.viewmodels.MedialibraryViewModel
 
 @ExperimentalCoroutinesApi
 class AudioBrowserViewModel(context: Context) : MedialibraryViewModel(context),
-        AMedialibrary.MediaCb,
-        AMedialibrary.ArtistsCb by EmptyMLCallbacks,
-        AMedialibrary.AlbumsCb by EmptyMLCallbacks,
-        AMedialibrary.GenresCb by EmptyMLCallbacks {
+        AbstractMedialibrary.MediaCb,
+        AbstractMedialibrary.ArtistsCb by EmptyMLCallbacks,
+        AbstractMedialibrary.AlbumsCb by EmptyMLCallbacks,
+        AbstractMedialibrary.GenresCb by EmptyMLCallbacks {
 
     val artistsProvider = ArtistsProvider(context, this, true)
     val albumsProvider = AlbumsProvider(null, context, this)
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/mobile/FoldersViewModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/mobile/FoldersViewModel.kt
index 3a1abb9aee..268e31bf9e 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/mobile/FoldersViewModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/mobile/FoldersViewModel.kt
@@ -25,7 +25,7 @@ import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelProviders
 import kotlinx.coroutines.*
-import org.videolan.medialibrary.interfaces.media.AFolder
+import org.videolan.medialibrary.interfaces.media.AbstractFolder
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.gui.folders.FoldersFragment
 import org.videolan.vlc.media.MediaUtils
@@ -51,12 +51,12 @@ class FoldersViewModel(context: Context, val type : Int) : MedialibraryViewModel
         list?.let { MediaUtils.appendMedia(context, it) }
     }
 
-    fun playSelection(selection: List<AFolder>) = launch {
+    fun playSelection(selection: List<AbstractFolder>) = launch {
         val list = selection.flatMap { it.getAll() }
         MediaUtils.openList(context, list, 0)
     }
 
-    fun appendSelection(selection: List<AFolder>) = launch {
+    fun appendSelection(selection: List<AbstractFolder>) = launch {
         val list = selection.flatMap { it.getAll() }
         MediaUtils.appendMedia(context, list)
     }
@@ -71,4 +71,4 @@ class FoldersViewModel(context: Context, val type : Int) : MedialibraryViewModel
 
 @ObsoleteCoroutinesApi
 @ExperimentalCoroutinesApi
-internal fun FoldersFragment.getViewModel() = ViewModelProviders.of(requireActivity(), FoldersViewModel.Factory(requireContext(), AFolder.TYPE_FOLDER_VIDEO)).get(FoldersViewModel::class.java)
+internal fun FoldersFragment.getViewModel() = ViewModelProviders.of(requireActivity(), FoldersViewModel.Factory(requireContext(), AbstractFolder.TYPE_FOLDER_VIDEO)).get(FoldersViewModel::class.java)
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/mobile/PlaylistViewModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/mobile/PlaylistViewModel.kt
index 8f97780c14..6ead82a7d3 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/mobile/PlaylistViewModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/mobile/PlaylistViewModel.kt
@@ -26,9 +26,9 @@ import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelProviders
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AAlbum
-import org.videolan.medialibrary.interfaces.media.APlaylist
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractAlbum
+import org.videolan.medialibrary.interfaces.media.AbstractPlaylist
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.gui.PlaylistActivity
 import org.videolan.vlc.providers.medialibrary.MedialibraryProvider
@@ -39,16 +39,16 @@ import org.videolan.vlc.viewmodels.MedialibraryViewModel
 
 @ExperimentalCoroutinesApi
 class PlaylistViewModel(context: Context, val playlist: MediaLibraryItem) : MedialibraryViewModel(context),
-        AMedialibrary.MediaCb by EmptyMLCallbacks,
-        AMedialibrary.AlbumsCb by EmptyMLCallbacks,
-        AMedialibrary.PlaylistsCb by EmptyMLCallbacks {
+        AbstractMedialibrary.MediaCb by EmptyMLCallbacks,
+        AbstractMedialibrary.AlbumsCb by EmptyMLCallbacks,
+        AbstractMedialibrary.PlaylistsCb by EmptyMLCallbacks {
     val tracksProvider = TracksProvider(playlist, context, this)
     override val providers : Array<MedialibraryProvider<out MediaLibraryItem>> = arrayOf(tracksProvider)
 
     init {
         when (playlist) {
-            is APlaylist -> medialibrary.addPlaylistCb(this@PlaylistViewModel)
-            is AAlbum -> medialibrary.addAlbumsCb(this@PlaylistViewModel)
+            is AbstractPlaylist -> medialibrary.addPlaylistCb(this@PlaylistViewModel)
+            is AbstractAlbum -> medialibrary.addAlbumsCb(this@PlaylistViewModel)
             else -> medialibrary.addMediaCb(this@PlaylistViewModel)
         }
     }
@@ -67,8 +67,8 @@ class PlaylistViewModel(context: Context, val playlist: MediaLibraryItem) : Medi
 
     override fun onCleared() {
         when (playlist) {
-            is APlaylist -> medialibrary.removePlaylistCb(this)
-            is AAlbum -> medialibrary.removeAlbumsCb(this)
+            is AbstractPlaylist -> medialibrary.removePlaylistCb(this)
+            is AbstractAlbum -> medialibrary.removeAlbumsCb(this)
             else -> medialibrary.removeMediaCb(this)
         }
         super.onCleared()
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/mobile/VideosViewModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/mobile/VideosViewModel.kt
index 70578b8c75..6605e8f24d 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/mobile/VideosViewModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/mobile/VideosViewModel.kt
@@ -26,7 +26,7 @@ import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelProviders
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
-import org.videolan.medialibrary.interfaces.media.AFolder
+import org.videolan.medialibrary.interfaces.media.AbstractFolder
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.gui.video.VideoGridFragment
 import org.videolan.vlc.providers.medialibrary.MedialibraryProvider
@@ -34,11 +34,11 @@ import org.videolan.vlc.providers.medialibrary.VideosProvider
 import org.videolan.vlc.viewmodels.MedialibraryViewModel
 
 @ExperimentalCoroutinesApi
-class VideosViewModel(context: Context, val folder: AFolder?) : MedialibraryViewModel(context) {
+class VideosViewModel(context: Context, val folder: AbstractFolder?) : MedialibraryViewModel(context) {
     val provider = VideosProvider(folder, context, this)
     override val providers: Array<MedialibraryProvider<out MediaLibraryItem>> = arrayOf(provider)
 
-    class Factory(val context: Context, val folder: AFolder?): ViewModelProvider.NewInstanceFactory() {
+    class Factory(val context: Context, val folder: AbstractFolder?): ViewModelProvider.NewInstanceFactory() {
         override fun <T : ViewModel> create(modelClass: Class<T>): T {
             @Suppress("UNCHECKED_CAST")
             return VideosViewModel(context.applicationContext, folder) as T
@@ -48,4 +48,4 @@ class VideosViewModel(context: Context, val folder: AFolder?) : MedialibraryView
 
 @ExperimentalCoroutinesApi
 @ObsoleteCoroutinesApi
-internal fun VideoGridFragment.getViewModel(folder: AFolder?) = ViewModelProviders.of(requireActivity(), VideosViewModel.Factory(requireContext(), folder)).get(VideosViewModel::class.java)
\ No newline at end of file
+internal fun VideoGridFragment.getViewModel(folder: AbstractFolder?) = ViewModelProviders.of(requireActivity(), VideosViewModel.Factory(requireContext(), folder)).get(VideosViewModel::class.java)
\ No newline at end of file
diff --git a/vlc-android/src/org/videolan/vlc/viewmodels/tv/MainTvModel.kt b/vlc-android/src/org/videolan/vlc/viewmodels/tv/MainTvModel.kt
index a8db09959d..ce505089cd 100644
--- a/vlc-android/src/org/videolan/vlc/viewmodels/tv/MainTvModel.kt
+++ b/vlc-android/src/org/videolan/vlc/viewmodels/tv/MainTvModel.kt
@@ -30,8 +30,8 @@ import androidx.lifecycle.*
 import kotlinx.coroutines.*
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.channels.actor
-import org.videolan.medialibrary.interfaces.AMedialibrary
-import org.videolan.medialibrary.interfaces.media.AMediaWrapper
+import org.videolan.medialibrary.interfaces.AbstractMedialibrary
+import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper
 import org.videolan.medialibrary.media.DummyItem
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.vlc.ExternalMonitor
@@ -56,15 +56,15 @@ private const val TAG = "MainTvModel"
 
 @ObsoleteCoroutinesApi
 @ExperimentalCoroutinesApi
-class MainTvModel(app: Application) : AndroidViewModel(app), AMedialibrary.OnMedialibraryReadyListener,
-        AMedialibrary.OnDeviceChangeListener, CoroutineScope by MainScope() {
+class MainTvModel(app: Application) : AndroidViewModel(app), AbstractMedialibrary.OnMedialibraryReadyListener,
+        AbstractMedialibrary.OnDeviceChangeListener, CoroutineScope by MainScope() {
 
     val context = getApplication<Application>().baseContext!!
-    private val medialibrary = AMedialibrary.getInstance()
+    private val medialibrary = AbstractMedialibrary.getInstance()
     val settings = Settings.getInstance(context)
     private val showInternalStorage = AndroidDevices.showInternalStorage()
     private val browserFavRepository = BrowserFavRepository.getInstance(context)
-    private var updatedFavoritList: List<AMediaWrapper> = listOf()
+    private var updatedFavoritList: List<AbstractMediaWrapper> = listOf()
     var showHistory = false
         private set
     // LiveData
@@ -73,7 +73,7 @@ class MainTvModel(app: Application) : AndroidViewModel(app), AMedialibrary.OnMed
     val videos: LiveData<List<MediaLibraryItem>> = MutableLiveData()
     val audioCategories: LiveData<List<MediaLibraryItem>> = MutableLiveData()
     val browsers: LiveData<List<MediaLibraryItem>> = MutableLiveData()
-    val history: LiveData<List<AMediaWrapper>> = MutableLiveData()
+    val history: LiveData<List<AbstractMediaWrapper>> = MutableLiveData()
     val playlist: LiveData<List<MediaLibraryItem>> = MutableLiveData()
 
     private val nowPlayingDelegate = NowPlayingDelegate(this)
@@ -129,7 +129,7 @@ class MainTvModel(app: Application) : AndroidViewModel(app), AMedialibrary.OnMed
 
     private fun updateVideos() = launch {
         context.getFromMl {
-            getPagedVideos(AMedialibrary.SORT_INSERTIONDATE, true, NUM_ITEMS_PREVIEW, 0)
+            getPagedVideos(AbstractMedialibrary.SORT_INSERTIONDATE, true, NUM_ITEMS_PREVIEW, 0)
         }.let {
             (videos as MutableLiveData).value = mutableListOf<MediaLibraryItem>().apply {
                 add(DummyItem(HEADER_VIDEO, context.getString(R.string.videos_all), context.resources.getQuantityString(R.plurals.videos_quantity, it.size, it.size)))
@@ -150,7 +150,7 @@ class MainTvModel(app: Application) : AndroidViewModel(app), AMedialibrary.OnMed
 
     private fun updatePlaylists() = launch {
         context.getFromMl {
-            getPagedPlaylists(AMedialibrary.SORT_INSERTIONDATE, true, NUM_ITEMS_PREVIEW, 0)
+            getPagedPlaylists(AbstractMedialibrary.SORT_INSERTIONDATE, true, NUM_ITEMS_PREVIEW, 0)
         }.let {
             (playlist as MutableLiveData).value = mutableListOf<MediaLibraryItem>().apply {
                 //                add(DummyItem(HEADER_PLAYLISTS, context.getString(R.string.playlists), ""))
@@ -215,8 +215,8 @@ class MainTvModel(app: Application) : AndroidViewModel(app), AMedialibrary.OnMed
 
     fun open(activity: FragmentActivity, item: Any?) {
         when (item) {
-            is AMediaWrapper -> when {
-                item.type == AMediaWrapper.TYPE_DIR -> {
+            is AbstractMediaWrapper -> when {
+                item.type == AbstractMediaWrapper.TYPE_DIR -> {
                     val intent = Intent(activity, VerticalGridActivity::class.java)
                     intent.putExtra(MainTvActivity.BROWSER_TYPE, if ("file" == item.uri.scheme) HEADER_DIRECTORIES else HEADER_NETWORK)
                     intent.data = item.uri
@@ -224,7 +224,7 @@ class MainTvModel(app: Application) : AndroidViewModel(app), AMedialibrary.OnMed
                 }
                 else -> {
                     MediaUtils.openMedia(activity, item)
-                    if (item.type == AMediaWrapper.TYPE_AUDIO) {
+                    if (item.type == AbstractMediaWrapper.TYPE_AUDIO) {
                         activity.startActivity(Intent(activity, AudioPlayerActivity::class.java))
                     }
                 }
diff --git a/vlc-android/test-common/org/videolan/vlc/util/TestUtil.kt b/vlc-android/test-common/org/videolan/vlc/util/TestUtil.kt
index 4814be9d0a..b17bae9fb0 100644
--- a/vlc-android/test-common/org/videolan/vlc/util/TestUtil.kt
+++ b/vlc-android/test-common/org/videolan/vlc/util/TestUtil.kt
@@ -31,7 +31,7 @@ import java.io.File
 object TestUtil {
     private const val fakeUri: String = "https://www.videolan.org/fake_"
     private const val fakeSubUri: String = "/storage/emulated/0/Android/data/org.videolan.vlc.debug/files/subs/"
-    private const val fakeMediaUri: String = "/storage/emulated/0/Android/data/org.videolan.vlc.debug/files/medias/"
+    private const val fakeMediaUri: String = "/storage/emulated/0/Android/data/org.videolan.vlc.debug/files/media/"
 
     fun createLocalFav(uri: Uri, title: String, iconUrl: String?): BrowserFav {
         return BrowserFav(uri, TYPE_LOCAL_FAV, title, iconUrl)
-- 
GitLab