diff --git a/qml.qrc b/qml.qrc
index 99bff5e8ec0024b2978b55443bc6a5a6059ee674..65a2d1c11b4e8b41c81ae63db14dc21881e03981 100644
--- a/qml.qrc
+++ b/qml.qrc
@@ -204,5 +204,8 @@
         <file>src/app/mainview/components/BackupTipBox.qml</file>
         <file>src/app/mainview/components/InformativeTipBox.qml</file>
         <file>src/app/commoncomponents/TimestampInfo.qml</file>
+        <file>src/app/commoncomponents/MaterialTextField.qml</file>
+        <file>src/app/commoncomponents/ModalTextEdit.qml</file>
+        <file>src/app/commoncomponents/UsernameTextEdit.qml</file>
     </qresource>
 </RCC>
diff --git a/src/app/commoncomponents/MaterialTextField.qml b/src/app/commoncomponents/MaterialTextField.qml
new file mode 100644
index 0000000000000000000000000000000000000000..dc6ddea0e9e93c0c99821376057e0de21d61c504
--- /dev/null
+++ b/src/app/commoncomponents/MaterialTextField.qml
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import QtQuick
+import QtQuick.Controls
+import Qt5Compat.GraphicalEffects
+
+import net.jami.Constants 1.1
+
+TextField {
+    id: root
+
+    // We need to remove focus when another widget takes activeFocus,
+    // except the context menu.
+    property bool isActive: activeFocus || contextMenu.active
+    onActiveFocusChanged: {
+        if (!activeFocus && !contextMenu.active) {
+            root.focus = false
+        }
+    }
+
+    property bool inputIsValid: true
+
+    property string prefixIconSrc
+    property alias prefixIconColor: prefixIcon.color
+    property string suffixIconSrc
+    property alias suffixIconColor: suffixIcon.color
+    property color accent: isActive
+                           ? prefixIconColor
+                           : JamiTheme.buttonTintedBlue
+    property color baseColor: JamiTheme.primaryForegroundColor
+    color: JamiTheme.textColor
+    placeholderTextColor: !isActive
+                          ? JamiTheme.transparentColor
+                          : JamiTheme.placeholderTextColor
+
+    property alias infoTipText: infoTip.text
+
+    wrapMode: Text.Wrap
+    font.pointSize: JamiTheme.materialLineEditPointSize
+    font.kerning: true
+    selectByMouse: true
+    mouseSelectionMode: TextInput.SelectCharacters
+
+    height: implicitHeight
+    leftPadding: readOnly || prefixIconSrc === '' ? 0 : 32
+    rightPadding: readOnly || suffixIconSrc === '' ? 0 : 32
+    bottomPadding: 20
+    topPadding: 2
+
+    onIsActiveChanged: if (!isActive && !readOnly) text = ''
+    Keys.onPressed: function (event) {
+        if (event.key === Qt.Key_Enter
+                || event.key === Qt.Key_Return) {
+            if (inputIsValid) {
+                root.accepted()
+            }
+            event.accepted = true
+        }
+    }
+
+    // Context menu.
+    LineEditContextMenu {
+        id: contextMenu
+
+        lineEditObj: root
+        selectOnly: readOnly
+    }
+    onReleased: function (event) {
+        if (event.button === Qt.RightButton)
+            contextMenu.openMenuAt(event)
+    }
+
+    // The centered placeholder that appears in the design specs.
+    Label {
+        id: overBaseLineLabel
+        font.pointSize: root.font.pointSize
+        anchors.baseline: root.baseline
+        anchors.horizontalCenter: root.horizontalCenter
+        text: root.placeholderText
+        color: root.baseColor
+        visible: !root.isActive && !readOnly
+    }
+
+    Rectangle {
+        id: baselineLine
+        width: parent.width
+        height: 1
+        anchors.top: root.baseline
+        anchors.topMargin: root.font.pointSize
+        color: root.accent
+        visible: !readOnly
+    }
+
+    component TextFieldIcon: ResponsiveImage {
+        property real size: 18
+        width: visible ? size : 0
+        height: size
+        anchors.verticalCenter: parent.verticalCenter
+        anchors.verticalCenterOffset: -root.bottomPadding / 2
+        opacity: root.isActive && !readOnly && source.toString() !== ''
+        visible: opacity
+        HoverHandler { cursorShape: Qt.ArrowCursor }
+        Behavior on opacity {
+            NumberAnimation { duration: JamiTheme.longFadeDuration }
+        }
+    }
+
+    TextFieldIcon {
+        id: prefixIcon
+        anchors.left: parent.left
+        color: prefixIconColor
+        source: prefixIconSrc
+    }
+
+    Label {
+        id: underBaseLineLabel
+        font.pointSize: root.font.pointSize - 3
+        anchors.top: baselineLine.bottom
+        anchors.topMargin: 2
+        text: root.placeholderText
+        color: root.baseColor
+
+        // Show the alternate placeholder while the user types.
+        visible: root.text.toString() !== '' && !readOnly
+    }
+
+    TextFieldIcon {
+        id: suffixIcon
+        size: 20
+        anchors.right: parent.right
+        color: suffixIconColor
+        source: suffixIconSrc
+
+        MaterialToolTip {
+            id: infoTip
+            textColor: JamiTheme.blackColor
+            backGroundColor: JamiTheme.whiteColor
+            visible: parent.hovered && infoTipText.toString() !== ''
+            delay: Qt.styleHints.mousePressAndHoldInterval
+        }
+    }
+
+    background: null
+}
diff --git a/src/app/commoncomponents/ModalTextEdit.qml b/src/app/commoncomponents/ModalTextEdit.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c9616f2e1a380a65a43cb57652b65e29b9fc1813
--- /dev/null
+++ b/src/app/commoncomponents/ModalTextEdit.qml
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import QtQuick
+
+import net.jami.Constants 1.1
+
+// This component is used to display and edit a value.
+Loader {
+    id: root
+
+    property string prefixIconSrc
+    property color prefixIconColor
+    property string suffixIconSrc
+    property color suffixIconColor
+
+    required property string placeholderText
+    required property string staticText
+    property string dynamicText
+    property bool inputIsValid: true
+    property string infoTipText
+
+    property variant validator
+
+    property real fontPointSize: JamiTheme.materialLineEditPointSize
+
+    // Always start with the static text component displayed first.
+    property bool editMode: false
+
+    // Emitted when the editor has been accepted.
+    signal accepted
+
+    // Always give up focus when accepted.
+    onAccepted: focus = false
+
+    // This is used when the user is not editing the text.
+    Component {
+        id: usernameDisplayComp
+        MaterialTextField {
+            font.pointSize: root.fontPointSize
+            readOnly: true
+            text: staticText
+            horizontalAlignment: TextEdit.AlignHCenter
+        }
+    }
+
+    // This is used when the user is editing the text.
+    Component {
+        id: usernameEditComp
+        MaterialTextField {
+            focus: true
+            infoTipText: root.infoTipText
+            prefixIconSrc: root.prefixIconSrc
+            prefixIconColor: root.prefixIconColor
+            suffixIconSrc: root.suffixIconSrc
+            suffixIconColor: root.suffixIconColor
+            font.pointSize: root.fontPointSize
+            placeholderText: root.placeholderText
+            validator: root.validator
+            onAccepted: root.accepted()
+            onTextChanged: dynamicText = text
+            inputIsValid: root.inputIsValid
+            onFocusChanged: if (!focus) root.editMode = false
+        }
+    }
+
+    // We use a loader to switch between the two components depending on the
+    // editMode property.
+    sourceComponent: {
+        editMode
+                ? usernameEditComp
+                : usernameDisplayComp
+    }
+}
diff --git a/src/app/commoncomponents/UsernameTextEdit.qml b/src/app/commoncomponents/UsernameTextEdit.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5f33efbe12da1d377861a690dc30d8b92849148a
--- /dev/null
+++ b/src/app/commoncomponents/UsernameTextEdit.qml
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import QtQuick
+
+import net.jami.Adapters 1.1
+import net.jami.Constants 1.1
+import net.jami.Models 1.1
+
+ModalTextEdit {
+    id: root
+
+    prefixIconSrc: {
+        switch(nameRegistrationState){
+        case UsernameLineEdit.NameRegistrationState.FREE:
+            return JamiResources.circled_green_check_svg
+        case UsernameLineEdit.NameRegistrationState.INVALID:
+        case UsernameLineEdit.NameRegistrationState.TAKEN:
+            return JamiResources.circled_red_cross_svg
+        case UsernameLineEdit.NameRegistrationState.BLANK:
+        default:
+            return JamiResources.person_24dp_svg
+        }
+    }
+    prefixIconColor: {
+        switch(nameRegistrationState){
+        case UsernameLineEdit.NameRegistrationState.FREE:
+            return "#009980"
+        case UsernameLineEdit.NameRegistrationState.INVALID:
+        case UsernameLineEdit.NameRegistrationState.TAKEN:
+            return "#CC0022"
+        case UsernameLineEdit.NameRegistrationState.BLANK:
+        default:
+            return JamiTheme.editLineColor
+        }
+    }
+    suffixIconSrc: JamiResources.outline_info_24dp_svg
+    suffixIconColor: JamiTheme.buttonTintedBlue
+
+    property string infohash: CurrentAccount.uri
+    property string registeredName: CurrentAccount.registeredName
+    property bool hasRegisteredName: registeredName !== ''
+
+    infoTipText: JamiStrings.usernameToolTip
+    placeholderText: JamiStrings.chooseAUsername
+    staticText: hasRegisteredName ? registeredName : infohash
+
+    enum NameRegistrationState { BLANK, INVALID, TAKEN, FREE, SEARCHING }
+    property int nameRegistrationState: UsernameLineEdit.NameRegistrationState.BLANK
+
+    validator: RegularExpressionValidator { regularExpression: /[A-z0-9_]{0,32}/ }
+    inputIsValid: dynamicText.length === 0
+                  || nameRegistrationState === UsernameLineEdit.NameRegistrationState.FREE
+
+    Connections {
+        target: CurrentAccount
+
+        function onRegisteredNameChanged() {
+            root.editMode = false
+        }
+    }
+
+    Connections {
+        id: registeredNameFoundConnection
+
+        target: NameDirectory
+        enabled: dynamicText.length !== 0
+
+        function onRegisteredNameFound(status, address, name) {
+            if (dynamicText === name) {
+                switch(status) {
+                case NameDirectory.LookupStatus.NOT_FOUND:
+                    nameRegistrationState = UsernameLineEdit.NameRegistrationState.FREE
+                    break
+                case NameDirectory.LookupStatus.ERROR:
+                case NameDirectory.LookupStatus.INVALID_NAME:
+                case NameDirectory.LookupStatus.INVALID:
+                    nameRegistrationState = UsernameLineEdit.NameRegistrationState.INVALID
+                    break
+                case NameDirectory.LookupStatus.SUCCESS:
+                    nameRegistrationState = UsernameLineEdit.NameRegistrationState.TAKEN
+                    break
+                }
+            }
+        }
+    }
+
+    Timer {
+        id: lookupTimer
+
+        repeat: false
+        interval: JamiTheme.usernameLineEditlookupInterval
+
+        onTriggered: {
+            if (dynamicText.length !== 0) {
+                nameRegistrationState = UsernameLineEdit.NameRegistrationState.SEARCHING
+                NameDirectory.lookupName(CurrentAccount.id, dynamicText)
+            } else {
+                nameRegistrationState = UsernameLineEdit.NameRegistrationState.BLANK
+            }
+        }
+    }
+    onDynamicTextChanged: lookupTimer.restart()
+
+    function startEditing() {
+        if (!hasRegisteredName) {
+            root.editMode = true
+            forceActiveFocus()
+            nameRegistrationState = UsernameLineEdit.NameRegistrationState.BLANK
+        }
+    }
+}
diff --git a/src/app/commoncomponents/contextmenu/ContextMenuAutoLoader.qml b/src/app/commoncomponents/contextmenu/ContextMenuAutoLoader.qml
index 009e3e8d7500ced685c7619b0b4d625bff666741..0846f6148186fde9ce77026c41d39fa960053a6c 100644
--- a/src/app/commoncomponents/contextmenu/ContextMenuAutoLoader.qml
+++ b/src/app/commoncomponents/contextmenu/ContextMenuAutoLoader.qml
@@ -30,6 +30,8 @@ Loader {
     property int contextMenuItemPreferredHeight: 0
     property int contextMenuSeparatorPreferredHeight: 0
 
+    active: false
+
     function openMenu() {
         root.active = true
         root.sourceComponent = menuComponent
diff --git a/src/app/mainview/components/JamiIdentifier.qml b/src/app/mainview/components/JamiIdentifier.qml
index 2cd177284322ef8cfe4d8de1975f161a693cdf22..3c3545f6bc7528d6eb0270714b04ad72f3ac375c 100644
--- a/src/app/mainview/components/JamiIdentifier.qml
+++ b/src/app/mainview/components/JamiIdentifier.qml
@@ -1,6 +1,5 @@
 /*
  * Copyright (C) 2022 Savoir-faire Linux Inc.
- * Author: Fadi Shehadeh <fadi.shehadeh@savoirfairelinux.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,6 +18,7 @@
 import QtQuick
 import QtQuick.Controls
 import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -27,182 +27,134 @@ import net.jami.Constants 1.1
 import "../../commoncomponents"
 import "../../settingsview/components"
 
-Rectangle {
-
+Item {
     id: root
 
     NameRegistrationDialog {
         id : nameRegistrationDialog
-
-        onAccepted: jamiRegisteredNameText.nameRegistrationState =
+        onAccepted: usernameTextEdit.nameRegistrationState =
                     UsernameLineEdit.NameRegistrationState.BLANK
     }
 
-    property bool editable: false
-    property bool editing: false
-
-    radius: 20
-    Layout.bottomMargin: JamiTheme.jamiIdMargins
-    Layout.leftMargin: JamiTheme.jamiIdMargins
-    property var minWidth: mainRectangle.width + secondLine.implicitWidth
-    width: Math.max(minWidth, jamiRegisteredNameText.width + 2 * JamiTheme.preferredMarginSize)
-    height: firstLine.implicitHeight + jamiRegisteredNameText.height + 12
-    color: JamiTheme.secondaryBackgroundColor
-
-    ColumnLayout {
-        RowLayout {
-            id: firstLine
-            Layout.alignment: Qt.AlignTop
-            Layout.preferredWidth: root.width
-
-            Rectangle {
-                id: mainRectangle
-
-                width: 97
-                height: 40
-                color: JamiTheme.mainColor
-                radius: 20
+    width: childrenRect.width
+    height: controlsLayout.height + usernameTextEdit.height
+            + 2 * JamiTheme.preferredMarginSize
 
+    // Background rounded rectangle.
+    Rectangle {
+        id: outerRect
+        anchors.fill: parent; radius: 20
+        color: JamiTheme.secondaryBackgroundColor
+    }
 
-                Rectangle {
-                    id: rectForRadius
-                    anchors.bottom: parent.bottom
-                    width: 20
-                    height: 20
-                    color: JamiTheme.mainColor
-                }
+    // Logo masked by outerRect.
+    Item {
+        anchors.fill: outerRect
+        layer.enabled: true; layer.effect: OpacityMask { maskSource: outerRect }
+
+        Rectangle {
+            id: logoRect
+            width: 97 + radius
+            height: 40
+            color: JamiTheme.mainColor
+            radius: 20
+            anchors.top: parent.top
+            anchors.left: parent.left
+            anchors.leftMargin: -radius
+
+            ResponsiveImage {
+                id: jamiIdLogo
+                anchors.horizontalCenter: parent.horizontalCenter
+                // Adjust offset for parent masking margin.
+                anchors.horizontalCenterOffset: parent.radius / 2
+                anchors.verticalCenter: parent.verticalCenter
+                width: JamiTheme.jamiIdLogoWidth
+                height: JamiTheme.jamiIdLogoHeight
+                source: JamiResources.jamiid_svg
+            }
+        }
+    }
 
-                ResponsiveImage {
-                    id: jamiIdLogo
-                    anchors.horizontalCenter: parent.horizontalCenter
-                    anchors.verticalCenter: parent.verticalCenter
-                    width: JamiTheme.jamiIdLogoWidth
-                    height: JamiTheme.jamiIdLogoHeight
-                    opacity: 1
+    ColumnLayout {
+        id: columnLayout
 
-                    source: JamiResources.jamiid_svg
+        spacing: JamiTheme.preferredMarginSize
 
-                }
+        RowLayout {
+            id: controlsLayout
+
+            Layout.alignment: Qt.AlignTop | Qt.AlignRight
+            Layout.topMargin: JamiTheme.pushButtonMargin
+            Layout.rightMargin: JamiTheme.pushButtonMargin
+            Layout.preferredHeight: childrenRect.height
+
+            component JamiIdControlButton: PushButton {
+                preferredSize : 30
+                normalColor: JamiTheme.transparentColor
+                hoveredColor: JamiTheme.transparentColor
+                imageContainerWidth: JamiTheme.pushButtonSize
+                imageContainerHeight: JamiTheme.pushButtonSize
+                border.color: JamiTheme.tintedBlue
+                imageColor: JamiTheme.buttonTintedBlue
             }
 
-            RowLayout {
-                id: secondLine
-                Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
-
-                PushButton {
-                    id: btnEdit
-
-                    preferredSize : 30
-                    imageContainerWidth: JamiTheme.pushButtonSize
-                    imageContainerHeight: JamiTheme.pushButtonSize
-
-                    Layout.topMargin: JamiTheme.pushButtonMargin
-
-                    imageColor: enabled ? JamiTheme.buttonTintedBlue :  JamiTheme.buttonTintedBlack
-                    normalColor: JamiTheme.transparentColor
-                    hoveredColor: JamiTheme.transparentColor
-                    visible: editable && CurrentAccount.registeredName === ""
-                    border.color: enabled ? JamiTheme.buttonTintedBlue :  JamiTheme.buttonTintedBlack
-
-                    enabled: {
-                        switch(jamiRegisteredNameText.nameRegistrationState) {
-                        case UsernameLineEdit.NameRegistrationState.BLANK:
-                        case UsernameLineEdit.NameRegistrationState.FREE:
-                            return true
-                        case UsernameLineEdit.NameRegistrationState.SEARCHING:
-                        case UsernameLineEdit.NameRegistrationState.INVALID:
-                        case UsernameLineEdit.NameRegistrationState.TAKEN:
-                            return false
-                        }
-                    }
-
-                    source: JamiResources.round_edit_24dp_svg
-                    toolTipText: JamiStrings.chooseUsername
-
-                    onClicked: {
-                        if (!root.editing) {
-                            root.editing = !root.editing
-                            source = JamiResources.check_black_24dp_svg
-                            jamiRegisteredNameText.text = ""
-                            jamiRegisteredNameText.forceActiveFocus()
-                        } else {
-                            root.editing = !root.editing
-                            source = JamiResources.round_edit_24dp_svg
-                            jamiRegisteredNameText.accepted()
-                            jamiRegisteredNameText.focus = false
-                        }
+            JamiIdControlButton {
+                id: btnEdit
+                visible: CurrentAccount.registeredName === ""
+                border.color: enabled ? JamiTheme.buttonTintedBlue :  JamiTheme.buttonTintedBlack
+                imageColor: enabled ? JamiTheme.buttonTintedBlue :  JamiTheme.buttonTintedBlack
+                enabled: {
+                    if (!usernameTextEdit.editMode)
+                        return true
+                    switch(usernameTextEdit.nameRegistrationState) {
+                    case UsernameLineEdit.NameRegistrationState.BLANK:
+                    case UsernameLineEdit.NameRegistrationState.FREE:
+                        return true
+                    case UsernameLineEdit.NameRegistrationState.SEARCHING:
+                    case UsernameLineEdit.NameRegistrationState.INVALID:
+                    case UsernameLineEdit.NameRegistrationState.TAKEN:
+                        return false
                     }
                 }
-
-                PushButton {
-                    id: btnCopy
-
-                    imageColor: JamiTheme.buttonTintedBlue
-                    normalColor: JamiTheme.transparentColor
-                    hoveredColor: JamiTheme.transparentColor
-                    Layout.topMargin: JamiTheme.pushButtonMargin
-
-                    preferredSize : 30
-                    imageContainerWidth: JamiTheme.pushButtonSize
-                    imageContainerHeight: JamiTheme.pushButtonSize
-
-                    border.color: JamiTheme.tintedBlue
-
-                    source: JamiResources.content_copy_24dp_svg
-                    toolTipText: JamiStrings.copy
-
-                    onClicked: UtilsAdapter.setClipboardText(CurrentAccount.bestId)
+                source: usernameTextEdit.editMode
+                        ? JamiResources.check_black_24dp_svg
+                        : JamiResources.round_edit_24dp_svg
+                toolTipText: JamiStrings.chooseUsername
+                onClicked: {
+                    if (!usernameTextEdit.editMode) {
+                        usernameTextEdit.startEditing()
+                    } else {
+                        usernameTextEdit.accepted()
+                    }
                 }
+            }
 
-                PushButton {
-                    id: btnShare
-
-                    imageColor: JamiTheme.buttonTintedBlue
-                    normalColor: JamiTheme.transparentColor
-                    hoveredColor: JamiTheme.transparentColor
-                    Layout.topMargin: JamiTheme.pushButtonMargin
-                    Layout.rightMargin: JamiTheme.pushButtonMargin
-                    preferredSize : 30
-                    imageContainerWidth: JamiTheme.pushButtonSize
-                    imageContainerHeight: JamiTheme.pushButtonSize
-
-                    border.color: JamiTheme.buttonTintedBlue
-
-                    source: JamiResources.share_24dp_svg
-                    toolTipText: JamiStrings.share
-
-                    onClicked: qrDialog.open()
-                }
+            JamiIdControlButton {
+                id: btnCopy
+                source: JamiResources.content_copy_24dp_svg
+                toolTipText: JamiStrings.copy
+                onClicked: UtilsAdapter.setClipboardText(CurrentAccount.bestId)
+            }
 
+            JamiIdControlButton {
+                id: btnShare
+                source: JamiResources.share_24dp_svg
+                toolTipText: JamiStrings.share
+                onClicked: qrDialog.open()
             }
         }
 
-        UsernameLineEdit {
-            id: jamiRegisteredNameText
-            readOnly: !root.editing
-            Layout.preferredWidth: 330
+        UsernameTextEdit {
+            id: usernameTextEdit
 
-            horizontalAlignment: Qt.AlignHCenter
+            Layout.preferredWidth: 330
+            Layout.preferredHeight: implicitHeight + JamiTheme.preferredMarginSize
+            Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
             Layout.leftMargin: JamiTheme.preferredMarginSize
             Layout.rightMargin: JamiTheme.preferredMarginSize
-            backgroundColor: JamiTheme.secondaryBackgroundColor
-
-            font.pointSize: JamiTheme.textFontSize + 1
+            fontPointSize: JamiTheme.textFontSize + 1
 
-            text: CurrentAccount.bestId
-            color: JamiTheme.textColor
-
-            onAccepted: {
-                if (!btnEdit.enabled)
-                    return
-                if (text.length === 0) {
-                    text = CurrentAccount.bestId
-                } else {
-                    nameRegistrationDialog.openNameRegistrationDialog(text)
-                }
-            }
+            onAccepted: nameRegistrationDialog.openNameRegistrationDialog(dynamicText)
         }
     }
-
 }
-
diff --git a/src/app/mainview/components/TipBox.qml b/src/app/mainview/components/TipBox.qml
index 86691dcac543ae1f39f58a5eea8adb94fc526983..86bd5e9651c19506c1a68874e84ce1ea17afa6e0 100644
--- a/src/app/mainview/components/TipBox.qml
+++ b/src/app/mainview/components/TipBox.qml
@@ -31,13 +31,13 @@ import "../../commoncomponents"
 Item {
 
     id: root
-    property var title: ""
-    property var description: ""
+    property string title: ""
+    property string description: ""
     property int tipId: 0
     property string type : ""
     property bool hovered: false
     property bool clicked : false
-    property bool opened: false
+    property bool opened: activeFocus
 
     property string customizeTip:"CustomizeTipBox {}"
 
@@ -89,7 +89,7 @@ Item {
 
     TapHandler {
         target: rect
-        onTapped: opened = !opened
+        onTapped: opened ? focus = false : root.forceActiveFocus()
     }
 
     DropShadow {
diff --git a/src/app/mainview/components/WelcomePage.qml b/src/app/mainview/components/WelcomePage.qml
index 5e5abe860cf60fefda410bde7f33215d32086e3c..02edab7ac9c4a6f06955de42b72dd810547066e1 100644
--- a/src/app/mainview/components/WelcomePage.qml
+++ b/src/app/mainview/components/WelcomePage.qml
@@ -1,6 +1,5 @@
 /*
- * Copyright (C) 2020-2022 Savoir-faire Linux Inc.
- * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,11 +38,7 @@ Rectangle {
         MouseArea {
             anchors.fill: parent
             enabled: visible
-            onClicked: {
-                for (var c in flow.children) {
-                    flow.children[c].opened = false
-                }
-            }
+            onClicked: welcomeView.forceActiveFocus()
         }
 
         anchors.fill: root
@@ -67,7 +62,8 @@ Rectangle {
                     color: JamiTheme.rectColor
                     anchors.topMargin: 25
                     anchors.horizontalCenter: parent.horizontalCenter
-                    width: identifier.width + 2 * JamiTheme.preferredMarginSize + (welcomeLogo.visible ?  welcomeLogo.width : 0)
+                    width: identifier.width + 2 * JamiTheme.preferredMarginSize
+                           + (welcomeLogo.visible ?  welcomeLogo.width : 0)
                     height: childrenRect.height
                     opacity:1
 
@@ -133,9 +129,8 @@ Rectangle {
 
                     JamiIdentifier {
                         id: identifier
-                        editable: true
-                        visible: CurrentAccount.type !== Profile.Type.SIP
 
+                        visible: CurrentAccount.type !== Profile.Type.SIP
                         anchors.top: identifierDescription.bottom
                         anchors.left: parent.left
                         anchors.margins: JamiTheme.preferredMarginSize
@@ -179,6 +174,7 @@ Rectangle {
                         spacing: 13
 
                         Repeater {
+                            id: tipsRepeater
                             model: TipsModel
                             Layout.alignment: Qt.AlignCenter
 
@@ -259,6 +255,4 @@ Rectangle {
         bBorderwidth: 0
         borderColor: JamiTheme.tabbarBorderColor
     }
-
-
 }
diff --git a/src/app/settingsview/components/NameRegistrationDialog.qml b/src/app/settingsview/components/NameRegistrationDialog.qml
index 032c7c8954d9d2f391871853082d95435336a8f4..f86a459d8f8f64518c8d8776adbf0ff2d66652cb 100644
--- a/src/app/settingsview/components/NameRegistrationDialog.qml
+++ b/src/app/settingsview/components/NameRegistrationDialog.qml
@@ -35,8 +35,9 @@ BaseModalDialog {
     signal accepted
 
     function openNameRegistrationDialog(registerNameIn) {
+        if (registerNameIn === '')
+            return
         registerdName = registerNameIn
-
         open()
     }