diff --git a/front/src/components/audio/PlayButton.vue b/front/src/components/audio/PlayButton.vue
index 679f8b795f01cf83031998d2a5078e7cfca5350d..f2a3898622c09852eb6e05b77c549a76bbf9a6ee 100644
--- a/front/src/components/audio/PlayButton.vue
+++ b/front/src/components/audio/PlayButton.vue
@@ -3,11 +3,11 @@
     <button
       title="Add to current queue"
       @click="add"
-      :class="['ui', {loading: isLoading}, {'mini': discrete}, {disabled: playableTracks.length === 0}, 'button']">
+      :class="['ui', {loading: isLoading}, {'mini': discrete}, {disabled: !playable}, 'button']">
       <i class="ui play icon"></i>
       <template v-if="!discrete"><slot>Play</slot></template>
     </button>
-    <div v-if="!discrete" class="ui floating dropdown icon button">
+    <div v-if="!discrete" :class="['ui', {disabled: !playable}, 'floating', 'dropdown', 'icon', 'button']">
       <i class="dropdown icon"></i>
       <div class="menu">
         <div class="item"@click="add"><i class="plus icon"></i> Add to queue</div>
@@ -19,6 +19,7 @@
 </template>
 
 <script>
+import axios from 'axios'
 import logger from '@/logging'
 import jQuery from 'jquery'
 
@@ -27,6 +28,7 @@ export default {
     // we can either have a single or multiple tracks to play when clicked
     tracks: {type: Array, required: false},
     track: {type: Object, required: false},
+    playlist: {type: Object, required: false},
     discrete: {type: Boolean, default: false}
   },
   data () {
@@ -35,8 +37,8 @@ export default {
     }
   },
   created () {
-    if (!this.track & !this.tracks) {
-      logger.default.error('You have to provide either a track or tracks property')
+    if (!this.playlist && !this.track && !this.tracks) {
+      logger.default.error('You have to provide either a track playlist or tracks property')
     }
   },
   mounted () {
@@ -45,19 +47,40 @@ export default {
     }
   },
   computed: {
-    playableTracks () {
-      let tracks
+    playable () {
       if (this.track) {
-        tracks = [this.track]
-      } else {
-        tracks = this.tracks
+        return true
+      } else if (this.tracks) {
+        return this.tracks.length > 0
+      } else if (this.playlist) {
+        return true
       }
-      return tracks.filter(e => {
-        return e.files.length > 0
-      })
+      return false
     }
   },
   methods: {
+    getPlayableTracks () {
+      let self = this
+      let getTracks = new Promise((resolve, reject) => {
+        if (self.track) {
+          resolve([self.track])
+        } else if (self.tracks) {
+          resolve(self.tracks)
+        } else if (self.playlist) {
+          let url = 'playlists/' + self.playlist.id + '/'
+          axios.get(url + 'tracks').then((response) => {
+            resolve(response.data.results.map(plt => {
+              return plt.track
+            }))
+          })
+        }
+      })
+      return getTracks.then((tracks) => {
+        return tracks.filter(e => {
+          return e.files.length > 0
+        })
+      })
+    },
     triggerLoad () {
       let self = this
       this.isLoading = true
@@ -66,15 +89,21 @@ export default {
       }, 500)
     },
     add () {
+      let self = this
       this.triggerLoad()
-      this.$store.dispatch('queue/appendMany', {tracks: this.playableTracks})
+      this.getPlayableTracks().then((tracks) => {
+        self.$store.dispatch('queue/appendMany', {tracks: tracks})
+      })
     },
     addNext (next) {
+      let self = this
       this.triggerLoad()
-      this.$store.dispatch('queue/appendMany', {tracks: this.playableTracks, index: this.$store.state.queue.currentIndex + 1})
-      if (next) {
-        this.$store.dispatch('queue/next')
-      }
+      this.getPlayableTracks().then((tracks) => {
+        self.$store.dispatch('queue/appendMany', {tracks: tracks, index: self.$store.state.queue.currentIndex + 1})
+        if (next) {
+          self.$store.dispatch('queue/next')
+        }
+      })
     }
   }
 }