diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8818fcaea37a56282d67650c885e98d379b529d0..7732a73571ca0aa797aa41cfb5d8f9f45e8b5aed 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -629,9 +629,9 @@ set(TRANSLATION_DEPS ${LANG_QRC} ${QRC} ${QM_SRC})
 
 if (APPLE)
 	set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Foundation -framework Cocoa -framework UserNotifications")
-	set(SRC_FILES ${SRC_FILES} src/notifications/MacNotificationDelegate.h src/notifications/MacNotificationDelegate.mm src/notifications/ManagerMac.mm src/notifications/ManagerMac.cpp src/emoji/MacHelper.mm src/emoji/MacHelper.h)
+	set(SRC_FILES ${SRC_FILES} src/notifications/NotificationManagerProxy.h src/notifications/MacNotificationDelegate.h src/notifications/MacNotificationDelegate.mm src/notifications/ManagerMac.mm src/notifications/ManagerMac.cpp src/emoji/MacHelper.mm src/emoji/MacHelper.h)
 	if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0")
-		set_source_files_properties( src/notifications/MacNotificationDelegate.h src/notifications/MacNotificationDelegate.mm src/notifications/ManagerMac.mm src/emoji/MacHelper.mm src/emoji/MacHelper.h PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
+		set_source_files_properties( src/notifications/NotificationManagerProxy.h src/notifications/MacNotificationDelegate.h src/notifications/MacNotificationDelegate.mm src/notifications/ManagerMac.mm src/emoji/MacHelper.mm src/emoji/MacHelper.h PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
 	endif()
 elseif (WIN32)
 	file(DOWNLOAD
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index e40274cb89954c2f947d2cda9e1aedd214916b7e..f87c27380d61d0d91fcc028fbbe852fe1b1c0fb9 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -152,16 +152,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent)
     connect(notificationsManager,
             &NotificationsManager::sendNotificationReply,
             this,
-            [this](const QString &roomid, const QString &eventid, const QString &body) {
-                view_manager_->queueReply(roomid, eventid, body);
-                auto exWin = MainWindow::instance()->windowForRoom(roomid);
-                if (exWin) {
-                    exWin->requestActivate();
-                } else {
-                    view_manager_->rooms()->setCurrentRoom(roomid);
-                    MainWindow::instance()->requestActivate();
-                }
-            });
+            &ChatPage::sendNotificationReply);
 
     connect(
       this,
@@ -1583,6 +1574,19 @@ ChatPage::handleMatrixUri(QString uri)
     return false;
 }
 
+void
+ChatPage::sendNotificationReply(const QString &roomid, const QString &eventid, const QString &body)
+{
+    view_manager_->queueReply(roomid, eventid, body);
+    auto exWin = MainWindow::instance()->windowForRoom(roomid);
+    if (exWin) {
+        exWin->requestActivate();
+    } else {
+        view_manager_->rooms()->setCurrentRoom(roomid);
+        MainWindow::instance()->requestActivate();
+    }
+}
+
 bool
 ChatPage::handleMatrixUri(const QUrl &uri)
 {
diff --git a/src/ChatPage.h b/src/ChatPage.h
index 1bb25dc20b9bf22fc67e143968c5db7901a6c585..bae4401f8046ddae1b0869440a43afd2a1c2eb45 100644
--- a/src/ChatPage.h
+++ b/src/ChatPage.h
@@ -105,6 +105,7 @@ public slots:
     void receivedSessionKey(const std::string &room_id, const std::string &session_id);
     void decryptDownloadedSecrets(mtx::secret_storage::AesHmacSha2KeyDescription keyDesc,
                                   const SecretsToDecrypt &secrets);
+    void sendNotificationReply(const QString &roomid, const QString &eventid, const QString &body);
 signals:
     void connectionLost();
     void connectionRestored();
diff --git a/src/notifications/MacNotificationDelegate.h b/src/notifications/MacNotificationDelegate.h
index 448ca2cb51bb0d38cdf5dafefdd8e8906e381893..4a5c66d00895bcd3aec79053d6f1c0df5a8f8246 100644
--- a/src/notifications/MacNotificationDelegate.h
+++ b/src/notifications/MacNotificationDelegate.h
@@ -6,10 +6,15 @@
 #pragma once
 
 #include "notifications/Manager.h"
+#include "notifications/NotificationManagerProxy.h"
 #include <mtx/responses/notifications.hpp>
 
 #import <Foundation/Foundation.h>
 #import <UserNotifications/UserNotifications.h>
 
-@interface MacNotificationDelegate : NSObject <UNUserNotificationCenterDelegate>
+@interface MacNotificationDelegate : NSObject <UNUserNotificationCenterDelegate> {
+  std::unique_ptr<NotificationManagerProxy> mProxy;
+}
+
+- (id)initWithProxy:(std::unique_ptr<NotificationManagerProxy>&&)proxy;
 @end
diff --git a/src/notifications/MacNotificationDelegate.mm b/src/notifications/MacNotificationDelegate.mm
index b1969386bc4771d3abae0e93c5d732549056a3d1..9047efe3fe1462cbf97e6a2e7ee047ed44a3602e 100644
--- a/src/notifications/MacNotificationDelegate.mm
+++ b/src/notifications/MacNotificationDelegate.mm
@@ -5,16 +5,32 @@
 
 #import "notifications/MacNotificationDelegate.h"
 
+#include <QString.h>
+
+#include "ChatPage.h"
+
 @implementation MacNotificationDelegate
 
+- (id)initWithProxy: (std::unique_ptr<NotificationManagerProxy>&&)proxy
+{
+    if(self = [super init]) {
+        mProxy = std::move(proxy);
+    }
+
+    return self;
+}
+
 - (void)userNotificationCenter:(UNUserNotificationCenter*)center
     didReceiveNotificationResponse:(UNNotificationResponse*)response
              withCompletionHandler:(void (^)())completionHandler
 {
     if ([response.actionIdentifier isEqualToString:@"ReplyAction"]) {
         if ([response respondsToSelector:@selector(userText)]) {
-            NSString* textValue = [(UNTextInputNotificationResponse*)response userText];
-            NSLog(@"%@", textValue);
+            UNTextInputNotificationResponse* textResponse = (UNTextInputNotificationResponse*)response;
+            NSString* textValue = [textResponse userText];
+            NSString* eventId = [[[textResponse notification] request] identifier];
+            NSString* roomId = [[[[textResponse notification] request] content] threadIdentifier];
+            mProxy->notificationReplied(QString::fromNSString(roomId), QString::fromNSString(eventId), QString::fromNSString(textValue));
         }
     }
     completionHandler();
diff --git a/src/notifications/ManagerMac.mm b/src/notifications/ManagerMac.mm
index ea910dd0241a12da2309f2bb618af9c94d5a0480..4865e30d3fb3c8e037562e6dba9efc3e5bde561b 100644
--- a/src/notifications/ManagerMac.mm
+++ b/src/notifications/ManagerMac.mm
@@ -3,9 +3,12 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
+#include "notifications/NotificationManagerProxy.h"
 #include "notifications/MacNotificationDelegate.h"
 #include "notifications/Manager.h"
 
+#include "ChatPage.h"
+
 #import <AppKit/NSImage.h>
 #import <Foundation/Foundation.h>
 #import <UserNotifications/UserNotifications.h>
@@ -165,7 +168,11 @@ void NotificationsManager::attachToMacNotifCenter()
     UNUserNotificationCenter* center =
         [UNUserNotificationCenter currentNotificationCenter];
 
-    MacNotificationDelegate* notifDelegate = [MacNotificationDelegate new];
+    std::unique_ptr<NotificationManagerProxy> proxy = std::make_unique<NotificationManagerProxy>();
+
+    connect(proxy.get(), &NotificationManagerProxy::notificationReplied, ChatPage::instance(), &ChatPage::sendNotificationReply);
+
+    MacNotificationDelegate* notifDelegate = [[MacNotificationDelegate alloc] initWithProxy:std::move(proxy)];
 
     center.delegate = notifDelegate;
 }
diff --git a/src/notifications/NotificationManagerProxy.h b/src/notifications/NotificationManagerProxy.h
new file mode 100644
index 0000000000000000000000000000000000000000..0341519df4ae467d2075a1d4bdbcda70c525ddf6
--- /dev/null
+++ b/src/notifications/NotificationManagerProxy.h
@@ -0,0 +1,19 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+// SPDX-FileCopyrightText: 2022 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include <QObject>
+#include <QString>
+
+class NotificationManagerProxy final : public QObject
+{
+    Q_OBJECT
+public:
+    NotificationManagerProxy(QObject *parent = nullptr): QObject(parent) {}
+
+signals:
+    void notificationReplied(const QString &room, const QString &event, const QString &reply);
+};
\ No newline at end of file