diff --git a/resources/qml/UserProfile.qml b/resources/qml/UserProfile.qml
index 8328f4a5331ea8723cc8ed2894fada791a7c8daa..2a06b95521d72965ef54c91ffb2f9f3f79a458e2 100644
--- a/resources/qml/UserProfile.qml
+++ b/resources/qml/UserProfile.qml
@@ -58,6 +58,40 @@ ApplicationWindow {
             onClicked: profile.verify()
         }
 
+        Button {
+            id: changeUsername
+
+            text: (profile.roomid_ == "") ? qsTr("Change global username") : qsTr("Change room username")
+            Layout.alignment: Qt.AlignHCenter
+            enabled : profile.isSelf
+            visible: profile.isSelf
+            onClicked: changeUsernameDialog.open()
+
+            Dialog {
+                id: changeUsernameDialog
+                modal: true
+                title: (profile.roomid_ == "") ? qsTr("Change global username") : qsTr("Change room username")
+                onAccepted: profile.changeUsername(usernameEdit.text)
+
+                Column {
+                    anchors.fill: parent
+
+                    Text {
+                        text: "New Username"
+                        anchors.horizontalCenter: parent.horizontalCenter
+                    }
+                    TextField {
+                        id: usernameEdit
+                        focus: true
+                        wrapMode: TextEdit.Wrap
+                        anchors.horizontalCenter: parent.horizontalCenter
+                    }
+                }
+
+                standardButtons: Dialog.Ok | Dialog.Cancel
+            }
+        }
+
         Image {
             Layout.preferredHeight: 16
             Layout.preferredWidth: 16
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 4346b0b20ba9f28b9fe2f64865fcbf3533a911c3..79cf51848a44259557b11abbad61aab35500c7a2 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -799,9 +799,9 @@ TimelineModel::viewDecryptedRawMessage(QString id) const
 }
 
 void
-TimelineModel::openUserProfile(QString userid)
+TimelineModel::openUserProfile(QString userid, bool global)
 {
-        emit openProfile(new UserProfile(room_id_, userid, manager_, this));
+        emit openProfile(new UserProfile(global ? "" : room_id_, userid, manager_, this));
 }
 
 void
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 35e62eb42c557e9b24e284ac6d348688f12256cf..51b8049e07beb8fde927109dbac7d51150df50c9 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -212,7 +212,7 @@ public:
 
         Q_INVOKABLE void viewRawMessage(QString id) const;
         Q_INVOKABLE void viewDecryptedRawMessage(QString id) const;
-        Q_INVOKABLE void openUserProfile(QString userid);
+        Q_INVOKABLE void openUserProfile(QString userid, bool global = false);
         Q_INVOKABLE void replyAction(QString id);
         Q_INVOKABLE void readReceiptsAction(QString id) const;
         Q_INVOKABLE void redactEvent(QString id);
diff --git a/src/ui/UserProfile.cpp b/src/ui/UserProfile.cpp
index 08219a38d1e51dea87e47cf33a5ef1ad4554cf6a..503f314cabc9f350fd546b1510820dc6a22e682a 100644
--- a/src/ui/UserProfile.cpp
+++ b/src/ui/UserProfile.cpp
@@ -4,6 +4,7 @@
 #include "DeviceVerificationFlow.h"
 #include "Logging.h"
 #include "Utils.h"
+#include <mtx/responses/common.hpp>
 #include "mtx/responses/crypto.hpp"
 #include "timeline/TimelineModel.h"
 #include "timeline/TimelineViewManager.h"
@@ -213,6 +214,44 @@ UserProfile::startChat()
         ChatPage::instance()->startChat(this->userid_);
 }
 
+void
+UserProfile::changeUsername(QString username)
+{
+        // change room username
+        mtx::events::state::Member member;
+        member.display_name = username.toStdString();
+        member.avatar_url =
+          cache::avatarUrl(roomid_,
+                           QString::fromStdString(http::client()->user_id().to_string()))
+            .toStdString();
+        member.membership = mtx::events::state::Membership::Join;
+
+        http::client()->send_state_event(roomid_.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(modal, &EditModal::nameChanged, this, [this](const QString &newName) {
+                if (roomNameLabel_)
+                        roomNameLabel_->setText(newName);
+        });*/
+
+        /*std::string newName = "jedi18";
+        // change user name
+        http::client()->set_displayname(
+          newName, [this]( mtx::http::RequestErr err) {
+                  if (err) {
+                          nhlog::net()->warn("could not change username");
+                          return;
+                  }
+          });*/
+}
+
 void
 UserProfile::verify(QString device)
 {
diff --git a/src/ui/UserProfile.h b/src/ui/UserProfile.h
index 195273103c2f4ec2f3e311605a1ffc0494204498..df90e5a18e2effab09891fba6bd6bd57e4f3acee 100644
--- a/src/ui/UserProfile.h
+++ b/src/ui/UserProfile.h
@@ -109,6 +109,7 @@ public:
         // Q_INVOKABLE void ignoreUser();
         Q_INVOKABLE void kickUser();
         Q_INVOKABLE void startChat();
+        Q_INVOKABLE void changeUsername(QString username);
 
 signals:
         void userStatusChanged();