diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/ArtistRowBinder.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/ArtistRowBinder.kt
index 4a38f667..d83385ab 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/ArtistRowBinder.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/ArtistRowBinder.kt
@@ -20,6 +20,7 @@ import com.drakeet.multitype.ItemViewBinder
 import org.koin.core.component.KoinComponent
 import org.moire.ultrasonic.R
 import org.moire.ultrasonic.domain.ArtistOrIndex
+import org.moire.ultrasonic.domain.Identifiable
 import org.moire.ultrasonic.imageloader.ImageLoader
 import org.moire.ultrasonic.util.FileUtil
 import org.moire.ultrasonic.util.Settings
@@ -32,14 +33,16 @@ class ArtistRowBinder(
     val onContextMenuClick: (MenuItem, ArtistOrIndex) -> Boolean,
     private val imageLoader: ImageLoader,
     private val enableSections: Boolean = true
-) : ItemViewBinder<ArtistOrIndex, ArtistRowBinder.ViewHolder>(), KoinComponent {
+) : ItemViewBinder<ArtistOrIndex, ArtistRowBinder.ViewHolder>(),
+    KoinComponent,
+    Utils.SectionedBinder {
 
     val layout = R.layout.list_item_artist
     val contextMenuLayout = R.menu.context_menu_artist
 
     override fun onBindViewHolder(holder: ViewHolder, item: ArtistOrIndex) {
         holder.textView.text = item.name
-        holder.section.text = getSectionForArtist(item)
+        holder.section.text = getSectionForDisplay(item)
         holder.section.isVisible = enableSections
         holder.layout.setOnClickListener { onItemClick(item) }
         holder.layout.setOnLongClickListener {
@@ -70,7 +73,14 @@ class ArtistRowBinder(
         }
     }
 
-    private fun getSectionForArtist(item: ArtistOrIndex): String {
+    override fun getSectionName(item: Identifiable): String {
+        val index = adapter.items.indexOf(item)
+        if (index == -1 || item !is ArtistOrIndex) return ""
+
+        return getSectionFromName(item.name ?: "")
+    }
+
+    private fun getSectionForDisplay(item: ArtistOrIndex): String {
         val index = adapter.items.indexOf(item)
 
         if (index == -1) return " "
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/BaseAdapter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/BaseAdapter.kt
index d4e9da09..55f17f0c 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/BaseAdapter.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/BaseAdapter.kt
@@ -15,6 +15,7 @@ import androidx.recyclerview.widget.AsyncListDiffer
 import androidx.recyclerview.widget.AsyncListDiffer.ListListener
 import androidx.recyclerview.widget.DiffUtil
 import com.drakeet.multitype.MultiTypeAdapter
+import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
 import org.moire.ultrasonic.domain.Identifiable
 import org.moire.ultrasonic.util.BoundedTreeSet
 import timber.log.Timber
@@ -26,7 +27,7 @@ import timber.log.Timber
  * It should be kept generic enough that it can be used a Base for all lists in the app.
  */
 @Suppress("unused", "UNUSED_PARAMETER")
-class BaseAdapter<T : Identifiable> : MultiTypeAdapter() {
+class BaseAdapter<T : Identifiable> : MultiTypeAdapter(), FastScrollRecyclerView.SectionedAdapter {
 
     // Update the BoundedTreeSet if selection type is changed
     internal var selectionType: SelectionType = SelectionType.MULTIPLE
@@ -221,4 +222,15 @@ class BaseAdapter<T : Identifiable> : MultiTypeAdapter() {
             return oldItem.id == newItem.id
         }
     }
+
+    override fun getSectionName(position: Int): String {
+        val type = getItemViewType(position)
+        val binder = types.getType<Any>(type).delegate
+
+        if (binder is Utils.SectionedBinder) {
+            return binder.getSectionName(items[position] as Identifiable)
+        }
+
+        return ""
+    }
 }
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/Utils.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/Utils.kt
index e1ea9093..991ae445 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/Utils.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/Utils.kt
@@ -7,6 +7,7 @@ import android.view.View
 import android.widget.PopupMenu
 import org.moire.ultrasonic.R
 import org.moire.ultrasonic.data.ActiveServerProvider
+import org.moire.ultrasonic.domain.Identifiable
 import org.moire.ultrasonic.util.Settings
 import org.moire.ultrasonic.util.Util
 
@@ -69,4 +70,8 @@ object Utils {
             playingImage = Util.getDrawableFromAttribute(context, R.attr.media_play_small)
         }
     }
+
+    interface SectionedBinder {
+        fun getSectionName(item: Identifiable): String
+    }
 }
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt
index ca9b099e..e9f398e2 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt
@@ -517,7 +517,7 @@ open class TrackCollectionFragment : MultiListFragment<MusicDirectory.Child>() {
     private fun moreRandomTracks() {
         val listSize = arguments?.getInt(Constants.INTENT_ALBUM_LIST_SIZE, 0) ?: 0
 
-        moreButton!!.setOnClickListener { it: View? ->
+        moreButton!!.setOnClickListener {
             val offset = requireArguments().getInt(
                 Constants.INTENT_ALBUM_LIST_OFFSET, 0
             ) + listSize
diff --git a/ultrasonic/src/main/res/layout/current_playlist.xml b/ultrasonic/src/main/res/layout/current_playlist.xml
index 3e6eeafb..bad74a52 100644
--- a/ultrasonic/src/main/res/layout/current_playlist.xml
+++ b/ultrasonic/src/main/res/layout/current_playlist.xml
@@ -1,23 +1,34 @@
 <?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout
-    xmlns:a="http://schemas.android.com/apk/res/android"
-    a:orientation="vertical"
+<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     a:layout_width="fill_parent"
-    a:layout_height="fill_parent">
+    a:layout_height="fill_parent"
+    a:orientation="vertical">
 
     <TextView
         a:id="@+id/playlist_empty"
-        a:text="@string/playlist.empty"
         a:layout_width="fill_parent"
         a:layout_height="wrap_content"
-        a:padding="10dip"/>
+        a:padding="10dip"
+        a:text="@string/playlist.empty" />
 
-    <androidx.recyclerview.widget.RecyclerView
+
+    <com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
         a:id="@+id/playlist_view"
         a:layout_width="fill_parent"
         a:layout_height="0dip"
         a:layout_weight="1"
-        a:fastScrollEnabled="true" />
+        a:clipToPadding="false"
+        a:paddingTop="8dp"
+        a:paddingBottom="8dp"
+        app:fastScrollAutoHide="true"
+        app:fastScrollAutoHideDelay="2000"
+        app:fastScrollPopupBackgroundSize="42dp"
+        app:fastScrollPopupBgColor="@color/cyan"
+        app:fastScrollPopupPosition="adjacent"
+        app:fastScrollPopupTextColor="@android:color/primary_text_dark"
+        app:fastScrollPopupTextSize="28sp"
+        app:fastScrollThumbColor="@color/cyan"
+        app:fastScrollTrackColor="@color/dividerColor" />
 
 </LinearLayout>
\ No newline at end of file