diff --git a/io.github.NhekoReborn.Nheko.json b/io.github.NhekoReborn.Nheko.json
index b444e50772929f1e72bfcc4a2b096c949a2091d2..c042854f01ba892e75a3bfd0a8819f4b5285b62d 100644
--- a/io.github.NhekoReborn.Nheko.json
+++ b/io.github.NhekoReborn.Nheko.json
@@ -10,7 +10,6 @@
   "rename-appdata-file": "nheko.appdata.xml",
   "finish-args": [
     "--device=dri",
-    "--filesystem=home",
     "--share=ipc",
     "--share=network",
     "--socket=pulseaudio",
diff --git a/resources/langs/nheko_de.ts b/resources/langs/nheko_de.ts
index 8a982f5edf40535a97df0044412832816756f328..cfc58189815e6e8e1e49cef4e205a61b47f6a4fc 100644
--- a/resources/langs/nheko_de.ts
+++ b/resources/langs/nheko_de.ts
@@ -4,15 +4,15 @@
 <context>
     <name>ChatPage</name>
     <message>
-        <location filename="../../src/ChatPage.cpp" line="+223"/>
+        <location filename="../../src/ChatPage.cpp" line="+225"/>
         <source>Failed to invite user: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Nutzer konnte nicht eingeladen werden: %1</translation>
     </message>
     <message>
         <location line="+4"/>
-        <location line="+868"/>
+        <location line="+894"/>
         <source>Invited user: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Eingeladener Benutzer: %1</translation>
     </message>
     <message>
         <location line="-5"/>
@@ -50,12 +50,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-815"/>
         <source>Failed to upload media. Please try again.</source>
         <translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location line="+407"/>
         <source>Failed to restore OLM account. Please login again.</source>
         <translation>Wiederherstellung des OLM Accounts fehlgeschlagen. Bitte logge dich erneut ein.</translation>
     </message>
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+714"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation>-- verschlüsselter Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation>-- Entschlüsselungsfehler (Fehler bei Kommunikation mit Datenbank) --</translation>
@@ -497,19 +491,7 @@
         <translation>-- Entschlüsselungsfehler (Fehler bei Suche nach megolm Schlüsseln in Datenbank) --</translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation>-- Entschlüsselungsfehler (%1) --</translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation>-- verschlüsselter Event (Unbekannter Eventtyp) --</translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation>Nachricht zurückziehen fehlgeschlagen: %1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation>Datei speichern</translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished">-- Verschlüsseltes Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished">-- Entschlüsselungsfehler (%1) --</translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished">-- Verschlüsseltes Event (Unbekannter Eventtyp) --</translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation>
             <numerusform>%1%2 tippt</numerusform>
@@ -544,42 +544,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -634,11 +634,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
-        <translation>Hat die Verbannung von %1 zurückgezogen.</translation>
+        <source>Unbanned %1.</source>
+        <translation type="unfinished">Hat die Verbannung von %1 zurückgezogen.</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation>%1 hat das Anklopfen zurückgezogen.</translation>
     </message>
@@ -654,12 +659,7 @@
         <translation type="unfinished">%1 hat den Raum verlassen.</translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -672,7 +672,7 @@
 <context>
     <name>TimelineRow</name>
     <message>
-        <location filename="../qml/TimelineRow.qml" line="+84"/>
+        <location filename="../qml/TimelineRow.qml" line="+69"/>
         <source>Reply</source>
         <translation>Antworten</translation>
     </message>
@@ -685,7 +685,12 @@
 <context>
     <name>TimelineView</name>
     <message>
-        <location filename="../qml/TimelineView.qml" line="+32"/>
+        <location filename="../qml/TimelineView.qml" line="+45"/>
+        <source>Reply</source>
+        <translation type="unfinished">Antworten</translation>
+    </message>
+    <message>
+        <location line="+4"/>
         <source>Read receipts</source>
         <translation type="unfinished">Lesebestätigungen</translation>
     </message>
@@ -715,7 +720,7 @@
         <translation>Kein Raum geöffnet</translation>
     </message>
     <message>
-        <location line="+239"/>
+        <location line="+241"/>
         <source>Close</source>
         <translation type="unfinished">Schließen</translation>
     </message>
@@ -777,7 +782,7 @@
 <context>
     <name>UserSettingsPage</name>
     <message>
-        <location filename="../../src/UserSettingsPage.cpp" line="+290"/>
+        <location filename="../../src/UserSettingsPage.cpp" line="+296"/>
         <source>Minimize to tray</source>
         <translation>Ins Benachrichtigungsfeld minimieren</translation>
     </message>
@@ -798,6 +803,11 @@
     </message>
     <message>
         <location line="+2"/>
+        <source>Show buttons in timeline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
         <source>Typing notifications</source>
         <translation>Schreibbenachrichtigungen</translation>
     </message>
@@ -847,7 +857,7 @@
         <translation>Gerätefingerabdruck</translation>
     </message>
     <message>
-        <location line="-56"/>
+        <location line="-57"/>
         <source>Session Keys</source>
         <translation>Sitzungsschlüssel</translation>
     </message>
@@ -867,22 +877,22 @@
         <translation>VERSCHLÃœSSELUNG</translation>
     </message>
     <message>
-        <location line="-60"/>
+        <location line="-61"/>
         <source>GENERAL</source>
         <translation>ALLGEMEINES</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location line="+23"/>
         <source>INTERFACE</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location line="+106"/>
         <source>Emoji Font Family</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+142"/>
+        <location line="+147"/>
         <source>Open Sessions File</source>
         <translation>Öffne Sessions Datei</translation>
     </message>
diff --git a/resources/langs/nheko_el.ts b/resources/langs/nheko_el.ts
index 0398f06617f56335e0182ac77924e64bee4ab4d4..0d374cf55bdbc9f0d39a2093b0c0584ae99b4f76 100644
--- a/resources/langs/nheko_el.ts
+++ b/resources/langs/nheko_el.ts
@@ -4,13 +4,13 @@
 <context>
     <name>ChatPage</name>
     <message>
-        <location filename="../../src/ChatPage.cpp" line="+223"/>
+        <location filename="../../src/ChatPage.cpp" line="+225"/>
         <source>Failed to invite user: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <location line="+868"/>
+        <location line="+894"/>
         <source>Invited user: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -50,12 +50,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-815"/>
         <source>Failed to upload media. Please try again.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location line="+407"/>
         <source>Failed to restore OLM account. Please login again.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+714"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -544,42 +544,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -634,11 +634,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -654,12 +659,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -672,7 +672,7 @@
 <context>
     <name>TimelineRow</name>
     <message>
-        <location filename="../qml/TimelineRow.qml" line="+84"/>
+        <location filename="../qml/TimelineRow.qml" line="+69"/>
         <source>Reply</source>
         <translation type="unfinished"></translation>
     </message>
@@ -685,7 +685,12 @@
 <context>
     <name>TimelineView</name>
     <message>
-        <location filename="../qml/TimelineView.qml" line="+32"/>
+        <location filename="../qml/TimelineView.qml" line="+45"/>
+        <source>Reply</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
         <source>Read receipts</source>
         <translation type="unfinished"></translation>
     </message>
@@ -715,7 +720,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+239"/>
+        <location line="+241"/>
         <source>Close</source>
         <translation type="unfinished"></translation>
     </message>
@@ -777,7 +782,7 @@
 <context>
     <name>UserSettingsPage</name>
     <message>
-        <location filename="../../src/UserSettingsPage.cpp" line="+290"/>
+        <location filename="../../src/UserSettingsPage.cpp" line="+296"/>
         <source>Minimize to tray</source>
         <translation>Ελαχιστοποίηση</translation>
     </message>
@@ -798,6 +803,11 @@
     </message>
     <message>
         <location line="+2"/>
+        <source>Show buttons in timeline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
         <source>Typing notifications</source>
         <translation type="unfinished"></translation>
     </message>
@@ -847,7 +857,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-56"/>
+        <location line="-57"/>
         <source>Session Keys</source>
         <translation type="unfinished"></translation>
     </message>
@@ -867,22 +877,22 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-60"/>
+        <location line="-61"/>
         <source>GENERAL</source>
         <translation>ΓΕΝΙΚΑ</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location line="+23"/>
         <source>INTERFACE</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location line="+106"/>
         <source>Emoji Font Family</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+142"/>
+        <location line="+147"/>
         <source>Open Sessions File</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_en.ts b/resources/langs/nheko_en.ts
index 638e0a89413c5e000f836ade44f7fd17caa4dc6f..c97a4ac200bf00c75659d75dc8f1a664dee2495d 100644
--- a/resources/langs/nheko_en.ts
+++ b/resources/langs/nheko_en.ts
@@ -4,13 +4,13 @@
 <context>
     <name>ChatPage</name>
     <message>
-        <location filename="../../src/ChatPage.cpp" line="+223"/>
+        <location filename="../../src/ChatPage.cpp" line="+225"/>
         <source>Failed to invite user: %1</source>
         <translation>Failed to invite user: %1</translation>
     </message>
     <message>
         <location line="+4"/>
-        <location line="+868"/>
+        <location line="+894"/>
         <source>Invited user: %1</source>
         <translation>Invited user: %1</translation>
     </message>
@@ -50,12 +50,12 @@
         <translation>Unbanned user: %1</translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-815"/>
         <source>Failed to upload media. Please try again.</source>
         <translation>Failed to upload media. Please try again.</translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location line="+407"/>
         <source>Failed to restore OLM account. Please login again.</source>
         <translation>Failed to restore OLM account. Please login again.</translation>
     </message>
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+714"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation>-- Encrypted Event (No keys found for decryption) --</translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation>-- Decryption Error (failed to communicate with DB) --</translation>
@@ -497,19 +491,7 @@
         <translation>-- Decryption Error (failed to retrieve megolm keys from db) --</translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation>-- Decryption Error (%1) --</translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation>-- Encrypted Event (Unknown event type) --</translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation>Message redaction failed: %1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation>Save file</translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished">-- Encrypted Event (No keys found for decryption) --</translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished">-- Decryption Error (%1) --</translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished">-- Encrypted Event (Unknown event type) --</translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation>
             <numerusform>%1%2 is typing</numerusform>
@@ -544,42 +544,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -634,11 +634,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
-        <translation>Unbanned %1.</translation>
+        <source>Unbanned %1.</source>
+        <translation type="unfinished">Unbanned %1.</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation>%1 redacted their knock.</translation>
     </message>
@@ -654,12 +659,7 @@
         <translation type="unfinished">%1 left after having already left!</translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -672,7 +672,7 @@
 <context>
     <name>TimelineRow</name>
     <message>
-        <location filename="../qml/TimelineRow.qml" line="+84"/>
+        <location filename="../qml/TimelineRow.qml" line="+69"/>
         <source>Reply</source>
         <translation>Reply</translation>
     </message>
@@ -685,7 +685,12 @@
 <context>
     <name>TimelineView</name>
     <message>
-        <location filename="../qml/TimelineView.qml" line="+32"/>
+        <location filename="../qml/TimelineView.qml" line="+45"/>
+        <source>Reply</source>
+        <translation type="unfinished">Reply</translation>
+    </message>
+    <message>
+        <location line="+4"/>
         <source>Read receipts</source>
         <translation>Read receipts</translation>
     </message>
@@ -715,7 +720,7 @@
         <translation>No room open</translation>
     </message>
     <message>
-        <location line="+239"/>
+        <location line="+241"/>
         <source>Close</source>
         <translation>Close</translation>
     </message>
@@ -777,7 +782,7 @@
 <context>
     <name>UserSettingsPage</name>
     <message>
-        <location filename="../../src/UserSettingsPage.cpp" line="+290"/>
+        <location filename="../../src/UserSettingsPage.cpp" line="+296"/>
         <source>Minimize to tray</source>
         <translation>Minimize to tray</translation>
     </message>
@@ -798,6 +803,11 @@
     </message>
     <message>
         <location line="+2"/>
+        <source>Show buttons in timeline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
         <source>Typing notifications</source>
         <translation>Typing notifications</translation>
     </message>
@@ -847,7 +857,7 @@
         <translation>Device Fingerprint</translation>
     </message>
     <message>
-        <location line="-56"/>
+        <location line="-57"/>
         <source>Session Keys</source>
         <translation>Session Keys</translation>
     </message>
@@ -867,22 +877,22 @@
         <translation>ENCRYPTION</translation>
     </message>
     <message>
-        <location line="-60"/>
+        <location line="-61"/>
         <source>GENERAL</source>
         <translation>GENERAL</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location line="+23"/>
         <source>INTERFACE</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location line="+106"/>
         <source>Emoji Font Family</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+142"/>
+        <location line="+147"/>
         <source>Open Sessions File</source>
         <translation>Open Sessions File</translation>
     </message>
diff --git a/resources/langs/nheko_fi.ts b/resources/langs/nheko_fi.ts
index bf7dd6f0b889bc7e7c9813011caf795439d6ff4b..8659d560a089eff53e32ad8588c7069f79a844dc 100644
--- a/resources/langs/nheko_fi.ts
+++ b/resources/langs/nheko_fi.ts
@@ -4,13 +4,13 @@
 <context>
     <name>ChatPage</name>
     <message>
-        <location filename="../../src/ChatPage.cpp" line="+223"/>
+        <location filename="../../src/ChatPage.cpp" line="+225"/>
         <source>Failed to invite user: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <location line="+868"/>
+        <location line="+894"/>
         <source>Invited user: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -50,12 +50,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-815"/>
         <source>Failed to upload media. Please try again.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location line="+407"/>
         <source>Failed to restore OLM account. Please login again.</source>
         <translation>OLM-tilin palauttaminen epäonnistui. Ole hyvä ja kirjaudu sisään uudelleen.</translation>
     </message>
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+714"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished">-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished">-- Virhe purkaessa salausta (tietokannan kanssa kommunikointi epäonnistui) --</translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished">-- Virhe purkaessa salausta (megolm-avaimien hakeminen tietokannasta epäonnistui) --</translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished">-- Virhe purkaessa salausta (%1) --</translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished">-- Salattu viesti (tuntematon viestityyppi) --</translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished">Viestin poisto epäonnistui: %1</translation>
     </message>
@@ -533,53 +515,71 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished">-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished">-- Virhe purkaessa salausta (%1) --</translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished">-- Salattu viesti (tuntematon viestityyppi) --</translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
-        <translation type="unfinished">
+        <translation>
             <numerusform>%1%2 kirjoittaa</numerusform>
             <numerusform>%1 ja %2 kirjoittavat</numerusform>
         </translation>
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -634,11 +634,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -654,12 +659,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -672,7 +672,7 @@
 <context>
     <name>TimelineRow</name>
     <message>
-        <location filename="../qml/TimelineRow.qml" line="+84"/>
+        <location filename="../qml/TimelineRow.qml" line="+69"/>
         <source>Reply</source>
         <translation type="unfinished"></translation>
     </message>
@@ -685,7 +685,12 @@
 <context>
     <name>TimelineView</name>
     <message>
-        <location filename="../qml/TimelineView.qml" line="+32"/>
+        <location filename="../qml/TimelineView.qml" line="+45"/>
+        <source>Reply</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
         <source>Read receipts</source>
         <translation type="unfinished">Lukukuittaukset</translation>
     </message>
@@ -715,7 +720,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+239"/>
+        <location line="+241"/>
         <source>Close</source>
         <translation type="unfinished">Sulje</translation>
     </message>
@@ -777,7 +782,7 @@
 <context>
     <name>UserSettingsPage</name>
     <message>
-        <location filename="../../src/UserSettingsPage.cpp" line="+290"/>
+        <location filename="../../src/UserSettingsPage.cpp" line="+296"/>
         <source>Minimize to tray</source>
         <translation>Pienennä ilmoitusalueelle</translation>
     </message>
@@ -798,6 +803,11 @@
     </message>
     <message>
         <location line="+2"/>
+        <source>Show buttons in timeline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
         <source>Typing notifications</source>
         <translation>Kirjoitusilmoitukset</translation>
     </message>
@@ -847,7 +857,7 @@
         <translation>Laitteen sormenjälki</translation>
     </message>
     <message>
-        <location line="-56"/>
+        <location line="-57"/>
         <source>Session Keys</source>
         <translation>Istunnon avaimet</translation>
     </message>
@@ -867,22 +877,22 @@
         <translation>SALAUS</translation>
     </message>
     <message>
-        <location line="-60"/>
+        <location line="-61"/>
         <source>GENERAL</source>
         <translation>YLEISET ASETUKSET</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location line="+23"/>
         <source>INTERFACE</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location line="+106"/>
         <source>Emoji Font Family</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+142"/>
+        <location line="+147"/>
         <source>Open Sessions File</source>
         <translation>Avaa Istuntoavaintiedosto</translation>
     </message>
diff --git a/resources/langs/nheko_fr.ts b/resources/langs/nheko_fr.ts
index 19236b1188245041235309cf324d559c2eae31ad..6efe82523e4547cc0df0ebabfe2a936cbd58c661 100644
--- a/resources/langs/nheko_fr.ts
+++ b/resources/langs/nheko_fr.ts
@@ -4,13 +4,13 @@
 <context>
     <name>ChatPage</name>
     <message>
-        <location filename="../../src/ChatPage.cpp" line="+223"/>
+        <location filename="../../src/ChatPage.cpp" line="+225"/>
         <source>Failed to invite user: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <location line="+868"/>
+        <location line="+894"/>
         <source>Invited user: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -50,12 +50,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-815"/>
         <source>Failed to upload media. Please try again.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location line="+407"/>
         <source>Failed to restore OLM account. Please login again.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -480,13 +480,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+714"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -498,19 +492,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -534,9 +516,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -545,42 +545,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -635,11 +635,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -655,12 +660,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -673,7 +673,7 @@
 <context>
     <name>TimelineRow</name>
     <message>
-        <location filename="../qml/TimelineRow.qml" line="+84"/>
+        <location filename="../qml/TimelineRow.qml" line="+69"/>
         <source>Reply</source>
         <translation type="unfinished"></translation>
     </message>
@@ -686,7 +686,12 @@
 <context>
     <name>TimelineView</name>
     <message>
-        <location filename="../qml/TimelineView.qml" line="+32"/>
+        <location filename="../qml/TimelineView.qml" line="+45"/>
+        <source>Reply</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
         <source>Read receipts</source>
         <translation type="unfinished">Accusés de lecture</translation>
     </message>
@@ -716,7 +721,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+239"/>
+        <location line="+241"/>
         <source>Close</source>
         <translation type="unfinished"></translation>
     </message>
@@ -778,7 +783,7 @@
 <context>
     <name>UserSettingsPage</name>
     <message>
-        <location filename="../../src/UserSettingsPage.cpp" line="+290"/>
+        <location filename="../../src/UserSettingsPage.cpp" line="+296"/>
         <source>Minimize to tray</source>
         <translation>Réduire à la barre des tâches</translation>
     </message>
@@ -799,6 +804,11 @@
     </message>
     <message>
         <location line="+2"/>
+        <source>Show buttons in timeline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
         <source>Typing notifications</source>
         <translation>Notifications d&apos;écriture</translation>
     </message>
@@ -848,7 +858,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-56"/>
+        <location line="-57"/>
         <source>Session Keys</source>
         <translation type="unfinished"></translation>
     </message>
@@ -868,22 +878,22 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-60"/>
+        <location line="-61"/>
         <source>GENERAL</source>
         <translation>GÉNÉRAL</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location line="+23"/>
         <source>INTERFACE</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location line="+106"/>
         <source>Emoji Font Family</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+142"/>
+        <location line="+147"/>
         <source>Open Sessions File</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_ja.ts b/resources/langs/nheko_ja.ts
index c0891f1fc891ea273aa6245a213bb92837842e26..05528a42e459967b734ef5dd9b33a0c604c81ea1 100644
--- a/resources/langs/nheko_ja.ts
+++ b/resources/langs/nheko_ja.ts
@@ -4,13 +4,13 @@
 <context>
     <name>ChatPage</name>
     <message>
-        <location filename="../../src/ChatPage.cpp" line="+223"/>
+        <location filename="../../src/ChatPage.cpp" line="+225"/>
         <source>Failed to invite user: %1</source>
         <translation>ユーザーを招待できませんでした: %1</translation>
     </message>
     <message>
         <location line="+4"/>
-        <location line="+868"/>
+        <location line="+894"/>
         <source>Invited user: %1</source>
         <translation>招待されたユーザー: %1</translation>
     </message>
@@ -50,12 +50,12 @@
         <translation>永久追放を解除されたユーザー: %1</translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-815"/>
         <source>Failed to upload media. Please try again.</source>
         <translation>メディアをアップロードできませんでした。やり直して下さい。</translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location line="+407"/>
         <source>Failed to restore OLM account. Please login again.</source>
         <translation>OLMアカウントを復元できませんでした。もう一度ログインして下さい。</translation>
     </message>
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+714"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation>-- 暗号化イベント (復号鍵が見つかりません) --</translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation>-- 復号エラー (データベースと通信できませんでした) --</translation>
@@ -497,19 +491,7 @@
         <translation>-- 復号エラー (データベースからmegolm鍵を取得できませんでした) --</translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation>-- 復号エラー (%1) --</translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation>-- 暗号化イベント (不明なイベント型です) --</translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation>メッセージを編集できませんでした: %1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation>ファイルを保存</translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished">-- 暗号化イベント (復号鍵が見つかりません) --</translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished">-- 復号エラー (%1) --</translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished">-- 暗号化イベント (不明なイベント型です) --</translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation>
             <numerusform>%1%2が入力しています</numerusform>
@@ -543,42 +543,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -633,11 +633,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
-        <translation>%1の永久追放を解除しました</translation>
+        <source>Unbanned %1.</source>
+        <translation type="unfinished">%1 の永久追放を解除しました。</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation>%1がノックを編集しました。</translation>
     </message>
@@ -653,12 +658,7 @@
         <translation type="unfinished">退出済みの%1が退出しました!</translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -671,7 +671,7 @@
 <context>
     <name>TimelineRow</name>
     <message>
-        <location filename="../qml/TimelineRow.qml" line="+84"/>
+        <location filename="../qml/TimelineRow.qml" line="+69"/>
         <source>Reply</source>
         <translation>返信</translation>
     </message>
@@ -684,7 +684,12 @@
 <context>
     <name>TimelineView</name>
     <message>
-        <location filename="../qml/TimelineView.qml" line="+32"/>
+        <location filename="../qml/TimelineView.qml" line="+45"/>
+        <source>Reply</source>
+        <translation type="unfinished">返信</translation>
+    </message>
+    <message>
+        <location line="+4"/>
         <source>Read receipts</source>
         <translation>開封確認</translation>
     </message>
@@ -714,7 +719,7 @@
         <translation>部屋が開いていません</translation>
     </message>
     <message>
-        <location line="+239"/>
+        <location line="+241"/>
         <source>Close</source>
         <translation>閉じる</translation>
     </message>
@@ -776,7 +781,7 @@
 <context>
     <name>UserSettingsPage</name>
     <message>
-        <location filename="../../src/UserSettingsPage.cpp" line="+290"/>
+        <location filename="../../src/UserSettingsPage.cpp" line="+296"/>
         <source>Minimize to tray</source>
         <translation>トレイへ最小化</translation>
     </message>
@@ -797,6 +802,11 @@
     </message>
     <message>
         <location line="+2"/>
+        <source>Show buttons in timeline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
         <source>Typing notifications</source>
         <translation>入力状態の通知</translation>
     </message>
@@ -846,7 +856,7 @@
         <translation>デバイスの指紋</translation>
     </message>
     <message>
-        <location line="-56"/>
+        <location line="-57"/>
         <source>Session Keys</source>
         <translation>セッション鍵</translation>
     </message>
@@ -866,22 +876,22 @@
         <translation>暗号化</translation>
     </message>
     <message>
-        <location line="-60"/>
+        <location line="-61"/>
         <source>GENERAL</source>
         <translation>全般</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location line="+23"/>
         <source>INTERFACE</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location line="+106"/>
         <source>Emoji Font Family</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+142"/>
+        <location line="+147"/>
         <source>Open Sessions File</source>
         <translation>セッションファイルを開く</translation>
     </message>
diff --git a/resources/langs/nheko_nl.ts b/resources/langs/nheko_nl.ts
index 3cb64e6c53c8be5a7d96abca0e2a41db43f14793..79e827146de4ecb51b514628d2868ce9f12012c5 100644
--- a/resources/langs/nheko_nl.ts
+++ b/resources/langs/nheko_nl.ts
@@ -4,13 +4,13 @@
 <context>
     <name>ChatPage</name>
     <message>
-        <location filename="../../src/ChatPage.cpp" line="+223"/>
+        <location filename="../../src/ChatPage.cpp" line="+225"/>
         <source>Failed to invite user: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <location line="+868"/>
+        <location line="+894"/>
         <source>Invited user: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -50,12 +50,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-815"/>
         <source>Failed to upload media. Please try again.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location line="+407"/>
         <source>Failed to restore OLM account. Please login again.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+714"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -544,42 +544,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -634,11 +634,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -654,12 +659,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -672,7 +672,7 @@
 <context>
     <name>TimelineRow</name>
     <message>
-        <location filename="../qml/TimelineRow.qml" line="+84"/>
+        <location filename="../qml/TimelineRow.qml" line="+69"/>
         <source>Reply</source>
         <translation type="unfinished"></translation>
     </message>
@@ -685,7 +685,12 @@
 <context>
     <name>TimelineView</name>
     <message>
-        <location filename="../qml/TimelineView.qml" line="+32"/>
+        <location filename="../qml/TimelineView.qml" line="+45"/>
+        <source>Reply</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
         <source>Read receipts</source>
         <translation type="unfinished">Leesbevestigingen</translation>
     </message>
@@ -715,7 +720,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+239"/>
+        <location line="+241"/>
         <source>Close</source>
         <translation type="unfinished"></translation>
     </message>
@@ -777,7 +782,7 @@
 <context>
     <name>UserSettingsPage</name>
     <message>
-        <location filename="../../src/UserSettingsPage.cpp" line="+290"/>
+        <location filename="../../src/UserSettingsPage.cpp" line="+296"/>
         <source>Minimize to tray</source>
         <translation>Minimaliseren naar systeemvak</translation>
     </message>
@@ -798,6 +803,11 @@
     </message>
     <message>
         <location line="+2"/>
+        <source>Show buttons in timeline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
         <source>Typing notifications</source>
         <translation>Meldingen bij typen van berichten</translation>
     </message>
@@ -847,7 +857,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-56"/>
+        <location line="-57"/>
         <source>Session Keys</source>
         <translation type="unfinished"></translation>
     </message>
@@ -867,22 +877,22 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-60"/>
+        <location line="-61"/>
         <source>GENERAL</source>
         <translation>ALGEMEEN</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location line="+23"/>
         <source>INTERFACE</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location line="+106"/>
         <source>Emoji Font Family</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+142"/>
+        <location line="+147"/>
         <source>Open Sessions File</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_pl.ts b/resources/langs/nheko_pl.ts
index f6764e8225d6b03cb2f135403dc37bb6c23859b5..774868dbc0981afeee9ed1e28d782853c5f07107 100644
--- a/resources/langs/nheko_pl.ts
+++ b/resources/langs/nheko_pl.ts
@@ -4,13 +4,13 @@
 <context>
     <name>ChatPage</name>
     <message>
-        <location filename="../../src/ChatPage.cpp" line="+223"/>
+        <location filename="../../src/ChatPage.cpp" line="+225"/>
         <source>Failed to invite user: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <location line="+868"/>
+        <location line="+894"/>
         <source>Invited user: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -50,12 +50,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-815"/>
         <source>Failed to upload media. Please try again.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location line="+407"/>
         <source>Failed to restore OLM account. Please login again.</source>
         <translation>Nie udało się przywrócić konta OLM. Spróbuj zalogować się ponownie.</translation>
     </message>
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+714"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -545,42 +545,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -635,11 +635,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -655,12 +660,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -673,7 +673,7 @@
 <context>
     <name>TimelineRow</name>
     <message>
-        <location filename="../qml/TimelineRow.qml" line="+84"/>
+        <location filename="../qml/TimelineRow.qml" line="+69"/>
         <source>Reply</source>
         <translation type="unfinished"></translation>
     </message>
@@ -686,7 +686,12 @@
 <context>
     <name>TimelineView</name>
     <message>
-        <location filename="../qml/TimelineView.qml" line="+32"/>
+        <location filename="../qml/TimelineView.qml" line="+45"/>
+        <source>Reply</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
         <source>Read receipts</source>
         <translation type="unfinished">Potwierdzenia przeczytania</translation>
     </message>
@@ -716,7 +721,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+239"/>
+        <location line="+241"/>
         <source>Close</source>
         <translation type="unfinished"></translation>
     </message>
@@ -778,7 +783,7 @@
 <context>
     <name>UserSettingsPage</name>
     <message>
-        <location filename="../../src/UserSettingsPage.cpp" line="+290"/>
+        <location filename="../../src/UserSettingsPage.cpp" line="+296"/>
         <source>Minimize to tray</source>
         <translation>Zminimalizuj do paska zadań</translation>
     </message>
@@ -799,6 +804,11 @@
     </message>
     <message>
         <location line="+2"/>
+        <source>Show buttons in timeline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
         <source>Typing notifications</source>
         <translation>Powiadomienia o pisaniu</translation>
     </message>
@@ -848,7 +858,7 @@
         <translation>Odcisk palca urzÄ…dzenia</translation>
     </message>
     <message>
-        <location line="-56"/>
+        <location line="-57"/>
         <source>Session Keys</source>
         <translation type="unfinished"></translation>
     </message>
@@ -868,22 +878,22 @@
         <translation>SZYFROWANIE</translation>
     </message>
     <message>
-        <location line="-60"/>
+        <location line="-61"/>
         <source>GENERAL</source>
         <translation>OGÓLNE</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location line="+23"/>
         <source>INTERFACE</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location line="+106"/>
         <source>Emoji Font Family</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+142"/>
+        <location line="+147"/>
         <source>Open Sessions File</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_ru.ts b/resources/langs/nheko_ru.ts
index a2c8c951aaa462e88c9906a0d751099de9f20a39..0dce43f5942e3c1248fe75e5d525e9469b824a10 100644
--- a/resources/langs/nheko_ru.ts
+++ b/resources/langs/nheko_ru.ts
@@ -4,13 +4,13 @@
 <context>
     <name>ChatPage</name>
     <message>
-        <location filename="../../src/ChatPage.cpp" line="+223"/>
+        <location filename="../../src/ChatPage.cpp" line="+225"/>
         <source>Failed to invite user: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <location line="+868"/>
+        <location line="+894"/>
         <source>Invited user: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -50,12 +50,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-815"/>
         <source>Failed to upload media. Please try again.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location line="+407"/>
         <source>Failed to restore OLM account. Please login again.</source>
         <translation>Не удалось восстановить учетную запись OLM. Пожалуйста, войдите снова.</translation>
     </message>
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+714"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished">Ошибка редактирования сообщения: %1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -545,42 +545,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -635,11 +635,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -655,12 +660,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -673,7 +673,7 @@
 <context>
     <name>TimelineRow</name>
     <message>
-        <location filename="../qml/TimelineRow.qml" line="+84"/>
+        <location filename="../qml/TimelineRow.qml" line="+69"/>
         <source>Reply</source>
         <translation type="unfinished"></translation>
     </message>
@@ -686,7 +686,12 @@
 <context>
     <name>TimelineView</name>
     <message>
-        <location filename="../qml/TimelineView.qml" line="+32"/>
+        <location filename="../qml/TimelineView.qml" line="+45"/>
+        <source>Reply</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
         <source>Read receipts</source>
         <translation type="unfinished">Подтверждать прочтение</translation>
     </message>
@@ -716,7 +721,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+239"/>
+        <location line="+241"/>
         <source>Close</source>
         <translation type="unfinished">Закрыть</translation>
     </message>
@@ -778,7 +783,7 @@
 <context>
     <name>UserSettingsPage</name>
     <message>
-        <location filename="../../src/UserSettingsPage.cpp" line="+290"/>
+        <location filename="../../src/UserSettingsPage.cpp" line="+296"/>
         <source>Minimize to tray</source>
         <translation>Сворачивать в системную панель</translation>
     </message>
@@ -799,6 +804,11 @@
     </message>
     <message>
         <location line="+2"/>
+        <source>Show buttons in timeline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
         <source>Typing notifications</source>
         <translation>Сообщать о наборе сообщения</translation>
     </message>
@@ -848,7 +858,7 @@
         <translation>Отпечаток устройства</translation>
     </message>
     <message>
-        <location line="-56"/>
+        <location line="-57"/>
         <source>Session Keys</source>
         <translation>Ключи сеанса</translation>
     </message>
@@ -868,22 +878,22 @@
         <translation>ШИФРОВАНИЕ</translation>
     </message>
     <message>
-        <location line="-60"/>
+        <location line="-61"/>
         <source>GENERAL</source>
         <translation>ГЛАВНОЕ</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location line="+23"/>
         <source>INTERFACE</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location line="+106"/>
         <source>Emoji Font Family</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+142"/>
+        <location line="+147"/>
         <source>Open Sessions File</source>
         <translation>Открыть файл сеансов</translation>
     </message>
diff --git a/resources/langs/nheko_zh_CN.ts b/resources/langs/nheko_zh_CN.ts
index 0ed3153ef46e260dbac6039ac5e9e9ad78e570dc..8bd4c750b4ae0409cacf3d8a914c9f901a24fd17 100644
--- a/resources/langs/nheko_zh_CN.ts
+++ b/resources/langs/nheko_zh_CN.ts
@@ -4,13 +4,13 @@
 <context>
     <name>ChatPage</name>
     <message>
-        <location filename="../../src/ChatPage.cpp" line="+223"/>
+        <location filename="../../src/ChatPage.cpp" line="+225"/>
         <source>Failed to invite user: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <location line="+868"/>
+        <location line="+894"/>
         <source>Invited user: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -50,12 +50,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-815"/>
         <source>Failed to upload media. Please try again.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location line="+407"/>
         <source>Failed to restore OLM account. Please login again.</source>
         <translation>恢复 OLM 账户失败。请重新登录。</translation>
     </message>
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+714"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished">删除消息失败:%1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -543,42 +543,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -633,11 +633,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -653,12 +658,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -671,7 +671,7 @@
 <context>
     <name>TimelineRow</name>
     <message>
-        <location filename="../qml/TimelineRow.qml" line="+84"/>
+        <location filename="../qml/TimelineRow.qml" line="+69"/>
         <source>Reply</source>
         <translation type="unfinished"></translation>
     </message>
@@ -684,7 +684,12 @@
 <context>
     <name>TimelineView</name>
     <message>
-        <location filename="../qml/TimelineView.qml" line="+32"/>
+        <location filename="../qml/TimelineView.qml" line="+45"/>
+        <source>Reply</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
         <source>Read receipts</source>
         <translation type="unfinished">阅读回执</translation>
     </message>
@@ -714,7 +719,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+239"/>
+        <location line="+241"/>
         <source>Close</source>
         <translation type="unfinished"></translation>
     </message>
@@ -776,7 +781,7 @@
 <context>
     <name>UserSettingsPage</name>
     <message>
-        <location filename="../../src/UserSettingsPage.cpp" line="+290"/>
+        <location filename="../../src/UserSettingsPage.cpp" line="+296"/>
         <source>Minimize to tray</source>
         <translation>最小化至托盘</translation>
     </message>
@@ -797,6 +802,11 @@
     </message>
     <message>
         <location line="+2"/>
+        <source>Show buttons in timeline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
         <source>Typing notifications</source>
         <translation>打字通知</translation>
     </message>
@@ -846,7 +856,7 @@
         <translation>设备指纹</translation>
     </message>
     <message>
-        <location line="-56"/>
+        <location line="-57"/>
         <source>Session Keys</source>
         <translation>会话密钥</translation>
     </message>
@@ -866,22 +876,22 @@
         <translation>加密</translation>
     </message>
     <message>
-        <location line="-60"/>
+        <location line="-61"/>
         <source>GENERAL</source>
         <translation>通用</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location line="+23"/>
         <source>INTERFACE</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location line="+106"/>
         <source>Emoji Font Family</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+142"/>
+        <location line="+147"/>
         <source>Open Sessions File</source>
         <translation>打开会话文件</translation>
     </message>
diff --git a/resources/qml/Avatar.qml b/resources/qml/Avatar.qml
index 0a53eac9836c257addc43539d9b85081ae18439c..54875f9fd23a2011a406bf0454dbaf4b3b972e6b 100644
--- a/resources/qml/Avatar.qml
+++ b/resources/qml/Avatar.qml
@@ -1,6 +1,5 @@
 import QtQuick 2.6
 import QtGraphicalEffects 1.0
-import Qt.labs.settings 1.0
 
 Rectangle {
 	id: avatar
@@ -8,12 +7,6 @@ Rectangle {
 	height: 48
 	radius: settings.avatar_circles ? height/2 : 3
 
-	Settings {
-		id: settings
-		category: "user"
-		property bool avatar_circles: true
-	}
-
 	property alias url: img.source
 	property string displayName
 
diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index 2984844f3620bf28b0ed87c9fd48394a9ff2b348..a9ae5f5c56b6d6d7a650f1bf623249d9b064c07a 100644
--- a/resources/qml/TimelineRow.qml
+++ b/resources/qml/TimelineRow.qml
@@ -8,36 +8,21 @@ import im.nheko 1.0
 import "./delegates"
 
 MouseArea {
-	id: rowArea
-
 	anchors.left: parent.left
 	anchors.right: parent.right
 	height: row.height
-
-	hoverEnabled: true
-	preventStealing: true
 	propagateComposedEvents: true
-	acceptedButtons: Qt.NoButton
-
-	property bool showButtons: false
+	preventStealing: true
 
-	Timer {
-		running: rowArea.containsMouse
-		interval: 150
-		onTriggered: rowArea.state = "showButtons"
+	acceptedButtons: Qt.LeftButton | Qt.RightButton
+	onClicked: {
+		if (mouse.button === Qt.RightButton)
+		messageContextMenu.show(model.id, model.type, row)
+	}
+	onPressAndHold: {
+		if (mouse.source === Qt.MouseEventNotSynthesized)
+		messageContextMenu.show(model.id, model.type, row)
 	}
-
-	states: [
-		State {
-			name: "hideButtons"
-			when: !rowArea.containsMouse
-			PropertyChanges { target: rowArea; showButtons: false; }
-		},
-		State {
-			name: "showButtons"
-			PropertyChanges { target: rowArea; showButtons: true; }
-		}
-	]
 
 	RowLayout {
 		id: row
@@ -70,7 +55,7 @@ MouseArea {
 		}
 
 		ImageButton {
-			visible: rowArea.showButtons
+			visible: timelineSettings.buttons
 			Layout.alignment: Qt.AlignRight | Qt.AlignTop
 			Layout.preferredHeight: 16
 			width: 16
@@ -86,7 +71,7 @@ MouseArea {
 			onClicked: chat.model.replyAction(model.id)
 		}
 		ImageButton {
-			visible: rowArea.showButtons
+			visible: timelineSettings.buttons
 			Layout.alignment: Qt.AlignRight | Qt.AlignTop
 			Layout.preferredHeight: 16
 			width: 16
@@ -125,6 +110,7 @@ MouseArea {
 				id: ma
 				anchors.fill: parent
 				hoverEnabled: true
+				propagateComposedEvents: true
 			}
 
 			ToolTip.visible: ma.containsMouse
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 46cf484baad48e72561c6919cf23a4320e891ad2..5612b04cef04d1dbf2ecd382ca83b27bc223e6c0 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -3,6 +3,7 @@ import QtQuick.Controls 2.3
 import QtQuick.Layouts 1.2
 import QtGraphicalEffects 1.0
 import QtQuick.Window 2.2
+import Qt.labs.settings 1.0
 
 import im.nheko 1.0
 
@@ -14,6 +15,18 @@ Item {
 	property var inactiveColors: currentInactivePalette ? currentInactivePalette : systemInactive
 	property int avatarSize: 40
 
+	Settings {
+		id: settings
+		category: "user"
+		property bool avatar_circles: true
+	}
+
+	Settings {
+		id: timelineSettings
+		category: "user/timeline"
+		property bool buttons: true
+	}
+
 	Menu {
 		id: messageContextMenu
 		palette: colors
@@ -28,6 +41,10 @@ Item {
 		property string eventId
 		property int eventType
 
+		MenuItem {
+			text: qsTr("Reply")
+			onClicked: chat.model.replyAction(messageContextMenu.eventId)
+		}
 		MenuItem {
 			text: qsTr("Read receipts")
 			onTriggered: chat.model.readReceiptsAction(messageContextMenu.eventId)
@@ -212,6 +229,7 @@ Item {
 								anchors.fill: parent
 								onClicked: chat.model.openUserProfile(modelData.userId)
 								cursorShape: Qt.PointingHandCursor
+								propagateComposedEvents: true
 							}
 						}
 
@@ -225,6 +243,7 @@ Item {
 								anchors.fill: parent
 								onClicked: chat.model.openUserProfile(section.split(" ")[0])
 								cursorShape: Qt.PointingHandCursor
+								propagateComposedEvents: true
 							}
 						}
 					}
diff --git a/resources/qml/delegates/ImageMessage.qml b/resources/qml/delegates/ImageMessage.qml
index 65e1c4548c9dfbde806465ccb7e37bfc1c6c99c1..229f8f0945de6752e02ef85f2b8fe5dae17ca5e5 100644
--- a/resources/qml/delegates/ImageMessage.qml
+++ b/resources/qml/delegates/ImageMessage.qml
@@ -3,7 +3,7 @@ import QtQuick 2.6
 import im.nheko 1.0
 
 Item {
-	property double tempWidth: Math.min(parent ? parent.width : undefined, model.data.width)
+	property double tempWidth: Math.min(parent ? parent.width : undefined, model.data.width < 1 ? parent.width : model.data.width)
 	property double tempHeight: tempWidth * model.data.proportionalHeight
 
 	property bool tooHigh: tempHeight > timelineRoot.height / 2
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index 7674f11cf5452bd324f5ce68b1139afb70fdfe50..91ecd58a51a234c8c7793863d11cbd969d379b95 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -307,16 +307,16 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
                  QString mimeClass,
                  const QString &fn,
                  const std::optional<RelatedInfo> &related) {
-                  QMimeDatabase db;
-                  QMimeType mime = db.mimeTypeForData(dev.data());
-
                   if (!dev->open(QIODevice::ReadOnly)) {
                           emit uploadFailed(
                             QString("Error while reading media: %1").arg(dev->errorString()));
                           return;
                   }
 
-                  auto bin     = dev->peek(dev->size());
+                  auto bin = dev->readAll();
+                  QMimeDatabase db;
+                  QMimeType mime = db.mimeTypeForData(bin);
+
                   auto payload = std::string(bin.data(), bin.size());
                   std::optional<mtx::crypto::EncryptedFile> encryptedFile;
                   if (cache::isRoomEncrypted(current_room_.toStdString())) {
@@ -328,10 +328,9 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
                   QSize dimensions;
                   QString blurhash;
                   if (mimeClass == "image") {
-                          dimensions = QImageReader(dev.data()).size();
-
                           QImage img;
                           img.loadFromData(bin);
+                          dimensions = img.size();
                           if (img.height() > 200 && img.width() > 360)
                                   img = img.scaled(360, 200, Qt::KeepAspectRatioByExpanding);
                           std::vector<unsigned char> data;
diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index 7bae01a08125f9f7a2189a14cdea789aca804456..6a7c5b35550b2ffb15801ca8a83bf31044b3b1e9 100644
--- a/src/UserSettingsPage.cpp
+++ b/src/UserSettingsPage.cpp
@@ -55,6 +55,7 @@ UserSettings::load()
         hasDesktopNotifications_      = settings.value("user/desktop_notifications", true).toBool();
         isStartInTrayEnabled_         = settings.value("user/window/start_in_tray", false).toBool();
         isGroupViewEnabled_           = settings.value("user/group_view", true).toBool();
+        isButtonsInTimelineEnabled_   = settings.value("user/timeline/buttons", true).toBool();
         isMarkdownEnabled_            = settings.value("user/markdown_enabled", true).toBool();
         isTypingNotificationsEnabled_ = settings.value("user/typing_notifications", true).toBool();
         ignoreMinorEvents_            = settings.value("user/minor_events", false).toBool();
@@ -127,6 +128,10 @@ UserSettings::save()
         settings.setValue("start_in_tray", isStartInTrayEnabled_);
         settings.endGroup();
 
+        settings.beginGroup("timeline");
+        settings.setValue("buttons", isButtonsInTimelineEnabled_);
+        settings.endGroup();
+
         settings.setValue("avatar_circles", avatarCircles_);
 
         settings.setValue("font_size", baseFontSize_);
@@ -192,6 +197,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
         startInTrayToggle_       = new Toggle{this};
         avatarCircles_           = new Toggle{this};
         groupViewToggle_         = new Toggle{this};
+        timelineButtonsToggle_   = new Toggle{this};
         typingNotifications_     = new Toggle{this};
         ignoreMinorEvents_       = new Toggle{this};
         readReceipts_            = new Toggle{this};
@@ -295,6 +301,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
         formLayout_->addRow(new HorizontalLine{this});
         boxWrap(tr("Circular Avatars"), avatarCircles_);
         boxWrap(tr("Group's sidebar"), groupViewToggle_);
+        boxWrap(tr("Show buttons in timeline"), timelineButtonsToggle_);
         boxWrap(tr("Typing notifications"), typingNotifications_);
         boxWrap(tr("Ignore minor events in room list"), ignoreMinorEvents_);
         formLayout_->addRow(new HorizontalLine{this});
@@ -402,6 +409,10 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
                 settings_->setIgnoreMinorEvents(!isDisabled);
         });
 
+        connect(timelineButtonsToggle_, &Toggle::toggled, this, [this](bool isDisabled) {
+                settings_->setButtonsInTimeline(!isDisabled);
+        });
+
         connect(readReceipts_, &Toggle::toggled, this, [this](bool isDisabled) {
                 settings_->setReadReceipts(!isDisabled);
         });
@@ -437,6 +448,7 @@ UserSettingsPage::showEvent(QShowEvent *)
         avatarCircles_->setState(!settings_->isAvatarCirclesEnabled());
         typingNotifications_->setState(!settings_->isTypingNotificationsEnabled());
         ignoreMinorEvents_->setState(!settings_->isIgnoreMinorEventsEnabled());
+        timelineButtonsToggle_->setState(!settings_->isButtonsInTimelineEnabled());
         readReceipts_->setState(!settings_->isReadReceiptsEnabled());
         markdownEnabled_->setState(!settings_->isMarkdownEnabled());
         desktopNotifications_->setState(!settings_->hasDesktopNotifications());
diff --git a/src/UserSettingsPage.h b/src/UserSettingsPage.h
index e1c522771bfaa4568c2f5eb50667108bf36786d3..9dbe643e341b448fec50df5a334a942aade6bd8e 100644
--- a/src/UserSettingsPage.h
+++ b/src/UserSettingsPage.h
@@ -90,6 +90,11 @@ public:
         void setIgnoreMinorEvents(bool state)
         {
                 ignoreMinorEvents_ = state;
+        }
+
+        void setButtonsInTimeline(bool state)
+        {
+                isButtonsInTimelineEnabled_ = state;
                 save();
         }
 
@@ -113,6 +118,7 @@ public:
         bool isMarkdownEnabled() const { return isMarkdownEnabled_; }
         bool isTypingNotificationsEnabled() const { return isTypingNotificationsEnabled_; }
         bool isIgnoreMinorEventsEnabled() const { return ignoreMinorEvents_; }
+        bool isButtonsInTimelineEnabled() const { return isButtonsInTimelineEnabled_; }
         bool isReadReceiptsEnabled() const { return isReadReceiptsEnabled_; }
         bool hasDesktopNotifications() const { return hasDesktopNotifications_; }
         double fontSize() const { return baseFontSize_; }
@@ -135,6 +141,7 @@ private:
         bool isMarkdownEnabled_;
         bool isTypingNotificationsEnabled_;
         bool ignoreMinorEvents_;
+        bool isButtonsInTimelineEnabled_;
         bool isReadReceiptsEnabled_;
         bool hasDesktopNotifications_;
         bool avatarCircles_;
@@ -183,6 +190,7 @@ private:
         Toggle *trayToggle_;
         Toggle *startInTrayToggle_;
         Toggle *groupViewToggle_;
+        Toggle *timelineButtonsToggle_;
         Toggle *typingNotifications_;
         Toggle *ignoreMinorEvents_;
         Toggle *readReceipts_;
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index e1d2e822b87656aa4cc50006b8ab3128944a7c0c..ec98da23ca729cc529b76befb05980a0ca58b9de 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -716,7 +716,7 @@ TimelineModel::decryptEvent(const mtx::events::EncryptedEvent<mtx::events::msg::
         dummy.sender           = e.sender;
         dummy.content.body =
           tr("-- Encrypted Event (No keys found for decryption) --",
-             "Placeholder, when the message was not decrypted yet or can't be decrypted")
+             "Placeholder, when the message was not decrypted yet or can't be decrypted.")
             .toStdString();
 
         try {
@@ -763,7 +763,7 @@ TimelineModel::decryptEvent(const mtx::events::EncryptedEvent<mtx::events::msg::
                 dummy.content.body =
                   tr("-- Decryption Error (%1) --",
                      "Placeholder, when the message can't be decrypted. In this case, the Olm "
-                     "decrytion returned an error, which is passed ad %1")
+                     "decrytion returned an error, which is passed ad %1.")
                     .arg(e.what())
                     .toStdString();
                 return {dummy, false};
@@ -792,7 +792,7 @@ TimelineModel::decryptEvent(const mtx::events::EncryptedEvent<mtx::events::msg::
         dummy.content.body =
           tr("-- Encrypted Event (Unknown event type) --",
              "Placeholder, when the message was decrypted, but we couldn't parse it, because "
-             "Nheko/mtxclient don't support that event type yet")
+             "Nheko/mtxclient don't support that event type yet.")
             .toStdString();
         return {dummy, false};
 }
@@ -1426,7 +1426,7 @@ QString
 TimelineModel::formatTypingUsers(const std::vector<QString> &users, QColor bg)
 {
         QString temp =
-          tr("%1 and %2 are typing",
+          tr("%1 and %2 are typing.",
              "Multiple users are typing. First argument is a comma separated list of potentially "
              "multiple users. Second argument is the last user of that list. (If only one user is "
              "typing, %1 is empty. You should still use it in your string though to silence Qt "
@@ -1494,9 +1494,9 @@ TimelineModel::formatJoinRuleEvent(QString id)
 
         switch (event->content.join_rule) {
         case mtx::events::state::JoinRule::Public:
-                return tr("%1 opened the room to the public").arg(name);
+                return tr("%1 opened the room to the public.").arg(name);
         case mtx::events::state::JoinRule::Invite:
-                return tr("%1 made this room require and invitation to join").arg(name);
+                return tr("%1 made this room require and invitation to join.").arg(name);
         default:
                 // Currently, knock and private are reserved keywords and not implemented in Matrix.
                 return "";
@@ -1519,9 +1519,9 @@ TimelineModel::formatGuestAccessEvent(QString id)
 
         switch (event->content.guest_access) {
         case mtx::events::state::AccessState::CanJoin:
-                return tr("%1 made the room open to guests").arg(name);
+                return tr("%1 made the room open to guests.").arg(name);
         case mtx::events::state::AccessState::Forbidden:
-                return tr("%1 has closed the room to guest access").arg(name);
+                return tr("%1 has closed the room to guest access.").arg(name);
         default:
                 return "";
         }
@@ -1545,16 +1545,16 @@ TimelineModel::formatHistoryVisibilityEvent(QString id)
         switch (event->content.history_visibility) {
         case mtx::events::state::Visibility::WorldReadable:
                 return tr("%1 made the room history world readable. Events may be now read by "
-                          "non-joined people")
+                          "non-joined people.")
                   .arg(name);
         case mtx::events::state::Visibility::Shared:
-                return tr("%1 set the room history visible to members from this point on")
+                return tr("%1 set the room history visible to members from this point on.")
                   .arg(name);
         case mtx::events::state::Visibility::Invited:
-                return tr("%1 set the room history visible to members since they were invited")
+                return tr("%1 set the room history visible to members since they were invited.")
                   .arg(name);
         case mtx::events::state::Visibility::Joined:
-                return tr("%1 set the room history visible to members since they joined the room")
+                return tr("%1 set the room history visible to members since they joined the room.")
                   .arg(name);
         default:
                 return "";
@@ -1661,7 +1661,7 @@ TimelineModel::formatMemberEvent(QString id)
                         else
                                 rendered = tr("Kicked %1.").arg(name);
                 } else if (prevEvent->content.membership == Membership::Ban) {
-                        rendered = tr("Unbanned %1").arg(name);
+                        rendered = tr("Unbanned %1.").arg(name);
                 } else if (prevEvent->content.membership == Membership::Knock) {
                         if (event->state_key == event->sender)
                                 rendered = tr("%1 redacted their knock.").arg(name);
@@ -1675,7 +1675,7 @@ TimelineModel::formatMemberEvent(QString id)
                 break;
 
         case Membership::Ban:
-                rendered = tr("%1 was banned").arg(name);
+                rendered = tr("%1 was banned.").arg(name);
                 break;
         case Membership::Knock:
                 rendered = tr("%1 knocked.").arg(name);