diff --git a/src/rust/amadeus-rs/amadeus-lib/src/actions.rs b/src/rust/amadeus-rs/amadeus-lib/src/actions.rs
index 78c54dfd29c75b9a7be29b1b865f7605a745031c..00743374e7532fc96385bff8827cd4a44950ae49 100644
--- a/src/rust/amadeus-rs/amadeus-lib/src/actions.rs
+++ b/src/rust/amadeus-rs/amadeus-lib/src/actions.rs
@@ -39,6 +39,9 @@ pub enum Action {
     /// Disconnect from lektord.
     DisconnectFromLektord,
 
+    /// Refresh the list of playlists
+    RefreshPlaylists,
+
     PlaybackPrevious,
     PlaybackPlay,
     PlaybackPause,
@@ -47,25 +50,27 @@ pub enum Action {
 
 impl std::fmt::Debug for Action {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        use Action::*;
         match self {
-            Self::PlayFromKara => write!(f, "PlayFromKara"),
-            Self::DeleteKaraFromQueue => write!(f, "DeleteKaraFromQueue"),
-            Self::InsertKaraInQueue => write!(f, "InsertKaraInQueue"),
-            Self::AddKaraToQueue => write!(f, "AddKaraToQueue"),
-            Self::AddKaraToPlaylist => write!(f, "AddKaraToPlaylist"),
-            Self::DeleteKaraFromPlaylist(arg0) => {
+            PlayFromKara => write!(f, "PlayFromKara"),
+            DeleteKaraFromQueue => write!(f, "DeleteKaraFromQueue"),
+            InsertKaraInQueue => write!(f, "InsertKaraInQueue"),
+            AddKaraToQueue => write!(f, "AddKaraToQueue"),
+            AddKaraToPlaylist => write!(f, "AddKaraToPlaylist"),
+            DeleteKaraFromPlaylist(arg0) => {
                 f.debug_tuple("DeleteKaraFromPlaylist").field(arg0).finish()
             }
-            Self::OpenPlaylist => write!(f, "OpenPlaylist"),
-            Self::AddPlaylistToQueue => write!(f, "AddPlaylistToQueue"),
-            Self::InsertPlaylistToQueue => write!(f, "InsertPlaylistToQueue"),
-            Self::ClearPlaylistContent => write!(f, "ClearPlaylistContent"),
-            Self::ConnectToLektord => write!(f, "ConnectToLektord"),
-            Self::DisconnectFromLektord => write!(f, "DisconnectFromLektord"),
-            Self::PlaybackPrevious => write!(f, "PlaybackPrevious"),
-            Self::PlaybackPlay => write!(f, "PlaybackPlay"),
-            Self::PlaybackPause => write!(f, "PlaybackPause"),
-            Self::PlaybackNext => write!(f, "PlaybackNext"),
+            OpenPlaylist => write!(f, "OpenPlaylist"),
+            AddPlaylistToQueue => write!(f, "AddPlaylistToQueue"),
+            InsertPlaylistToQueue => write!(f, "InsertPlaylistToQueue"),
+            ClearPlaylistContent => write!(f, "ClearPlaylistContent"),
+            ConnectToLektord => write!(f, "ConnectToLektord"),
+            DisconnectFromLektord => write!(f, "DisconnectFromLektord"),
+            PlaybackPrevious => write!(f, "PlaybackPrevious"),
+            PlaybackPlay => write!(f, "PlaybackPlay"),
+            PlaybackPause => write!(f, "PlaybackPause"),
+            PlaybackNext => write!(f, "PlaybackNext"),
+            RefreshPlaylists => write!(f, "RefreshPlaylists"),
         }
     }
 }
@@ -93,5 +98,7 @@ pub fn get_card_action_name(act: &Action) -> &'static str {
         PlaybackPlay => "Play",
         PlaybackPause => "Pause",
         PlaybackNext => "Next",
+
+        RefreshPlaylists => "Refresh playlists",
     }
 }
diff --git a/src/rust/amadeus-rs/amadeus/src/amadeus.rs b/src/rust/amadeus-rs/amadeus/src/amadeus.rs
index 1782856cef98caa1e8c158a07ba68dd511ae4c00..6d33cb273c2a4099c7272ff4df8edc02de047a41 100644
--- a/src/rust/amadeus-rs/amadeus/src/amadeus.rs
+++ b/src/rust/amadeus-rs/amadeus/src/amadeus.rs
@@ -3,15 +3,15 @@ use amadeus_lib::{
     actions,
     deamon::{self, CommandDeamon, Deamon, StatusDeamon},
 };
-use amadeus_macro::{either, then_some};
+use amadeus_macro::*;
 use eframe::{egui, App};
 use lkt_lib::{
     Kara, LektorCurrentKaraInnerResponse, LektorPlaybackStatusResponse, LektorQuery,
-    LektorResponse, LektorState,
+    LektorResponse, LektorState, Playlist,
 };
-use log::debug;
+use log::*;
 use std::{
-    sync::mpsc::{Receiver, Sender},
+    sync::mpsc::{Receiver, SendError, Sender},
     time,
 };
 
@@ -55,6 +55,13 @@ pub struct Amadeus<'a> {
     amadeus_logo_texture: Option<egui::TextureHandle>,
 }
 
+fn handle_sender_error(e: Result<(), SendError<LektorQuery>>) {
+    if let Err(e) = e {
+        let query = e.0;
+        error!("error while sending commands {query:?} to command deamon")
+    }
+}
+
 impl Default for Amadeus<'_> {
     fn default() -> Self {
         Self {
@@ -170,6 +177,9 @@ impl Amadeus<'_> {
                     self.playlist_store.render(ui, self.config.dark_mode);
                 });
         }
+        if self.playlist_store.refresh_playlists() {
+            self.actions.push(actions::Action::RefreshPlaylists);
+        }
     }
 
     fn render_central_panel(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
@@ -360,7 +370,11 @@ impl Amadeus<'_> {
                 match event {
                     PlaybackStatus(_) => todo!(),
                     CurrentKara(_) => todo!(),
-                    PlaylistSet(_) => todo!(),
+                    PlaylistSet(set) => {
+                        self.playlist_store.clear_playlists();
+                        set.into_iter()
+                            .for_each(|plt| self.playlist_store.create(Playlist { name: plt }))
+                    }
                     EmptyResponse(_) => todo!(),
                     KaraSet(_) => todo!(),
                 }
@@ -423,7 +437,8 @@ impl Amadeus<'_> {
 
                 // This should not occure on items because they are global
                 // actions.
-                PlaybackPrevious
+                RefreshPlaylists
+                | PlaybackPrevious
                 | PlaybackPlay
                 | PlaybackPause
                 | PlaybackNext
@@ -470,6 +485,12 @@ impl Amadeus<'_> {
                     debug!("Execute action {act:?} on lektor")
                 }
 
+                RefreshPlaylists => {
+                    if let Some(((sender, _), _)) = &self.deamon {
+                        handle_sender_error(sender.send(LektorQuery::ListAllPlaylists))
+                    }
+                }
+
                 _ => unreachable!(),
             }
         }
diff --git a/src/rust/amadeus-rs/amadeus/src/cards/card.rs b/src/rust/amadeus-rs/amadeus/src/cards/card.rs
index 7511f154e052089b6f0b2b6819692f271ab140ec..ee9ea5e4b788f1a973b17d76fd95d49a77cfd744 100644
--- a/src/rust/amadeus-rs/amadeus/src/cards/card.rs
+++ b/src/rust/amadeus-rs/amadeus/src/cards/card.rs
@@ -65,7 +65,13 @@ impl ToString for KaraCard {
 
 impl ToString for PlaylistCard {
     fn to_string(&self) -> String {
-        format!("{} [#{}]", self.inner.name, self.inner.id)
+        self.inner.name.clone()
+    }
+}
+
+impl AsRef<str> for PlaylistCard {
+    fn as_ref(&self) -> &str {
+        &self.inner.name
     }
 }
 
@@ -200,7 +206,6 @@ impl Card<'_, Playlist> for PlaylistCard {
                 constants::get_text_color(dark_mode),
                 self.inner.name.to_string(),
             );
-            ui.label(format!(" #{}", self.inner.id));
         });
         ui.add_space(constants::PADDING);
     }
@@ -211,7 +216,6 @@ impl Card<'_, Playlist> for PlaylistCard {
                 constants::get_text_color(dark_mode),
                 self.inner.name.to_string(),
             );
-            ui.label(format!(" #{}", self.inner.id));
         });
     }
 
diff --git a/src/rust/amadeus-rs/amadeus/src/widgets/playlists.rs b/src/rust/amadeus-rs/amadeus/src/widgets/playlists.rs
index 0c478bcd1c1a6f5eecbd1e6f7b9f4737eff724fd..0376bb772395011a732f1cb6b45a81d303fe38ff 100644
--- a/src/rust/amadeus-rs/amadeus/src/widgets/playlists.rs
+++ b/src/rust/amadeus-rs/amadeus/src/widgets/playlists.rs
@@ -26,6 +26,9 @@ pub struct PlaylistsStore {
     /// A temp buffer for handling actions on a specific item, where we know the
     /// id to put but not the render function.
     temp_actions: Vec<actions::Action>,
+
+    /// Whever to refresh all the playlists or not
+    refresh_playlists: bool,
 }
 
 impl Default for PlaylistsStore {
@@ -36,6 +39,7 @@ impl Default for PlaylistsStore {
             playlists_to_show: HashMap::with_capacity(DEFAULT_HASHSET_SIZE),
             actions: Vec::new(),
             temp_actions: Vec::new(),
+            refresh_playlists: false,
         }
     }
 }
@@ -132,7 +136,9 @@ impl PlaylistsStore {
             ui.add_space(constants::PADDING);
             ui.horizontal(|ui| {
                 ui.style_mut().override_text_style = Some(utils::font::heading1());
-                ui.colored_label(constants::get_text_color(dark_mode), "🗀 Playlists");
+                ui.add(egui::widgets::Button::new("🗀 Playlists").frame(false))
+                    .clicked()
+                    .then(|| self.refresh_playlists = true);
                 ui.style_mut().override_text_style = Some(utils::font::small_body());
             });
             ui.style_mut().override_text_style = Some(utils::font::body());
@@ -200,6 +206,19 @@ impl PlaylistsStore {
         }
     }
 
+    pub fn refresh_playlists(&mut self) -> bool {
+        let refresh = self.refresh_playlists;
+        self.refresh_playlists = false;
+        refresh
+    }
+
+    pub fn clear_playlists(&mut self) {
+        self.contents.clear();
+        self.playlists_to_show.clear();
+        self.actions.clear();
+        self.playlists.clear();
+    }
+
     pub fn create(&mut self, plt: Playlist) {
         self.contents.insert(
             plt.unique_id(),
diff --git a/src/rust/amadeus-rs/lkt-lib/src/types.rs b/src/rust/amadeus-rs/lkt-lib/src/types.rs
index 1c3b7223ad2fbda3850662b383ee94a91374fbf4..cab41589de820bd5f50b231de7888480848eacf2 100644
--- a/src/rust/amadeus-rs/lkt-lib/src/types.rs
+++ b/src/rust/amadeus-rs/lkt-lib/src/types.rs
@@ -26,9 +26,8 @@ pub struct Kara {
     pub is_available: bool,
 }
 
-#[derive(Clone, Eq, serde::Serialize, serde::Deserialize)]
+#[derive(Clone, Eq, serde::Serialize, serde::Deserialize, PartialEq, Hash)]
 pub struct Playlist {
-    pub id: u32,
     pub name: String,
 }
 
@@ -38,12 +37,6 @@ impl PartialEq for Kara {
     }
 }
 
-impl PartialEq for Playlist {
-    fn eq(&self, other: &Self) -> bool {
-        self.id == other.id
-    }
-}
-
 impl LektorType<'_> for Kara {
     fn unique_id(&self) -> u64 {
         private::unique_id(self)
@@ -95,11 +88,3 @@ impl Hash for Kara {
         ((self.id as usize) * 2).hash(state);
     }
 }
-
-/// Sealed implementation of Hash for Playlist.
-impl Hash for Playlist {
-    fn hash<H: Hasher>(&self, state: &mut H) {
-        self.id.hash(state);
-        self.name.hash(state);
-    }
-}