diff --git a/src/module/qt_window/mainwindow.cc b/src/module/qt_window/mainwindow.cc
index ee6902346b5276acc668f7beb77d77917c1fdf68..8d22e104747be319ab059c2e88da2c88b9268add 100644
--- a/src/module/qt_window/mainwindow.cc
+++ b/src/module/qt_window/mainwindow.cc
@@ -4,6 +4,7 @@ MainWindow::MainWindow(struct module_qt_window_s *qt_window, QWidget *parent)
     : QMainWindow(parent)
 {
     qt_window->mpv_widget = new MpvWidget(qt_window->queue, qt_window->db, this);
+    connect(qt_window->mpv_widget, &MpvWidget::titleChanged, this, &MainWindow::updateWindowTitle);
     setCentralWidget(qt_window->mpv_widget);
     setFocusPolicy(Qt::StrongFocus);
 }
diff --git a/src/module/qt_window/mainwindow.hh b/src/module/qt_window/mainwindow.hh
index 245d7fb6c134539ca3e8fb2107abaa360630536a..cb97f0e690e014aed7e4c12b41f47a30a929994e 100644
--- a/src/module/qt_window/mainwindow.hh
+++ b/src/module/qt_window/mainwindow.hh
@@ -10,4 +10,9 @@ class MainWindow : public QMainWindow {
     Q_OBJECT
 public:
     explicit MainWindow(struct module_qt_window_s *qt_window, QWidget *parent = nullptr);
+
+public slots:
+    inline void updateWindowTitle(QString str) noexcept {
+        setWindowTitle(str);
+    }
 };
diff --git a/src/module/qt_window/mpvwidget.cc b/src/module/qt_window/mpvwidget.cc
index 4207e156b7d5ecd5bb6aeabf7da268ea7bba9079..76aced8a62a487146effac80da3e44b7f6c0a5c6 100644
--- a/src/module/qt_window/mpvwidget.cc
+++ b/src/module/qt_window/mpvwidget.cc
@@ -5,10 +5,13 @@
 #include <QtCore/QMetaObject>
 #include <QApplication>
 #include <QKeyEvent>
+#include <QString>
 
 #include "qthelper.hh"
 #include "../mpv.h"
 
+#include <lektor/mkv.h>
+
 PRIVATE_FUNCTION void
 wakeup(void *ctx)
 {
@@ -235,7 +238,7 @@ MpvWidget::load_file(const char *filepath)
 
     if (ret) {
         LOG_DEBUG("WINDOW", "Loaded file: %s", filepath);
-        //set_window_title(win);
+        update_window_title();
     } else {
         LOG_ERROR("WINDOW", "Failed to load kara with path: %s", filepath);
     }
@@ -244,6 +247,27 @@ MpvWidget::load_file(const char *filepath)
     return ret;
 }
 
+void
+MpvWidget::update_window_title()
+{
+    struct kara_metadata kara_mdt;
+    int changed_kara = 0;
+    char *kara_title = NULL;
+    char window_title[LKT_LINE_MAX];
+
+    if (database_queue_current_kara(m_db, &kara_mdt, &changed_kara)) {
+        mdtcat(&kara_mdt, &kara_title);
+        safe_snprintf(window_title, LKT_LINE_MAX, "[Lektord] %d: %s", changed_kara, kara_title);
+        LOG_DEBUG("WINDOW", "Set window title to: %s", window_title);
+        titleChanged(QString::fromLocal8Bit(window_title));
+        free(kara_title);
+    }
+
+    else {
+        LOG_ERROR("WINDOW", "Failed to get current kara, can't change window title");
+    }
+}
+
 bool
 MpvWidget::toggle_pause()
 {
diff --git a/src/module/qt_window/mpvwidget.hh b/src/module/qt_window/mpvwidget.hh
index 00355bccf0b04831a98aa5fbe26a706f9de48f27..38b8190c8dbd6c0fa7692a06475367f92306cec9 100644
--- a/src/module/qt_window/mpvwidget.hh
+++ b/src/module/qt_window/mpvwidget.hh
@@ -48,4 +48,10 @@ public:
     bool set_position(int);
     bool load_file(const char *);
     bool toggle_pause();
+
+private:
+    void update_window_title();
+
+signals:
+    void titleChanged(QString str);
 };