diff --git a/resources/qml/dialogs/RoomSettings.qml b/resources/qml/dialogs/RoomSettings.qml
index 442010fddf2caecbc0f006fe2426779aff3eb400..440516108201e8404f2549cd0a8569b2e5357242 100644
--- a/resources/qml/dialogs/RoomSettings.qml
+++ b/resources/qml/dialogs/RoomSettings.qml
@@ -17,8 +17,10 @@ ApplicationWindow {
 
     property var roomSettings
 
-    minimumWidth: 450
-    minimumHeight: 680
+    minimumWidth: 340
+    minimumHeight: 450
+    width: 450
+    height: 680
     palette: Nheko.colors
     color: Nheko.colors.window
     modality: Qt.NonModal
@@ -29,119 +31,134 @@ ApplicationWindow {
         sequence: StandardKey.Cancel
         onActivated: roomSettingsDialog.close()
     }
+    ScrollHelper {
+        flickable: flickable
+        anchors.fill: flickable
+    }
+    Flickable {
+        id: flickable
+        boundsBehavior: Flickable.StopAtBounds
+        anchors.fill: parent
+        clip: true
+        flickableDirection: Flickable.VerticalFlick
+        contentWidth: roomSettingsDialog.width
+        contentHeight: contentLayout1.height
+        ColumnLayout {
+            id: contentLayout1
+            width: parent.width
+            spacing: Nheko.paddingMedium
 
-    ColumnLayout {
-        id: contentLayout1
+            Avatar {
+                Layout.topMargin: Nheko.paddingMedium
+                url: roomSettings.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
+                roomid: roomSettings.roomId
+                displayName: roomSettings.roomName
+                height: 130
+                width: 130
+                Layout.alignment: Qt.AlignHCenter
+                onClicked: {
+                    if (roomSettings.canChangeAvatar)
+                        roomSettings.updateAvatar();
 
-        anchors.fill: parent
-        anchors.margins: Nheko.paddingMedium
-        spacing: Nheko.paddingMedium
-
-        Avatar {
-            url: roomSettings.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
-            roomid: roomSettings.roomId
-            displayName: roomSettings.roomName
-            height: 130
-            width: 130
-            Layout.alignment: Qt.AlignHCenter
-            onClicked: {
-                if (roomSettings.canChangeAvatar)
-                    roomSettings.updateAvatar();
+                }
+            }
 
+            Spinner {
+                Layout.alignment: Qt.AlignHCenter
+                visible: roomSettings.isLoading
+                foreground: Nheko.colors.mid
+                running: roomSettings.isLoading
             }
-        }
 
-        Spinner {
-            Layout.alignment: Qt.AlignHCenter
-            visible: roomSettings.isLoading
-            foreground: Nheko.colors.mid
-            running: roomSettings.isLoading
-        }
+            Text {
+                id: errorText
 
-        Text {
-            id: errorText
+                color: "red"
+                visible: opacity > 0
+                opacity: 0
+                Layout.alignment: Qt.AlignHCenter
+                wrapMode: Text.Wrap // somehow still doesn't wrap
+                Layout.fillWidth: true
+            }
 
-            color: "red"
-            visible: opacity > 0
-            opacity: 0
-            Layout.alignment: Qt.AlignHCenter
-        }
+            SequentialAnimation {
+                id: hideErrorAnimation
 
-        SequentialAnimation {
-            id: hideErrorAnimation
+                running: false
 
-            running: false
+                PauseAnimation {
+                    duration: 4000
+                }
 
-            PauseAnimation {
-                duration: 4000
-            }
+                NumberAnimation {
+                    target: errorText
+                    property: 'opacity'
+                    to: 0
+                    duration: 1000
+                }
 
-            NumberAnimation {
-                target: errorText
-                property: 'opacity'
-                to: 0
-                duration: 1000
             }
 
-        }
-
-        Connections {
-            target: roomSettings
-            function onDisplayError(errorMessage) {
-                errorText.text = errorMessage;
-                errorText.opacity = 1;
-                hideErrorAnimation.restart();
+            Connections {
+                target: roomSettings
+                function onDisplayError(errorMessage) {
+                    errorText.text = errorMessage;
+                    errorText.opacity = 1;
+                    hideErrorAnimation.restart();
+                }
             }
-        }
+                Label {
+                    text: roomSettings.roomName
+                    Layout.alignment: Qt.AlignHCenter
+                    font.pixelSize: fontMetrics.font.pixelSize * 2
+                    Layout.fillWidth: true
+                    horizontalAlignment: TextEdit.AlignHCenter
+                    color: Nheko.colors.text
+                    wrapMode: Text.Wrap
+                    textFormat: Text.RichText
+                }
 
-        ColumnLayout {
-            Layout.alignment: Qt.AlignHCenter
+                Label {
+                    text: qsTr("%n member(s)", "", roomSettings.memberCount)
+                    Layout.alignment: Qt.AlignHCenter
+                    color: Nheko.colors.text
 
-            MatrixText {
-                text: roomSettings.roomName
-                font.pixelSize: fontMetrics.font.pixelSize * 2
-                Layout.fillWidth: true
-                horizontalAlignment: TextEdit.AlignHCenter
-            }
-
-            MatrixText {
-                text: qsTr("%n member(s)", "", roomSettings.memberCount)
-                Layout.alignment: Qt.AlignHCenter
+                    TapHandler {
+                        onSingleTapped: TimelineManager.openRoomMembers(Rooms.getRoomById(roomSettings.roomId))
+                    }
 
-                TapHandler {
-                    onSingleTapped: TimelineManager.openRoomMembers(Rooms.getRoomById(roomSettings.roomId))
-                }
+                    CursorShape {
+                        cursorShape: Qt.PointingHandCursor
+                        anchors.fill: parent
+                    }
 
-                CursorShape {
-                    cursorShape: Qt.PointingHandCursor
-                    anchors.fill: parent
                 }
 
+            ImageButton {
+                Layout.alignment: Qt.AlignHCenter
+                image: ":/icons/icons/ui/edit.svg"
+                visible: roomSettings.canChangeNameAndTopic
+                onClicked: roomSettings.openEditModal()
             }
 
-        }
-
-        ImageButton {
-            Layout.alignment: Qt.AlignHCenter
-            image: ":/icons/icons/ui/edit.svg"
-            visible: roomSettings.canChangeNameAndTopic
-            onClicked: roomSettings.openEditModal()
-        }
-
-        ScrollView {
-            Layout.fillHeight: true
-            Layout.alignment: Qt.AlignHCenter
-            Layout.fillWidth: true
-            Layout.leftMargin: Nheko.paddingLarge
-            Layout.rightMargin: Nheko.paddingLarge
-
             TextArea {
+                id: roomTopic
+                property bool cut: implicitHeight > 100
+                property bool showMore
+                clip: true
+                Layout.maximumHeight: showMore? Number.POSITIVE_INFINITY : 100
+                Layout.preferredHeight: implicitHeight
+                Layout.alignment: Qt.AlignHCenter
+                Layout.fillWidth: true
+                Layout.leftMargin: Nheko.paddingLarge
+                Layout.rightMargin: Nheko.paddingLarge
+
                 text: TimelineManager.escapeEmoji(roomSettings.roomTopic)
                 wrapMode: TextEdit.WordWrap
                 textFormat: TextEdit.RichText
                 readOnly: true
                 background: null
-                selectByMouse: true
+                selectByMouse: !Settings.mobileMode
                 color: Nheko.colors.text
                 horizontalAlignment: TextEdit.AlignHCenter
                 onLinkActivated: Nheko.openLink(link)
@@ -152,171 +169,222 @@ ApplicationWindow {
                 }
 
             }
-
-        }
-
-        GridLayout {
-            columns: 2
-            rowSpacing: Nheko.paddingMedium
-
-            MatrixText {
-                text: qsTr("SETTINGS")
-                font.bold: true
-            }
-
             Item {
-                Layout.fillWidth: true
+                Layout.alignment: Qt.AlignHCenter
+                id: showMorePlaceholder
+                Layout.preferredHeight: showMoreButton.height
+                Layout.preferredWidth: showMoreButton.width
+                visible: roomTopic.cut
             }
 
-            MatrixText {
-                text: qsTr("Notifications")
+            GridLayout {
+                columns: 2
+                rowSpacing: Nheko.paddingMedium
+                Layout.margins: Nheko.paddingMedium
                 Layout.fillWidth: true
-            }
 
-            ComboBox {
-                model: [qsTr("Muted"), qsTr("Mentions only"), qsTr("All messages")]
-                currentIndex: roomSettings.notifications
-                onActivated: {
-                    roomSettings.changeNotifications(index);
+                Label {
+                    text: qsTr("SETTINGS")
+                    font.bold: true
+                    color: Nheko.colors.text
                 }
-                Layout.fillWidth: true
-            }
 
-            MatrixText {
-                text: qsTr("Room access")
-                Layout.fillWidth: true
-            }
+                Item {
+                    Layout.fillWidth: true
+                }
 
-            ComboBox {
-                enabled: roomSettings.canChangeJoinRules
-                model: {
-                    let opts = [qsTr("Anyone and guests"), qsTr("Anyone"), qsTr("Invited users")];
-                    if (roomSettings.supportsKnocking)
-                        opts.push(qsTr("By knocking"));
+                Label {
+                    text: qsTr("Notifications")
+                    Layout.fillWidth: true
+                    color: Nheko.colors.text
+                }
 
-                    if (roomSettings.supportsRestricted)
-                        opts.push(qsTr("Restricted by membership in other rooms"));
+                ComboBox {
+                    model: [qsTr("Muted"), qsTr("Mentions only"), qsTr("All messages")]
+                    currentIndex: roomSettings.notifications
+                    onActivated: {
+                        roomSettings.changeNotifications(index);
+                    }
+                    Layout.fillWidth: true
+                    WheelHandler{} // suppress scrolling changing values
+                }
 
-                    return opts;
+                Label {
+                    text: qsTr("Room access")
+                    Layout.fillWidth: true
+                    color: Nheko.colors.text
                 }
-                currentIndex: roomSettings.accessJoinRules
-                onActivated: {
-                    roomSettings.changeAccessRules(index);
+
+                ComboBox {
+                    enabled: roomSettings.canChangeJoinRules
+                    model: {
+                        let opts = [qsTr("Anyone and guests"), qsTr("Anyone"), qsTr("Invited users")];
+                        if (roomSettings.supportsKnocking)
+                            opts.push(qsTr("By knocking"));
+
+                        if (roomSettings.supportsRestricted)
+                            opts.push(qsTr("Restricted by membership in other rooms"));
+
+                        return opts;
+                    }
+                    currentIndex: roomSettings.accessJoinRules
+                    onActivated: {
+                        roomSettings.changeAccessRules(index);
+                    }
+                    Layout.fillWidth: true
+                    WheelHandler{} // suppress scrolling changing values
                 }
-                Layout.fillWidth: true
-            }
 
-            MatrixText {
-                text: qsTr("Encryption")
-            }
+                Label {
+                    text: qsTr("Encryption")
+                    color: Nheko.colors.text
+                }
 
-            ToggleButton {
-                id: encryptionToggle
+                ToggleButton {
+                    id: encryptionToggle
 
-                checked: roomSettings.isEncryptionEnabled
-                onCheckedChanged: {
-                    if (roomSettings.isEncryptionEnabled) {
-                        checked = true;
-                        return ;
+                    checked: roomSettings.isEncryptionEnabled
+                    onCheckedChanged: {
+                        if (roomSettings.isEncryptionEnabled) {
+                            checked = true;
+                            return ;
+                        }
+                        confirmEncryptionDialog.open();
                     }
-                    confirmEncryptionDialog.open();
+                    Layout.alignment: Qt.AlignRight
                 }
-                Layout.alignment: Qt.AlignRight
-            }
 
-            Platform.MessageDialog {
-                id: confirmEncryptionDialog
+                Platform.MessageDialog {
+                    id: confirmEncryptionDialog
 
-                title: qsTr("End-to-End Encryption")
-                text: qsTr("Encryption is currently experimental and things might break unexpectedly. <br>
-                            Please take note that it can't be disabled afterwards.")
-                modality: Qt.NonModal
-                onAccepted: {
-                    if (roomSettings.isEncryptionEnabled)
-                        return ;
+                    title: qsTr("End-to-End Encryption")
+                    text: qsTr("Encryption is currently experimental and things might break unexpectedly. <br>
+                                Please take note that it can't be disabled afterwards.")
+                    modality: Qt.NonModal
+                    onAccepted: {
+                        if (roomSettings.isEncryptionEnabled)
+                            return ;
 
-                    roomSettings.enableEncryption();
+                        roomSettings.enableEncryption();
+                    }
+                    onRejected: {
+                        encryptionToggle.checked = false;
+                    }
+                    buttons: Platform.MessageDialog.Ok | Platform.MessageDialog.Cancel
                 }
-                onRejected: {
-                    encryptionToggle.checked = false;
+
+                Label {
+                    text: qsTr("Sticker & Emote Settings")
+                    color: Nheko.colors.text
                 }
-                buttons: Platform.MessageDialog.Ok | Platform.MessageDialog.Cancel
-            }
 
-            MatrixText {
-                text: qsTr("Sticker & Emote Settings")
-            }
+                Button {
+                    text: qsTr("Change")
+                    ToolTip.text: qsTr("Change what packs are enabled, remove packs or create new ones")
+                    onClicked: TimelineManager.openImagePackSettings(roomSettings.roomId)
+                    Layout.alignment: Qt.AlignRight
+                }
 
-            Button {
-                text: qsTr("Change")
-                ToolTip.text: qsTr("Change what packs are enabled, remove packs or create new ones")
-                onClicked: TimelineManager.openImagePackSettings(roomSettings.roomId)
-                Layout.alignment: Qt.AlignRight
-            }
+                Label {
+                    text: qsTr("Hidden events")
+                    color: Nheko.colors.text
+                }
 
-            MatrixText {
-                text: qsTr("Hidden events")
-            }
+                HiddenEventsDialog {
+                    id: hiddenEventsDialog
+                    roomid: roomSettings.roomId
+                    roomName: roomSettings.roomName
+                }
 
-            HiddenEventsDialog {
-                id: hiddenEventsDialog
-                roomid: roomSettings.roomId
-                roomName: roomSettings.roomName
-            }
+                Button {
+                    text: qsTr("Configure")
+                    ToolTip.text: qsTr("Select events to hide in this room")
+                    onClicked: hiddenEventsDialog.show()
+                    Layout.alignment: Qt.AlignRight
+                }
 
-            Button {
-                text: qsTr("Configure")
-                ToolTip.text: qsTr("Select events to hide in this room")
-                onClicked: hiddenEventsDialog.show()
-                Layout.alignment: Qt.AlignRight
-            }
+                Item {
+                    // for adding extra space between sections
+                    Layout.fillWidth: true
+                }
 
-            Item {
-                // for adding extra space between sections
-                Layout.fillWidth: true
-            }
+                Item {
+                    // for adding extra space between sections
+                    Layout.fillWidth: true
+                }
 
-            Item {
-                // for adding extra space between sections
-                Layout.fillWidth: true
-            }
+                Label {
+                    text: qsTr("INFO")
+                    font.bold: true
+                    color: Nheko.colors.text
+                }
 
-            MatrixText {
-                text: qsTr("INFO")
-                font.bold: true
-            }
+                Item {
+                    Layout.fillWidth: true
+                }
 
-            Item {
-                Layout.fillWidth: true
-            }
+                Label {
+                    text: qsTr("Internal ID")
+                    color: Nheko.colors.text
+                }
 
-            MatrixText {
-                text: qsTr("Internal ID")
-            }
+                AbstractButton { // AbstractButton does not allow setting text color
+                    Layout.alignment: Qt.AlignRight
+                    Layout.fillWidth: true
+                    Layout.preferredHeight: idLabel.height
+                    Label { // TextEdit does not trigger onClicked
+                        id: idLabel
+                        text: roomSettings.roomId
+                        font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 0.8)
+                        color: Nheko.colors.text
+                        width: parent.width
+                        horizontalAlignment: Text.AlignRight
+                        wrapMode: Text.WrapAnywhere
+                        ToolTip.text: qsTr("Copied to clipboard")
+                        ToolTip.visible: toolTipTimer.running
+                    }
+                    TextEdit{ // label does not allow selection
+                        id: textEdit
+                        visible: false
+                        text: roomSettings.roomId
+                    }
+                    onClicked: {
+                        textEdit.selectAll()
+                        textEdit.copy()
+                        toolTipTimer.start()
+                    }
+                    Timer {
+                        id: toolTipTimer
+                    }
+                }
 
-            MatrixText {
-                text: roomSettings.roomId
-                font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 0.8)
-                Layout.alignment: Qt.AlignRight
-            }
+                Label {
+                    text: qsTr("Room Version")
+                    color: Nheko.colors.text
+                }
 
-            MatrixText {
-                text: qsTr("Room Version")
-            }
+                Label {
+                    text: roomSettings.roomVersion
+                    font.pixelSize: fontMetrics.font.pixelSize
+                    Layout.alignment: Qt.AlignRight
+                    color: Nheko.colors.text
+                }
 
-            MatrixText {
-                text: roomSettings.roomVersion
-                font.pixelSize: fontMetrics.font.pixelSize
-                Layout.alignment: Qt.AlignRight
             }
-
         }
-
-        DialogButtonBox {
-            Layout.fillWidth: true
-            standardButtons: DialogButtonBox.Ok
-            onAccepted: close()
+    }
+    Button {
+        id: showMoreButton
+        anchors.horizontalCenter: flickable.horizontalCenter
+        y: Math.min(showMorePlaceholder.y+contentLayout1.y-flickable.contentY,flickable.height-height)
+        visible: roomTopic.cut
+        text: roomTopic.showMore? "show less" : "show more"
+        onClicked: {roomTopic.showMore = !roomTopic.showMore
+            console.log(flickable.visibleArea)
         }
-
+    }
+    footer: DialogButtonBox {
+        standardButtons: DialogButtonBox.Ok
+        onAccepted: close()
     }
 }