diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml
index d665566c00bdd11db7ceb93fffaf3ac89ca2d9fb..1b40931f0ea6190f46b4ecb7359f8fb153958cd7 100644
--- a/resources/qml/MessageInput.qml
+++ b/resources/qml/MessageInput.qml
@@ -139,6 +139,7 @@ Rectangle {
                     if (TimelineManager.timeline)
                         TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text);
 
+                    forceActiveFocus();
                 }
                 onCursorRectangleChanged: textInput.ensureVisible(cursorRectangle)
                 onCursorPositionChanged: {
@@ -260,7 +261,9 @@ Rectangle {
 
                 Connections {
                     ignoreUnknownSignals: true
-                    onInsertText: messageInput.insert(messageInput.cursorPosition, text)
+                    onInsertText: {
+                        messageInput.insert(messageInput.cursorPosition, text);
+                    }
                     onTextChanged: {
                         messageInput.text = newText;
                         messageInput.cursorPosition = newText.length;
@@ -271,6 +274,7 @@ Rectangle {
                 Connections {
                     ignoreUnknownSignals: true
                     onReplyChanged: messageInput.forceActiveFocus()
+                    onEditChanged: messageInput.forceActiveFocus()
                     target: TimelineManager.timeline
                 }
 
diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index dafca0f68e67f75610f799f34ac8d024a6a52fc7..0f0588303af1089b844817186ae5843fc7c26bd3 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -50,7 +50,12 @@ ListView {
 
     Shortcut {
         sequence: StandardKey.Cancel
-        onActivated: chat.model.reply = undefined
+        onActivated: {
+            if (chat.model.edit)
+                chat.model.edit = undefined;
+            else
+                chat.model.reply = undefined;
+        }
     }
 
     Shortcut {
@@ -66,6 +71,11 @@ ListView {
         }
     }
 
+    Shortcut {
+        sequence: "Ctrl+E"
+        onActivated: chat.model.edit = chat.model.reply
+    }
+
     Component {
         id: sectionHeader
 
diff --git a/resources/qml/ReplyPopup.qml b/resources/qml/ReplyPopup.qml
index 85b64114741ed067c1eb2f083699121c832dad6e..9e97d7aa0228dd849c550d3c534dbf91c17a5ef0 100644
--- a/resources/qml/ReplyPopup.qml
+++ b/resources/qml/ReplyPopup.qml
@@ -18,8 +18,8 @@ Rectangle {
 
     Reply {
         id: replyPreview
-    visible: room && room.reply
 
+        visible: room && room.reply
         anchors.left: parent.left
         anchors.leftMargin: 2 * 22 + 3 * 16
         anchors.right: closeReplyButton.left
@@ -32,8 +32,8 @@ Rectangle {
 
     ImageButton {
         id: closeReplyButton
-    visible: room && room.reply
 
+        visible: room && room.reply
         anchors.right: parent.right
         anchors.rightMargin: 16
         anchors.top: replyPreview.top
@@ -48,8 +48,8 @@ Rectangle {
 
     Button {
         id: closeEditButton
-    visible: room && room.edit
 
+        visible: room && room.edit
         anchors.left: parent.left
         anchors.rightMargin: 16
         anchors.topMargin: 10
diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index d4f058e56af825681767b0a9da4be54c4423eb79..9f054b9b11c6ed6eda177aaf437afc9e042fe7fb 100644
--- a/resources/qml/TimelineRow.qml
+++ b/resources/qml/TimelineRow.qml
@@ -88,7 +88,7 @@ Item {
         ImageButton {
             id: editButton
 
-            visible: (Settings.buttonsInTimeline && model.isEditable) || model.isEdited 
+            visible: (Settings.buttonsInTimeline && model.isEditable) || model.isEdited
             buttonTextColor: chat.model.edit == model.id ? colors.highlight : colors.buttonText
             Layout.alignment: Qt.AlignRight | Qt.AlignTop
             Layout.preferredHeight: 16
@@ -97,7 +97,11 @@ Item {
             image: ":/icons/icons/ui/edit.png"
             ToolTip.visible: hovered
             ToolTip.text: model.isEditable ? qsTr("Edit") : qsTr("Edited")
-            onClicked: if (model.isEditable) chat.model.editAction(model.id)
+            onClicked: {
+                if (model.isEditable)
+                    chat.model.editAction(model.id);
+
+            }
         }
 
         EmojiButton {
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index c03e8d31df49958e3496c2d3171ccb7b583f245b..4b3c006ae4a04322c428882669080d52046b97ce 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -91,6 +91,11 @@ Page {
             onClicked: TimelineManager.timeline.replyAction(messageContextMenu.eventId)
         }
 
+        MenuItem {
+            text: qsTr("Edit")
+            onClicked: TimelineManager.timeline.editAction(messageContextMenu.eventId)
+        }
+
         MenuItem {
             text: qsTr("Read receipts")
             onTriggered: TimelineManager.timeline.readReceiptsAction(messageContextMenu.eventId)