diff --git a/utils/mpris/mpris.rs b/utils/mpris/mpris.rs
index dc98344d9a4080ba9b15489eadab12776b90f46a..d08b6941691fe1928aad5f1fb555f2af789769da 100644
--- a/utils/mpris/mpris.rs
+++ b/utils/mpris/mpris.rs
@@ -23,6 +23,8 @@ enum MediaPlayerPlaybackStatus {
     Stopped,
 }
 
+struct µs(i32);
+
 /// A valid path must be prefiexed by `/baka/lektor/`. After that we have the
 /// variant name in lower case, then a `/`, then the ascii only value. For
 /// example we can have:
@@ -31,8 +33,16 @@ enum MediaPlayerObjectPath {
     Id(i64),
 }
 
+impl From<String> for MediaPlayerLoopStatus {}
+impl From<&str> for MediaPlayerLoopStatus {}
+
+impl From<String> for MediaPlayerPlaybackStatus {}
+impl From<&str> for MediaPlayerPlaybackStatus {}
+
 impl<'a> From<zbus::zvariant::ObjectPath<'a>> for MediaPlayerObjectPath {}
 
+impl From<i32> for µs {}
+
 #[dbus_proxy(interface = "org.mpris.MediaPlayer2", assume_defaults = true)]
 trait MediaPlayer2 {
     /// Quit method
@@ -74,7 +84,10 @@ trait MediaPlayer2 {
     #[dbus_proxy(property)]
     fn supported_mime_types(&self) -> zbus::Result<Vec<String>>;
 
-    /// SupportedUriSchemes property
+    /// SupportedUriSchemes property. It should be `id://` and `file://` for
+    /// lektord. Here we support `file://` for only files in the database to
+    /// enable the user to search the kara folder and drop the files to play
+    /// them imediatly.
     #[dbus_proxy(property)]
     fn supported_uri_schemes(&self) -> zbus::Result<Vec<String>>;
 }
@@ -103,7 +116,7 @@ trait Player {
     fn seek(&self, time_µs: i64) -> zbus::Result<()>;
 
     /// SetPosition method
-    fn set_position(&self, track_id: &MediaPlayerObjectPath, time_µs: i64) -> zbus::Result<()>;
+    fn set_position(&self, track_id: &MediaPlayerObjectPath, time_µs: µs) -> zbus::Result<()>;
 
     /// Stop method
     fn stop(&self) -> zbus::Result<()>;
@@ -126,32 +139,42 @@ trait Player {
 
     /// LoopStatus property
     #[dbus_proxy(property)]
-    fn loop_status(&self) -> zbus::Result<String>;
-    fn set_loop_status(&self, value: &str) -> zbus::Result<()>;
+    fn loop_status(&self) -> zbus::Result<MediaPlayerObjectPath>;
+    fn set_loop_status(&self, value: &MediaPlayerObjectPath) -> zbus::Result<()>;
 
-    /// MaximumRate property
+    /// MaximumRate property. We will only set it to `1.0` here...
     #[dbus_proxy(property)]
-    fn maximum_rate(&self) -> zbus::Result<f64>;
-    fn set_maximum_rate(&self, value: f64) -> zbus::Result<()>;
+    fn maximum_rate(&self) -> zbus::Result<f64> {
+        Ok(1.0)
+    }
+    fn set_maximum_rate(&self, _: f64) -> zbus::Result<()> {
+        Ok(())
+    }
 
-    /// Metadata property
+    /// Metadata property. If there is a current kara playing, there must be at
+    /// least a `mpris:trackid` value of type `o` which is the object path of
+    /// the current kara id.
     #[dbus_proxy(property)]
     fn metadata(
         &self,
     ) -> zbus::Result<std::collections::HashMap<String, zbus::zvariant::OwnedValue>>;
 
-    /// MinimumRate property
+    /// MinimumRate property. We will only set it to `1.0` here...
     #[dbus_proxy(property)]
-    fn minimum_rate(&self) -> zbus::Result<f64>;
-    fn set_minimum_rate(&self, value: f64) -> zbus::Result<()>;
+    fn minimum_rate(&self) -> zbus::Result<f64> {
+        Ok(1.0)
+    }
+    fn set_minimum_rate(&self, _: f64) -> zbus::Result<()> {
+        Ok(())
+    }
 
     /// PlaybackStatus property
     #[dbus_proxy(property)]
-    fn playback_status(&self) -> zbus::Result<String>;
+    fn playback_status(&self) -> zbus::Result<MediaPlayerPlaybackStatus>;
 
     /// Position property
     #[dbus_proxy(property)]
-    fn position(&self) -> zbus::Result<i32>;
+    fn position(&self) -> zbus::Result<µs>;
 
     /// Rate property
     #[dbus_proxy(property)]
@@ -160,8 +183,8 @@ trait Player {
 
     /// Shuffle property
     #[dbus_proxy(property)]
-    fn shuffle(&self) -> zbus::Result<f64>;
-    fn set_shuffle(&self, value: f64) -> zbus::Result<()>;
+    fn shuffle(&self) -> zbus::Result<bool>;
+    fn set_shuffle(&self, value: bool) -> zbus::Result<()>;
 
     /// Volume property
     #[dbus_proxy(property)]
diff --git a/utils/mpris/mpris.xml b/utils/mpris/mpris.xml
index 61f525aeff676d00e7d7115433d0c22a7a39a96c..efec5efcefb0507f119654023433c7a30fe507a3 100644
--- a/utils/mpris/mpris.xml
+++ b/utils/mpris/mpris.xml
@@ -18,7 +18,7 @@
     <property name="PlaybackStatus" type="s" access="read" />
     <property name="LoopStatus" type="s" access="readwrite" />
     <property name="Volume" type="d" access="readwrite" />
-    <property name="Shuffle" type="d" access="readwrite" />
+    <property name="Shuffle" type="b" access="readwrite" />
     <property name="Position" type="i" access="read" />
     <property name="Rate" type="d" access="readwrite" />
     <property name="MinimumRate" type="d" access="readwrite" />