diff --git a/src/rust/mpris/src/main.rs b/src/rust/mpris/src/main.rs
index 1e9858e9b21966001739fddcfe6a1051d13c2ff4..cd23ce4e42fbb2b3de1ef0d93cf9bc49a99f3fdf 100644
--- a/src/rust/mpris/src/main.rs
+++ b/src/rust/mpris/src/main.rs
@@ -1,18 +1,8 @@
-use std::future::pending;
-use zbus::ConnectionBuilder;
-
 #[tokio::main]
 async fn main() -> Result<(), Box<dyn std::error::Error>> {
-    let (main, player) = mpris::server::build("mpris");
-
-    let _ = ConnectionBuilder::session()?
-        .name("org.mpris.MediaPlayer2.mpris")?
-        .serve_at("/org/mpris/MediaPlayer2", main)?
-        .serve_at("/org/mpris/MediaPlayer2", player)?
-        .build()
-        .await?;
+    let _ = mpris::server::build_session("mpris").await?;
 
     // Do other things or go to wait forever
-    pending::<()>().await;
+    std::future::pending::<()>().await;
     Ok(())
 }
diff --git a/src/rust/mpris/src/server.rs b/src/rust/mpris/src/server.rs
index b748bd65d2ea709c4e1e82d79f639d98ae647976..4b2f86b7ecfea2f4d9682c8355454aaa4e84e7cb 100644
--- a/src/rust/mpris/src/server.rs
+++ b/src/rust/mpris/src/server.rs
@@ -1,9 +1,8 @@
 //! # DBus interface for: `org.mpris.MediaPlayer2`, `org.mpris.MediaPlayer2.Player`
 
-// use crate::types::*;
 use crate::types::*;
 use commons::log;
-use zbus::dbus_interface;
+use zbus::{dbus_interface, Connection, ConnectionBuilder, SignalContext as ZSignalCtx};
 
 macro_rules! str {
     ($str: literal) => {
@@ -11,25 +10,31 @@ macro_rules! str {
     };
 }
 
-pub fn build(identity: impl ToString) -> (MediaPlayer2, MediaPlayer2Player) {
-    (
-        MediaPlayer2 {
-            identity: identity.to_string(),
-        },
-        MediaPlayer2Player {},
-    )
+pub async fn build_session(identity: impl ToString) -> zbus::Result<Connection> {
+    let main = Main {
+        identity: identity.to_string(),
+    };
+    let player = Player {};
+    let track_list = TrackList {};
+    ConnectionBuilder::session()?
+        .name("org.mpris.MediaPlayer2.mpris")?
+        .serve_at("/org/mpris/MediaPlayer2", main)?
+        .serve_at("/org/mpris/MediaPlayer2", player)?
+        .serve_at("/org/mpris/MediaPlayer2", track_list)?
+        .build()
+        .await
 }
 
-/// Should be served at "/org/mpris/MediaPlayer2"
-pub struct MediaPlayer2 {
+struct Main {
     identity: String,
 }
 
-/// Should be served at "/org/mpris/MediaPlayer2"
-pub struct MediaPlayer2Player {}
+struct Player {}
+
+struct TrackList {}
 
 #[dbus_interface(name = "org.mpris.MediaPlayer2")]
-impl MediaPlayer2 {
+impl Main {
     /// Quit method
     #[dbus_interface(name = "Quit")]
     fn quit(&self) {}
@@ -98,7 +103,7 @@ impl MediaPlayer2 {
 }
 
 #[dbus_interface(name = "org.mpris.MediaPlayer2.Player")]
-impl MediaPlayer2Player {
+impl Player {
     /// Next method
     fn next(&self) {}
 
@@ -222,3 +227,72 @@ impl MediaPlayer2Player {
         MediaPlayerMetadata::from_iter([])
     }
 }
+
+#[dbus_interface(name = "org.mpris.MediaPlayer2.TrackList")]
+impl TrackList {
+    /// AddTrack method
+    fn add_track(&self, uri: &str, after: MediaPlayerObjectPath, set_as_current: bool) {
+        todo!("handle add {uri} after {after:?} with set as current: {set_as_current}")
+    }
+
+    /// GetTracksMetadata method
+    fn get_tracks_metadata(
+        &self,
+        tracks_ids: Vec<MediaPlayerObjectPath>,
+    ) -> Vec<MediaPlayerMetadata> {
+        todo!("handle track ids: {tracks_ids:?}")
+    }
+
+    /// GoTo method
+    fn go_to(&self, track_id: MediaPlayerObjectPath) {
+        todo!("handle track id {track_id:?}")
+    }
+
+    /// RemoveTrack method
+    fn remove_track(&self, track_id: MediaPlayerObjectPath) {
+        todo!("handle track id {track_id:?}")
+    }
+
+    /// CanEditTracks property
+    #[dbus_interface(property)]
+    fn can_edit_tracks(&self) -> bool {
+        true
+    }
+
+    /// Tracks property
+    #[dbus_interface(property)]
+    fn tracks(&self) -> Vec<MediaPlayerObjectPath> {
+        vec![]
+    }
+
+    /// TrackAdded signal
+    #[dbus_interface(signal)]
+    async fn track_added(
+        #[zbus(signal_context)] ctxt: ZSignalCtx<'_>,
+        metadata: MediaPlayerMetadata,
+        after: MediaPlayerObjectPath,
+    ) -> zbus::Result<()>;
+
+    /// TrackListReplaced signal
+    #[dbus_interface(signal)]
+    async fn track_list_replaced(
+        #[zbus(signal_context)] ctxt: ZSignalCtx<'_>,
+        tracks: Vec<MediaPlayerObjectPath>,
+        current: MediaPlayerObjectPath,
+    ) -> zbus::Result<()>;
+
+    /// TrackMetadataChanged signal
+    #[dbus_interface(signal)]
+    async fn track_metadata_changed(
+        #[zbus(signal_context)] ctxt: ZSignalCtx<'_>,
+        track_id: MediaPlayerObjectPath,
+        metadata: MediaPlayerMetadata,
+    ) -> zbus::Result<()>;
+
+    /// TrackRemoved signal
+    #[dbus_interface(signal)]
+    async fn track_removed(
+        #[zbus(signal_context)] ctxt: ZSignalCtx<'_>,
+        track_id: MediaPlayerObjectPath,
+    ) -> zbus::Result<()>;
+}