diff --git a/amadeus/src/app.rs b/amadeus/src/app.rs
index 1dc0b0bbcc2cd3738f398decba7a3d1e7d43f1f2..86b9c8ec6d6c7805f1c533f03e6d4df4c5bd55ce 100644
--- a/amadeus/src/app.rs
+++ b/amadeus/src/app.rs
@@ -22,7 +22,7 @@ use iced::{
 };
 use iced_aw::{native::Split, split};
 use lektor_lib::{requests::*, ConnectConfigPtr};
-use lektor_payloads::{KId, Kara, PlayState, PlayStateWithCurrent};
+use lektor_payloads::{KId, Kara, KaraFilter, PlayState, PlayStateWithCurrent};
 use lektor_utils::{config::UserConfig, log};
 use std::{future::Future, sync::Arc};
 
@@ -250,6 +250,12 @@ impl Amadeus {
                 playlists::Request::Inner(plt, karalist::Request(req)) => {
                     self.handle_kara_request(req, Some(plt))
                 }
+                playlists::Request::AddTo(name, id) => {
+                    send(add_to_playlist(cfg, name, KaraFilter::KId(id)))
+                }
+                playlists::Request::RemoveFrom(name, id) => {
+                    send(remove_from_playlist(cfg, name, KaraFilter::KId(id)))
+                }
             },
 
             // Search/Database
@@ -315,27 +321,35 @@ impl Amadeus {
             // Need to open a modal to take decision.
             (None, RemoveFromPlaylist(id)) => {
                 let plts = self.playlist_list().to_vec();
-                let on_select = OnPlaylistSelectCallback::new(move |name| {
-                    playlists::Message::RemoveKaraFromPlaylist(name, id.clone()).into()
+                let callback = OnPlaylistSelectCallback::new(move |name| {
+                    Message::from_iter([
+                        playlists::Request::RemoveFrom(name.clone(), id.clone()).into(),
+                        playlists::Message::RemoveKaraFromPlaylist(name, id.clone()).into(),
+                    ])
                 });
-                Command::perform(async {}, |_| {
-                    ShowModal::ChoosePlaylist(plts, on_select).into()
-                })
+                let action = |_| ShowModal::ChoosePlaylist(plts, callback).into();
+                Command::perform(async {}, action)
             }
             (Some(plt), AddToPlaylist(id)) => {
                 let plts = self.playlist_list().to_vec();
-                self.with_kara(id, |kara| {
+                self.with_kara(id.clone(), |kara| {
                     let cb = OnPlaylistSelectCallback::new(move |name| {
-                        playlists::Message::AddKaraToPlaylist(name, kara.clone()).into()
+                        Message::from_iter([
+                            playlists::Request::AddTo(name.clone(), id.clone()).into(),
+                            playlists::Message::AddKaraToPlaylist(name, kara.clone()).into(),
+                        ])
                     });
                     ShowModal::ChoosePlaylistExpect(plt, plts, cb).into()
                 })
             }
             (None, AddToPlaylist(id)) => {
                 let plts = self.playlist_list().to_vec();
-                self.with_kara(id, |kara| {
+                self.with_kara(id.clone(), |kara| {
                     let cb = OnPlaylistSelectCallback::new(move |name| {
-                        playlists::Message::AddKaraToPlaylist(name, kara.clone()).into()
+                        Message::from_iter([
+                            playlists::Request::AddTo(name.clone(), id.clone()).into(),
+                            playlists::Message::AddKaraToPlaylist(name, kara.clone()).into(),
+                        ])
                     });
                     ShowModal::ChoosePlaylist(plts, cb).into()
                 })
diff --git a/amadeus/src/components/mainpanel/playlists.rs b/amadeus/src/components/mainpanel/playlists.rs
index 5d9b4ca456fa0ef3b9ea8cf3be0879461c5dc435..5a5956e9b2a972b7e1470f0438e0ae4c39c575a4 100644
--- a/amadeus/src/components/mainpanel/playlists.rs
+++ b/amadeus/src/components/mainpanel/playlists.rs
@@ -32,6 +32,12 @@ pub enum Request {
     /// Refresh a playlist.
     Refresh(Arc<str>),
 
+    /// Add a [KId] to a playlist.
+    AddTo(Arc<str>, KId),
+
+    /// Remove a [KId] from a playlist.
+    RemoveFrom(Arc<str>, KId),
+
     /// Inner playlist event, wrapper around the [karalist::Request]
     Inner(Arc<str>, karalist::Request),
 }