diff --git a/data/resources/resources.gresource.xml b/data/resources/resources.gresource.xml
index c8d2868d..9ccb2323 100644
--- a/data/resources/resources.gresource.xml
+++ b/data/resources/resources.gresource.xml
@@ -16,6 +16,7 @@
ui/account-settings.ui
ui/add-account-row.ui
ui/avatar-with-selection.ui
+ ui/components-audio-player.ui
ui/components-auth-dialog.ui
ui/components-avatar.ui
ui/components-loading-listbox-row.ui
@@ -33,6 +34,7 @@
ui/content-member-item.ui
ui/content-member-page.ui
ui/content-member-row.ui
+ ui/content-message-audio.ui
ui/content-message-file.ui
ui/content-message-media.ui
ui/content-message-reaction-list.ui
diff --git a/data/resources/ui/components-audio-player.ui b/data/resources/ui/components-audio-player.ui
new file mode 100644
index 00000000..f28d9123
--- /dev/null
+++ b/data/resources/ui/components-audio-player.ui
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/data/resources/ui/content-message-audio.ui b/data/resources/ui/content-message-audio.ui
new file mode 100644
index 00000000..55108544
--- /dev/null
+++ b/data/resources/ui/content-message-audio.ui
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
diff --git a/po/POTFILES.in b/po/POTFILES.in
index a32604cb..fcb9078a 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -45,6 +45,7 @@ src/session/content/explore/public_room_row.rs
src/session/content/room_details/member_page/mod.rs
src/session/content/room_details/mod.rs
src/session/content/room_history/item_row.rs
+src/session/content/room_history/message_row/audio.rs
src/session/content/room_history/message_row/media.rs
src/session/content/room_history/message_row/mod.rs
src/session/content/room_history/state_row/creation.rs
diff --git a/src/components/audio_player.rs b/src/components/audio_player.rs
new file mode 100644
index 00000000..ff67d011
--- /dev/null
+++ b/src/components/audio_player.rs
@@ -0,0 +1,109 @@
+use adw::subclass::prelude::*;
+use gtk::{glib, prelude::*, subclass::prelude::*, CompositeTemplate};
+
+mod imp {
+ use std::cell::RefCell;
+
+ use glib::subclass::InitializingObject;
+ use once_cell::sync::Lazy;
+
+ use super::*;
+
+ #[derive(Debug, Default, CompositeTemplate)]
+ #[template(resource = "/org/gnome/FractalNext/components-audio-player.ui")]
+ pub struct AudioPlayer {
+ /// The media file to play.
+ pub media_file: RefCell