diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index d0ca46704622699b007158fb6b63bfa3a1c32bbf..90abc63e0bc889e68020fd0dbc7055cc137d82bc 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -300,6 +300,29 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
         connect(text_input_, &TextInputWidget::sendBanRoomRequest, this, &ChatPage::banUser);
         connect(text_input_, &TextInputWidget::sendUnbanRoomRequest, this, &ChatPage::unbanUser);
 
+        connect(
+          text_input_, &TextInputWidget::changeRoomNick, this, [this](const QString &displayName) {
+                  mtx::events::state::Member member;
+                  member.display_name = displayName.toStdString();
+                  member.avatar_url =
+                    cache::avatarUrl(currentRoom(),
+                                     QString::fromStdString(http::client()->user_id().to_string()))
+                      .toStdString();
+                  member.membership = mtx::events::state::Membership::Join;
+
+                  http::client()
+                    ->send_state_event<mtx::events::state::Member,
+                                       mtx::events::EventType::RoomMember>(
+                      currentRoom().toStdString(),
+                      http::client()->user_id().to_string(),
+                      member,
+                      [](mtx::responses::EventId, mtx::http::RequestErr err) {
+                              if (err)
+                                      nhlog::net()->error("Failed to set room displayname: {}",
+                                                          err->matrix_error.error);
+                      });
+          });
+
         connect(
           text_input_,
           &TextInputWidget::uploadMedia,
diff --git a/src/TextInputWidget.cpp b/src/TextInputWidget.cpp
index af5c278e42f66f81a4f6ec58ee8416e39f74bab5..d2359910a1267fb12cb88e23000d1775e8b01639 100644
--- a/src/TextInputWidget.cpp
+++ b/src/TextInputWidget.cpp
@@ -576,6 +576,8 @@ TextInputWidget::command(QString command, QString args)
                 sendBanRoomRequest(args.section(' ', 0, 0), args.section(' ', 1, -1));
         } else if (command == "unban") {
                 sendUnbanRoomRequest(args.section(' ', 0, 0), args.section(' ', 1, -1));
+        } else if (command == "roomnick") {
+                changeRoomNick(args);
         } else if (command == "shrug") {
                 sendTextMessage("¯\\_(ツ)_/¯");
         } else if (command == "fliptable") {
diff --git a/src/TextInputWidget.h b/src/TextInputWidget.h
index addb61ec30cb1517437d6e3fc972c9428b8c2d6b..a0105eb0346dd354c07bb6f03e827bcb56639a03 100644
--- a/src/TextInputWidget.h
+++ b/src/TextInputWidget.h
@@ -167,6 +167,7 @@ signals:
         void sendKickRoomRequest(const QString &userid, const QString &reason);
         void sendBanRoomRequest(const QString &userid, const QString &reason);
         void sendUnbanRoomRequest(const QString &userid, const QString &reason);
+        void changeRoomNick(const QString &displayname);
 
         void startedTyping();
         void stoppedTyping();