From be41f0e7a65782af3ff35553b933415968014fcb Mon Sep 17 00:00:00 2001
From: Ming Rui Zhang <mingrui.zhang@savoirfairelinux.com>
Date: Wed, 8 Sep 2021 10:31:38 -0400
Subject: [PATCH] misc: Qt 6.2.0 initial migration

Remove unsupported QtQuick One component and it will be
added back in the following patches

Change-Id: Iad206a880096cf956a4220a81dca85a993721fbd
---
 CMakeLists.txt                                | 111 ++--
 make-client.py                                |  42 +-
 qml.qrc                                       |   7 +-
 qtquickcontrols2.conf                         |   9 +
 src/DaemonReconnectWindow.qml                 |  13 +-
 src/MainApplicationWindow.qml                 | 118 ++--
 src/accountadapter.cpp                        |  12 +-
 src/avadapter.cpp                             |   6 +-
 src/calloverlaymodel.cpp                      |   3 +-
 .../AccountMigrationDialog.qml                |  13 +-
 src/commoncomponents/Avatar.qml               |   8 +-
 src/commoncomponents/BackButton.qml           |   4 +-
 src/commoncomponents/BaseDialog.qml           |   4 +-
 src/commoncomponents/BubbleLabel.qml          |   4 +-
 src/commoncomponents/CustomBorder.qml         |   2 +-
 src/commoncomponents/DaemonReconnectPopup.qml |   6 +-
 .../DataTransferMessageDelegate.qml           |  10 +-
 src/commoncomponents/DeleteAccountDialog.qml  |   6 +-
 src/commoncomponents/ElidedTextLabel.qml      |   4 +-
 src/commoncomponents/GeneralWebEngineView.qml |  10 +-
 .../GeneratedMessageDelegate.qml              |   6 +-
 src/commoncomponents/HalfPill.qml             |   2 +-
 src/commoncomponents/JamiFileDialog.qml       |   4 +-
 src/commoncomponents/JamiFlickable.qml        |  50 ++
 .../{ListViewJami.qml => JamiListView.qml}    |  35 +-
 src/commoncomponents/JamiScrollBar.qml        |  84 +++
 src/commoncomponents/JamiSwitch.qml           |   4 +-
 src/commoncomponents/LineEditContextMenu.qml  |   2 +-
 src/commoncomponents/MaterialButton.qml       |   6 +-
 src/commoncomponents/MaterialLineEdit.qml     |  10 +-
 src/commoncomponents/MaterialToolTip.qml      |   4 +-
 src/commoncomponents/MessageBubble.qml        |   4 +-
 src/commoncomponents/ModalPopup.qml           |  13 +-
 src/commoncomponents/PasswordDialog.qml       |   4 +-
 src/commoncomponents/PhotoboothView.qml       |   8 +-
 .../PreferenceItemDelegate.qml                |   6 +-
 src/commoncomponents/PresenceIndicator.qml    |   2 +-
 src/commoncomponents/PushButton.qml           |   4 +-
 src/commoncomponents/ReadStatus.qml           |   8 +-
 src/commoncomponents/ResponsiveImage.qml      |   6 +-
 src/commoncomponents/SBSMessageBase.qml       |   8 +-
 src/commoncomponents/Scaffold.qml             |   4 +-
 src/commoncomponents/SettingParaCombobox.qml  |  13 +-
 src/commoncomponents/SimpleMessageDialog.qml  |   6 +-
 src/commoncomponents/SpinningAnimation.qml    |   4 +-
 src/commoncomponents/TextMessageDelegate.qml  |   8 +-
 src/commoncomponents/TypingDots.qml           |   6 +-
 src/commoncomponents/UsernameLineEdit.qml     |   4 +-
 .../contextmenu/BaseContextMenu.qml           |   8 +-
 .../contextmenu/ContextMenuAutoLoader.qml     |   2 +-
 .../contextmenu/GeneralMenuItem.qml           |  30 +-
 .../contextmenu/GeneralMenuSeparator.qml      |   4 +-
 .../emojipicker/EmojiPicker.qml               |  12 +-
 src/constant/JamiQmlUtils.qml                 |   2 +-
 src/constant/JamiStrings.qml                  |   2 +-
 src/constant/JamiTheme.qml                    |  10 +-
 src/constant/MsgSeq.qml                       |   2 +-
 src/contactadapter.cpp                        |  36 +-
 src/contactadapter.h                          |   4 +-
 src/conversationlistmodel.cpp                 |  12 +-
 src/conversationlistmodelbase.cpp             |   2 +-
 src/main.cpp                                  |  16 +-
 src/mainapplication.cpp                       |  16 +-
 src/mainapplication.h                         |  16 +-
 src/mainview/MainView.qml                     |  28 +-
 src/mainview/components/AboutPopUp.qml        | 297 ++++-----
 src/mainview/components/AccountComboBox.qml   |   6 +-
 .../components/AccountComboBoxPopup.qml       |  19 +-
 .../components/AccountItemDelegate.qml        |   6 +-
 src/mainview/components/BadgeNotifier.qml     |   2 +-
 src/mainview/components/CallActionBar.qml     |  13 +-
 .../components/CallButtonDelegate.qml         |  16 +-
 src/mainview/components/CallOverlay.qml       |   2 +-
 src/mainview/components/CallStackView.qml     |   4 +-
 .../components/CallViewContextMenu.qml        |   2 +-
 src/mainview/components/ChatView.qml          |   6 +-
 src/mainview/components/ChatViewFooter.qml    |   4 +-
 src/mainview/components/ChatViewHeader.qml    |   4 +-
 src/mainview/components/ContactPicker.qml     |  10 +-
 .../components/ContactPickerItemDelegate.qml  |   4 +-
 src/mainview/components/ContactSearchBar.qml  |   8 +-
 .../components/ConversationAvatar.qml         |   4 +-
 .../components/ConversationListView.qml       |  12 +-
 .../ConversationSmartListContextMenu.qml      |   2 +-
 .../components/FilesToSendContainer.qml       |  21 +-
 .../components/FilesToSendDelegate.qml        |   6 +-
 src/mainview/components/FilterTabButton.qml   |   6 +-
 src/mainview/components/InitialCallPage.qml   |  10 +-
 src/mainview/components/InvitationView.qml    |   4 +-
 src/mainview/components/MainOverlay.qml       |   4 +-
 src/mainview/components/MessageBar.qml        |   4 +-
 .../components/MessageBarTextArea.qml         |  14 +-
 src/mainview/components/MessageListView.qml   |   8 +-
 src/mainview/components/OngoingCallPage.qml   |  16 +-
 .../ParticipantCallInStatusDelegate.qml       |   4 +-
 .../ParticipantCallInStatusView.qml           |  12 +-
 .../components/ParticipantControlLayout.qml   |   2 +-
 .../components/ParticipantOverlay.qml         |   6 +-
 .../components/ParticipantOverlayButton.qml   |   2 +-
 .../components/ParticipantOverlayMenu.qml     |   6 +-
 src/mainview/components/ParticipantsLayer.qml |   2 +-
 .../components/PluginHandlerItemDelegate.qml  |   6 +-
 .../components/PluginHandlerPicker.qml        |  16 +-
 .../components/ProjectCreditsScrollView.qml   |  56 +-
 src/mainview/components/ReadOnlyFooter.qml    |   6 +-
 src/mainview/components/RecordBox.qml         |   8 +-
 src/mainview/components/ScreenRubberBand.qml  |   4 +-
 .../components/ScrollToBottomButton.qml       |   7 +-
 src/mainview/components/SelectScreen.qml      |  30 +-
 src/mainview/components/SidePanel.qml         |   6 +-
 src/mainview/components/SidePanelTabBar.qml   |   2 +-
 src/mainview/components/SipInputPanel.qml     |   6 +-
 .../components/SmartListItemDelegate.qml      |  10 +-
 src/mainview/components/UserProfile.qml       |   4 +-
 src/mainview/components/WelcomePage.qml       |   6 +-
 .../components/WelcomePageQrDialog.qml        |   2 +-
 src/messagesadapter.cpp                       |   3 +-
 src/networkmanager.cpp                        |   4 -
 src/previewengine.cpp                         |   1 -
 src/previewengine.h                           |   2 -
 src/qmlregister.cpp                           |   2 +-
 src/quickimageproviderbase.h                  |   2 +-
 src/settingsview/SettingsView.qml             |  15 +-
 .../components/AccountProfile.qml             |   4 +-
 .../components/AdvancedCallSettings.qml       |   6 +-
 .../components/AdvancedChatSettings.qml       |   4 +-
 .../AdvancedConnectivitySettings.qml          |   4 +-
 .../AdvancedJamiSecuritySettings.qml          |   4 +-
 .../components/AdvancedMediaSettings.qml      |   6 +-
 .../components/AdvancedNameServerSettings.qml |   4 +-
 .../components/AdvancedOpenDHTSettings.qml    |   4 +-
 .../AdvancedPublicAddressSettings.qml         |   4 +-
 .../components/AdvancedSDPSettings.qml        |   4 +-
 .../AdvancedSIPSecuritySettings.qml           |   6 +-
 .../components/AdvancedSettings.qml           |   4 +-
 .../components/AdvancedVoiceMailSettings.qml  |   6 +-
 src/settingsview/components/AudioSettings.qml |   4 +-
 src/settingsview/components/AvSettingPage.qml |   4 +-
 .../components/BannedContacts.qml             |   6 +-
 .../components/ChatviewSettings.qml           |   6 +-
 .../components/ContactItemDelegate.qml        |   6 +-
 .../components/CurrentAccountSettings.qml     |   8 +-
 .../components/DeviceItemDelegate.qml         |   8 +-
 .../components/FileTransferSettings.qml       |   6 +-
 .../components/GeneralSettingsPage.qml        |   4 +-
 .../components/JamiUserIdentity.qml           |   6 +-
 .../components/KeyBoardShortcutKey.qml        |  46 --
 .../components/KeyBoardShortcutTable.qml      | 624 ------------------
 src/settingsview/components/LevelMeter.qml    |   8 +-
 .../components/LinkDeviceDialog.qml           |   6 +-
 src/settingsview/components/LinkedDevices.qml |   8 +-
 src/settingsview/components/LogsView.qml      |  10 +-
 .../components/MediaCodecDelegate.qml         |   8 +-
 src/settingsview/components/MediaSettings.qml |   8 +-
 .../components/NameRegistrationDialog.qml     |   6 +-
 .../components/PluginItemDelegate.qml         |   6 +-
 .../components/PluginListPreferencesView.qml  |   6 +-
 .../components/PluginListSettingsView.qml     |   8 +-
 .../components/PluginSettingsPage.qml         |   6 +-
 .../components/RecordingSettings.qml          |   8 +-
 .../components/RevokeDevicePasswordDialog.qml |   6 +-
 .../components/SIPUserIdentity.qml            |   4 +-
 .../components/SettingMaterialButton.qml      |   4 +-
 .../components/SettingSpinBox.qml             |   6 +-
 .../components/SettingsComboBox.qml           |   4 +-
 .../components/SettingsHeader.qml             |   6 +-
 .../components/SettingsMaterialLineEdit.qml   |   4 +-
 src/settingsview/components/SettingsMenu.qml  |   4 +-
 .../components/SystemSettings.qml             |   8 +-
 src/settingsview/components/ToggleSwitch.qml  |   6 +-
 .../components/TroubleshootSettings.qml       |   6 +-
 .../components/UpdateSettings.qml             |   8 +-
 src/settingsview/components/UserIdentity.qml  |   4 +-
 src/settingsview/components/VideoSettings.qml |   8 +-
 src/updatemanager.cpp                         |  16 +-
 src/updatemanager.h                           |   2 +-
 src/utils.cpp                                 |  21 +-
 src/utilsadapter.cpp                          |   6 +-
 src/wizardview/WizardView.qml                 |  12 +-
 .../AccountCreationStepIndicator.qml          |   2 +-
 src/wizardview/components/BackupKeyPage.qml   |   8 +-
 .../ConnectToAccountManagerPage.qml           |  11 +-
 .../components/CreateAccountPage.qml          |   6 +-
 .../components/CreateSIPAccountPage.qml       |   6 +-
 .../components/ImportFromBackupPage.qml       |  10 +-
 .../components/ImportFromDevicePage.qml       |   8 +-
 src/wizardview/components/ProfilePage.qml     |   6 +-
 src/wizardview/components/WelcomePage.qml     |   4 +-
 tests/CMakeLists.txt                          |   4 +-
 tests/qml/main.cpp                            |   6 +-
 tests/qml/src/tst_ChatViewFooter.qml          |   8 +-
 tests/qml/src/tst_FilesToSendContainer.qml    |   8 +-
 tests/qml/src/tst_LocalAccount.qml            |   4 +-
 tests/qml/src/tst_PresenceIndicator.qml       |   4 +-
 tests/qml/src/tst_WizardView.qml              |   4 +-
 tests/unittests/account_unittest.cpp          |   2 +-
 tests/unittests/contact_unittest.cpp          |   4 +-
 197 files changed, 1107 insertions(+), 1664 deletions(-)
 create mode 100644 qtquickcontrols2.conf
 create mode 100644 src/commoncomponents/JamiFlickable.qml
 rename src/commoncomponents/{ListViewJami.qml => JamiListView.qml} (60%)
 create mode 100644 src/commoncomponents/JamiScrollBar.qml
 delete mode 100644 src/settingsview/components/KeyBoardShortcutKey.qml
 delete mode 100644 src/settingsview/components/KeyBoardShortcutTable.qml

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4b14330ce..3c9736da2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -153,27 +153,39 @@ set(COMMON_HEADERS
     ${SRC_DIR}/previewengine.h)
 
 set(QML_LIBS
-    Qt5::Quick
-    Qt5::QuickWidgets
-    Qt5::Network
-    Qt5::Svg
-    Qt5::Sql
-    Qt5::Concurrent
-    Qt5::QuickControls2
-    Qt5::WebEngine
-    Qt5::Core
-    Qt5::WebEngineWidgets)
+    Qt::Quick
+    Qt::Network
+    Qt::NetworkAuth
+    Qt::Svg
+    Qt::Gui
+    Qt::Qml
+    Qt::QmlModels
+    Qt::Positioning
+    Qt::Sql
+    Qt::Concurrent
+    Qt::Core
+    Qt::Core5Compat
+    Qt::WebEngineCore
+    Qt::WebEngineQuick
+    Qt::WebChannel
+    Qt::WebEngineWidgets)
 
 set(QML_LIBS_LIST
-    Core
-    Concurrent
     Quick
-    QuickWidgets
     Network
+    NetworkAuth
     Svg
+    Gui
+    Qml
+    QmlModels
+    Positioning
     Sql
-    QuickControls2
-    WebEngine
+    Concurrent
+    Core
+    Core5Compat
+    WebEngineCore
+    WebEngineQuick
+    WebChannel
     WebEngineWidgets)
 
 set(WINDOWS_SYS_LIBS Shell32.lib
@@ -185,6 +197,14 @@ set(WINDOWS_SYS_LIBS Shell32.lib
                      Crypt32.lib
                      Strmiids.lib)
 
+# Here we let find_package(<PackageName>...) try to find Qt 6,
+# If it is found, find_package will succeed, and the CMake variable
+# QT_VERSION_MAJOR will be defined 6.
+find_package(QT NAMES Qt6 COMPONENTS ${QML_LIBS_LIST} REQUIRED)
+if (${QT_VERSION_MAJOR} STRLESS 6)
+   message(FATAL_ERROR "We currently only support Qt6" )
+endif()
+
 if(MSVC)
     # preprocessor defines
     add_definitions(-DUNICODE -DQT_NO_DEBUG -DNDEBUG)
@@ -240,7 +260,7 @@ else()
     list(APPEND COMMON_HEADERS
                 ${SRC_DIR}/dbuserrorhandler.h
                 ${SRC_DIR}/xrectsel.h)
-    list(APPEND QML_LIBS Qt5::DBus)
+    list(APPEND QML_LIBS Qt::DBus)
     list(APPEND QML_LIBS_LIST DBus)
 
     find_package(PkgConfig REQUIRED)
@@ -318,21 +338,16 @@ else()
 endif()
 
 # Qt find package
-if(QT5_VER AND QT5_PATH)
-    string(REPLACE "." ";" VERSION_LIST ${QT5_VER})
-    list(GET VERSION_LIST 0 QT5_VER_MAJOR)
-    list(GET VERSION_LIST 1 QT5_VER_MINOR)
-    list(GET VERSION_LIST 2 QT5_VER_PATCH)
-
-    if((${QT5_VER_MAJOR} GREATER_EQUAL 5) AND (${QT5_VER_MINOR} GREATER_EQUAL 14))
-        message(STATUS "Using custom Qt version")
-        find_package(Qt5 ${QT5_VER} REQUIRED COMPONENTS ${QML_LIBS_LIST}
-                     PATHS ${QT5_PATH} NO_DEFAULT_PATH)
-        find_package(Qt5LinguistTools ${QT5_VER} PATHS ${QT5_PATH} NO_DEFAULT_PATH)
-    endif()
+if(QT6_VER AND QT6_PATH)
+    message(STATUS "Using custom Qt version")
+    find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${QML_LIBS_LIST}
+                 PATHS ${QT6_PATH} NO_DEFAULT_PATH)
+    # Linguist tools is not required.
+    find_package(Qt${QT_VERSION_MAJOR} COMPONENTS LinguistTools
+                 PATHS ${QT6_PATH} NO_DEFAULT_PATH)
 else()
-    find_package(Qt5 REQUIRED COMPONENTS ${QML_LIBS_LIST})
-    find_package(Qt5LinguistTools)
+    find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${QML_LIBS_LIST})
+    find_package(Qt${QT_VERSION_MAJOR}LinguistTools)
 endif()
 
 # common include
@@ -340,19 +355,19 @@ include_directories(${PROJECT_SOURCE_DIR}
                     ${SRC_DIR})
 
 # common executable sources
-add_executable(${PROJECT_NAME}
-               ${SRC_DIR}/main.cpp
-               ${COMMON_HEADERS}
-               ${COMMON_SOURCES}
-               ${QML_RESOURCES}
-               ${QML_RESOURCES_QML}
-               ${LRC_SRC_PATH}/webresource.qrc)
+qt_add_executable(${PROJECT_NAME} MANUAL_FINALIZATION
+                  ${SRC_DIR}/main.cpp
+                  ${COMMON_HEADERS}
+                  ${COMMON_SOURCES}
+                  ${QML_RESOURCES}
+                  ${QML_RESOURCES_QML}
+                  ${LRC_SRC_PATH}/webresource.qrc)
 
 if(MSVC)
     # Makes it a GUI executable instead of a console application
     set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE TRUE)
 
-    target_link_libraries(${PROJECT_NAME}
+    target_link_libraries(${PROJECT_NAME} PRIVATE
                           ${QML_LIBS}
                           ${QRENCODE_LIB}
                           ${WINDOWS_SYS_LIBS})
@@ -367,14 +382,14 @@ if(MSVC)
         # executable icon
         target_sources(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/ico.rc)
 
-        target_link_libraries(${PROJECT_NAME}
+        target_link_libraries(${PROJECT_NAME} PRIVATE
                               ${RINGCLIENT_STATIC_LIB}
                               ${QTWRAPPER_LIB}
                               ${DRING_LIB}
                               ${GNUTLS_LIB})
 
         # translations
-        if(Qt5LinguistTools_FOUND)
+        if(Qt${QT_VERSION_MAJOR}LinguistTools_FOUND)
             message("Releasing and copying translation files")
             file(MAKE_DIRECTORY "${JAMI_OUTPUT_DIRECTORY_RELEASE}/share/ring/translations/")
             file(MAKE_DIRECTORY "${JAMI_OUTPUT_DIRECTORY_RELEASE}/share/libringclient/translations/")
@@ -384,8 +399,9 @@ if(MSVC)
                                         "${JAMI_OUTPUT_DIRECTORY_RELEASE}/share/ring/translations")
             set_source_files_properties(${TS_LRC_FILES} PROPERTIES OUTPUT_LOCATION
                                         "${JAMI_OUTPUT_DIRECTORY_RELEASE}/share/libringclient/translations")
-            qt5_add_translation(QM_CLIENT_FILES ${TS_CLIENT_FILES})
-            qt5_add_translation(QM_LRC_FILES ${TS_LRC_FILES})
+
+            qt_add_translation(QM_CLIENT_FILES ${TS_CLIENT_FILES})
+            qt_add_translation(QM_LRC_FILES ${TS_LRC_FILES})
             target_sources(${PROJECT_NAME} PRIVATE ${QM_CLIENT_FILES})
             target_sources(${PROJECT_NAME} PRIVATE ${QM_LRC_FILES})
         endif()
@@ -426,7 +442,7 @@ if(MSVC)
     # executable name
     set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "Jami")
 else()
-    target_link_libraries(${PROJECT_NAME}
+    target_link_libraries(${PROJECT_NAME} PRIVATE
                           ${QML_LIBS}
                           ${LRC_LIB_NAME}
                           ${qrencode}
@@ -516,12 +532,13 @@ else()
     endif()
 
     # translations
-    if(Qt5LinguistTools_FOUND)
+    if(Qt${QT_VERSION_MAJOR}LinguistTools_FOUND)
         message("Releasing and copying translation files")
         file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/share/ring/translations/")
         file(GLOB TS_FILES ${PROJECT_SOURCE_DIR}/translations/*.ts)
         set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "share/ring/translations")
-        qt5_add_translation(QM_FILES ${TS_FILES})
+
+        qt_add_translation(QM_FILES ${TS_FILES})
         add_custom_target(translations ALL DEPENDS ${QM_FILES})
         install(DIRECTORY "${CMAKE_BINARY_DIR}/share/ring/translations/"
                 DESTINATION ${CMAKE_INSTALL_PREFIX}/share/ring/translations)
@@ -537,6 +554,10 @@ else()
         COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
 endif()
 
+
+qt_import_qml_plugins(${PROJECT_NAME})
+qt_finalize_executable(${PROJECT_NAME})
+
 # test
 if(ENABLE_TESTS)
     message("Add Jami tests")
diff --git a/make-client.py b/make-client.py
index 82c6be7e5..181a26f92 100644
--- a/make-client.py
+++ b/make-client.py
@@ -12,7 +12,7 @@ from enum import Enum
 # vs help
 win_sdk_default = '10.0.16299.0'
 win_toolset_default = '142'
-qt_version_default = '5.15.0'
+qt_version_default = '6.2.0'
 
 vs_where_path = os.path.join(
     os.environ['ProgramFiles(x86)'], 'Microsoft Visual Studio', 'Installer', 'vswhere.exe'
@@ -22,6 +22,7 @@ host_is_64bit = (False, True)[platform.machine().endswith('64')]
 this_dir = os.path.dirname(os.path.realpath(__file__))
 build_dir = os.path.join(this_dir, 'build')
 temp_path = os.environ['TEMP']
+openssl_include_dir = 'C:\\Qt\\Tools\\OpenSSL\\Win_x64\\include\\openssl'
 
 # project path
 jami_qt_project = os.path.join(build_dir, 'jami-qt.vcxproj')
@@ -214,20 +215,37 @@ def build(arch, toolset, sdk_version, config_str, project_path_under_current_pat
 
     qt_dir = os.path.join("C:\\", 'Qt', qtver)
     cmake_gen = getCMakeGenerator(getLatestVSVersion())
-    msvc_folder = 'msvc2019_64'
+    qt_major_version = getQtVersionNumber(qtver, QtVerison.Major)
+    qt_general_macro = 'Qt' + qt_major_version
+    msvc_folder = '\\msvc2019_64'
+
+    qt_cmake_dir = qt_dir + msvc_folder + '\\lib\\cmake\\'
+    cmake_prefix_path = qt_dir + msvc_folder
 
     qt_cmake_dir = os.path.join(qt_dir, msvc_folder, 'lib', 'cmake')
     cmake_prefix_path = os.path.join(qt_dir, msvc_folder)
     cmake_options = [
         '-DCMAKE_PREFIX_PATH=' + cmake_prefix_path,
-        '-DQt5_DIR=' + qt_cmake_dir + 'Qt5',
-        '-DQt5Core_DIR=' + qt_cmake_dir + 'Qt5Core',
-        '-DQt5Sql_DIR=' + qt_cmake_dir + 'Qt5Sql',
-        '-DQt5LinguistTools_DIR=' + qt_cmake_dir + 'Qt5LinguistTools',
-        '-DQt5Concurrent_DIR=' + qt_cmake_dir + 'Qt5Concurrent',
-        '-DQt5Gui_DIR=' + qt_cmake_dir + 'Qt5Gui',
-        '-DQt5Test_DIR=' + qt_cmake_dir + 'Qt5Test',
-        '-DQt5QuickTest_DIR=' + qt_cmake_dir + 'Qt5QuickTest',
+        '-DOPENSSL_INCLUDE_DIR=' + openssl_include_dir,
+        '-DQT_DIR=' + qt_dir + msvc_folder,
+        '-D' + qt_general_macro + '_DIR=' + qt_cmake_dir + qt_general_macro,
+        '-D' + qt_general_macro + 'Core_DIR=' + qt_cmake_dir + qt_general_macro + 'Core',
+        '-D' + qt_general_macro + 'Core5Compat_DIR=' + qt_cmake_dir + qt_general_macro + 'Core5Compat',
+        '-D' + qt_general_macro + 'WebEngineCore_DIR=' + qt_cmake_dir + qt_general_macro + 'WebEngineCore',
+        '-D' + qt_general_macro + 'WebEngineQuick_DIR=' + qt_cmake_dir + qt_general_macro + 'WebEngineQuick',
+        '-D' + qt_general_macro + 'WebChannel_DIR=' + qt_cmake_dir + qt_general_macro + 'WebChannel',
+        '-D' + qt_general_macro + 'WebEngineWidgets_DIR=' + qt_cmake_dir + qt_general_macro + 'WebEngineWidgets',
+        '-D' + qt_general_macro + 'Sql_DIR=' + qt_cmake_dir + qt_general_macro + 'Sql',
+        '-D' + qt_general_macro + 'LinguistTools_DIR=' + qt_cmake_dir + qt_general_macro + 'LinguistTools',
+        '-D' + qt_general_macro + 'Concurrent_DIR=' + qt_cmake_dir + qt_general_macro + 'Concurrent',
+        '-D' + qt_general_macro + 'Network_DIR=' + qt_cmake_dir + qt_general_macro + 'Network',
+        '-D' + qt_general_macro + 'NetworkAuth_DIR=' + qt_cmake_dir + qt_general_macro + 'NetworkAuth',
+        '-D' + qt_general_macro + 'Gui_DIR=' + qt_cmake_dir + qt_general_macro + 'Gui',
+        '-D' + qt_general_macro + 'Qml_DIR=' + qt_cmake_dir + qt_general_macro + 'Qml',
+        '-D' + qt_general_macro + 'QmlModels_DIR=' + qt_cmake_dir + qt_general_macro + 'QmlModels',
+        '-D' + qt_general_macro + 'Positioning_DIR=' + qt_cmake_dir + qt_general_macro + 'Positioning',
+        '-D' + qt_general_macro + 'Test_DIR=' + qt_cmake_dir + qt_general_macro + 'Test',
+        '-D' + qt_general_macro + 'QuickTest_DIR=' + qt_cmake_dir + qt_general_macro + 'QuickTest',
         '-DENABLE_TESTS=' + (str("ENABLE_TESTS") if test_building_type != TestBuilding.NoTests else ''),
         '-DCMAKE_SYSTEM_VERSION=' + sdk_version
     ]
@@ -384,6 +402,10 @@ def main():
 
     parsed_args = parse_args()
 
+    if int(getQtVersionNumber(parsed_args.qtver, QtVerison.Major)) < 6:
+        print('We currently only support Qt6')
+        sys.exit(1)
+
     test_building_type = TestBuilding.NoTests
 
     if parsed_args.withtest:
diff --git a/qml.qrc b/qml.qrc
index 52bc9a41c..65342816f 100644
--- a/qml.qrc
+++ b/qml.qrc
@@ -10,7 +10,7 @@
         <file>src/commoncomponents/PasswordDialog.qml</file>
         <file>src/commoncomponents/MaterialLineEdit.qml</file>
         <file>src/commoncomponents/PhotoboothView.qml</file>
-        <file>src/commoncomponents/ListViewJami.qml</file>
+        <file>src/commoncomponents/JamiListView.qml</file>
         <file>src/commoncomponents/DeleteAccountDialog.qml</file>
         <file>src/commoncomponents/CustomBorder.qml</file>
         <file>src/commoncomponents/PushButton.qml</file>
@@ -41,8 +41,6 @@
         <file>src/settingsview/components/AudioSettings.qml</file>
         <file>src/settingsview/components/VideoSettings.qml</file>
         <file>src/settingsview/components/GeneralSettingsPage.qml</file>
-        <file>src/settingsview/components/KeyBoardShortcutTable.qml</file>
-        <file>src/settingsview/components/KeyBoardShortcutKey.qml</file>
         <file>src/settingsview/components/PluginSettingsPage.qml</file>
         <file>src/settingsview/components/PluginListSettingsView.qml</file>
         <file>src/settingsview/components/PluginListPreferencesView.qml</file>
@@ -172,5 +170,8 @@
         <file>src/commoncomponents/DataTransferMessageDelegate.qml</file>
         <file>src/mainview/components/ScrollToBottomButton.qml</file>
         <file>src/commoncomponents/TypingDots.qml</file>
+        <file>src/commoncomponents/JamiScrollBar.qml</file>
+        <file>qtquickcontrols2.conf</file>
+        <file>src/commoncomponents/JamiFlickable.qml</file>
     </qresource>
 </RCC>
diff --git a/qtquickcontrols2.conf b/qtquickcontrols2.conf
new file mode 100644
index 000000000..ebea6bb72
--- /dev/null
+++ b/qtquickcontrols2.conf
@@ -0,0 +1,9 @@
+; This file can be edited to change the style of the application
+; Read "Qt Quick Controls 2 Configuration File" for details:
+; https://doc.qt.io/qt/qtquickcontrols2-configuration.html
+
+[Controls]
+Style=Universal
+
+[Universal]
+Theme=Light
diff --git a/src/DaemonReconnectWindow.qml b/src/DaemonReconnectWindow.qml
index da9fcfb29..9890ba288 100644
--- a/src/DaemonReconnectWindow.qml
+++ b/src/DaemonReconnectWindow.qml
@@ -16,11 +16,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls.Universal 2.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Constants 1.1
 import net.jami.Models 1.1
@@ -33,8 +32,6 @@ ApplicationWindow {
     property bool connectionFailed: false
     property int preferredMargin: 15
 
-    Universal.theme: Universal.Light
-
     title: "Jami"
 
     width: 600
@@ -201,7 +198,7 @@ ApplicationWindow {
         }
     }
 
-    overlay.modal: ColorOverlay {
+    Overlay.modal: ColorOverlay {
         source: root.contentItem
         color: "transparent"
 
diff --git a/src/MainApplicationWindow.qml b/src/MainApplicationWindow.qml
index 6e2504c04..792e9ef8d 100644
--- a/src/MainApplicationWindow.qml
+++ b/src/MainApplicationWindow.qml
@@ -20,12 +20,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Window 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls.Universal 2.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Window
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -40,56 +39,19 @@ import "commoncomponents"
 ApplicationWindow {
     id: root
 
-    property ApplicationWindow appWindow : root
-
-    // To facilitate reparenting of the callview during
-    // fullscreen mode, we need QQuickItem based object.
-    Item {
-        id: appContainer
-        anchors.fill: parent
-    }
-    property bool isFullScreen: false
-    visibility: !visible ?
-                   Window.Hidden : (isFullScreen ?
-                                        Window.FullScreen :
-                                        Window.Windowed)
-    function toggleFullScreen() {
-        isFullScreen = !isFullScreen
-    }
-
     enum LoadedSource {
         WizardView = 0,
         MainView,
         None
     }
 
-    Universal.theme: Universal.Light
-
-    title: JamiStrings.appTitle
+    property ApplicationWindow appWindow : root
+    property bool isFullScreen: false
 
-    width: {
-        if (checkLoadedSource() === MainApplicationWindow.LoadedSource.WizardView)
-            return JamiTheme.wizardViewMinWidth
-        return JamiTheme.mainViewPreferredWidth
-    }
-    height: {
-        if (checkLoadedSource() === MainApplicationWindow.LoadedSource.WizardView)
-            return JamiTheme.wizardViewMinHeight
-        return JamiTheme.mainViewPreferredHeight
-    }
-    minimumWidth: {
-        if (checkLoadedSource() === MainApplicationWindow.LoadedSource.WizardView)
-            return JamiTheme.wizardViewMinWidth
-        return JamiTheme.mainViewMinWidth
-    }
-    minimumHeight: {
-        if (checkLoadedSource() === MainApplicationWindow.LoadedSource.WizardView)
-            return JamiTheme.wizardViewMinHeight
-        return JamiTheme.mainViewMinHeight
+    function toggleFullScreen() {
+        isFullScreen = !isFullScreen
     }
 
-    visible: mainApplicationLoader.status === Loader.Ready
-
     function checkLoadedSource() {
         var sourceString = mainApplicationLoader.source.toString()
 
@@ -123,7 +85,45 @@ ApplicationWindow {
             hide()
     }
 
-    AccountMigrationDialog{
+    visibility: !visible ?
+                   Window.Hidden : (isFullScreen ?
+                                        Window.FullScreen :
+                                        Window.Windowed)
+
+    title: JamiStrings.appTitle
+
+    width: {
+        if (checkLoadedSource() === MainApplicationWindow.LoadedSource.WizardView)
+            return JamiTheme.wizardViewMinWidth
+        return JamiTheme.mainViewPreferredWidth
+    }
+    height: {
+        if (checkLoadedSource() === MainApplicationWindow.LoadedSource.WizardView)
+            return JamiTheme.wizardViewMinHeight
+        return JamiTheme.mainViewPreferredHeight
+    }
+    minimumWidth: {
+        if (checkLoadedSource() === MainApplicationWindow.LoadedSource.WizardView)
+            return JamiTheme.wizardViewMinWidth
+        return JamiTheme.mainViewMinWidth
+    }
+    minimumHeight: {
+        if (checkLoadedSource() === MainApplicationWindow.LoadedSource.WizardView)
+            return JamiTheme.wizardViewMinHeight
+        return JamiTheme.mainViewMinHeight
+    }
+
+    visible: mainApplicationLoader.status === Loader.Ready
+
+    // To facilitate reparenting of the callview during
+    // fullscreen mode, we need QQuickItem based object.
+    Item {
+        id: appContainer
+
+        anchors.fill: parent
+    }
+
+    AccountMigrationDialog {
         id: accountMigrationDialog
 
         visible: false
@@ -165,17 +165,6 @@ ApplicationWindow {
         }
     }
 
-    overlay.modal: ColorOverlay {
-        source: root.contentItem
-        color: "transparent"
-
-        // Color animation for overlay when pop up is shown.
-        ColorAnimation on color {
-            to: Qt.rgba(0, 0, 0, 0.33)
-            duration: 500
-        }
-    }
-
     Connections {
         target: LRCInstance
 
@@ -220,6 +209,17 @@ ApplicationWindow {
         }
     }
 
+    Overlay.modal: ColorOverlay {
+        source: root.contentItem
+        color: "transparent"
+
+        // Color animation for overlay when pop up is shown.
+        ColorAnimation on color {
+            to: Qt.rgba(0, 0, 0, 0.33)
+            duration: 500
+        }
+    }
+
     onClosing: root.close()
 
     onScreenChanged: JamiQmlUtils.mainApplicationScreen = root.screen
diff --git a/src/accountadapter.cpp b/src/accountadapter.cpp
index 07d2303d6..96a0e4167 100644
--- a/src/accountadapter.cpp
+++ b/src/accountadapter.cpp
@@ -144,7 +144,7 @@ AccountAdapter::createJamiAccount(QString registeredName,
 
     connectFailure();
 
-    QtConcurrent::run([this, settings] {
+    auto futureResult = QtConcurrent::run([this, settings] {
         lrcInstance_->accountModel().createNewAccount(lrc::api::profile::Type::JAMI,
                                                       settings["alias"].toString(),
                                                       settings["archivePath"].toString(),
@@ -189,7 +189,7 @@ AccountAdapter::createSIPAccount(const QVariantMap& settings)
 
     connectFailure();
 
-    QtConcurrent::run([this, settings] {
+    auto futureResult = QtConcurrent::run([this, settings] {
         lrcInstance_->accountModel().createNewAccount(lrc::api::profile::Type::SIP,
                                                       settings["alias"].toString(),
                                                       settings["archivePath"].toString(),
@@ -233,7 +233,7 @@ AccountAdapter::createJAMSAccount(const QVariantMap& settings)
 
     connectFailure();
 
-    QtConcurrent::run([this, settings] {
+    auto futureResult = QtConcurrent::run([this, settings] {
         lrcInstance_->accountModel().connectToAccountManager(settings["username"].toString(),
                                                              settings["password"].toString(),
                                                              settings["manager"].toString());
@@ -278,7 +278,7 @@ AccountAdapter::setCurrAccDisplayName(const QString& text)
 void
 AccountAdapter::setCurrentAccountAvatarFile(const QString& source)
 {
-    QtConcurrent::run([this, source]() {
+    auto futureResult = QtConcurrent::run([this, source]() {
         QPixmap image;
         if (!image.load(source)) {
             qWarning() << "Not a valid image file";
@@ -298,7 +298,7 @@ AccountAdapter::setCurrentAccountAvatarFile(const QString& source)
 void
 AccountAdapter::setCurrentAccountAvatarBase64(const QString& data)
 {
-    QtConcurrent::run([this, data]() {
+    auto futureResult = QtConcurrent::run([this, data]() {
         auto accountId = lrcInstance_->get_currentAccountId();
         lrcInstance_->accountModel().setAvatar(accountId, data);
     });
@@ -346,7 +346,7 @@ AccountAdapter::exportToFile(const QString& accountId,
 void
 AccountAdapter::setArchivePasswordAsync(const QString& accountID, const QString& password)
 {
-    QtConcurrent::run([this, accountID, password] {
+    auto futureResult = QtConcurrent::run([this, accountID, password] {
         auto config = lrcInstance_->accountModel().getAccountConfig(accountID);
         config.archivePassword = password;
         lrcInstance_->accountModel().setAccountConfig(accountID, config);
diff --git a/src/avadapter.cpp b/src/avadapter.cpp
index f0d5a430e..18ea405cd 100644
--- a/src/avadapter.cpp
+++ b/src/avadapter.cpp
@@ -129,7 +129,7 @@ AvAdapter::shareAllScreens()
 void
 AvAdapter::captureScreen(int screenNumber)
 {
-    QtConcurrent::run([this, screenNumber]() {
+    auto futureResult = QtConcurrent::run([this, screenNumber]() {
         QScreen* screen = QGuiApplication::screens().at(screenNumber);
         if (!screen)
             return;
@@ -149,7 +149,7 @@ AvAdapter::captureScreen(int screenNumber)
 void
 AvAdapter::captureAllScreens()
 {
-    QtConcurrent::run([this]() {
+    auto futureResult = QtConcurrent::run([this]() {
         auto screens = QGuiApplication::screens();
 
         QList<QPixmap> scrs;
@@ -338,7 +338,7 @@ AvAdapter::getScreenNumber() const
     // Get display
     QString display_env {getenv("DISPLAY")};
     if (!display_env.isEmpty()) {
-        auto list = display_env.split(':', QString::SplitBehavior::SkipEmptyParts);
+        auto list = display_env.split(':', Qt::SkipEmptyParts);
         // Should only be one display, so get the first one
         if (list.size() > 0) {
             display = list.at(0).toInt();
diff --git a/src/calloverlaymodel.cpp b/src/calloverlaymodel.cpp
index c789504ac..cbe6247ad 100644
--- a/src/calloverlaymodel.cpp
+++ b/src/calloverlaymodel.cpp
@@ -344,10 +344,9 @@ CallOverlayModel::eventFilter(QObject* object, QEvent* event)
 {
     if (event->type() == QEvent::MouseMove) {
         auto mouseEvent = static_cast<QMouseEvent*>(event);
-        QPoint eventPos(mouseEvent->x(), mouseEvent->y());
         auto windowItem = static_cast<QQuickWindow*>(object)->contentItem();
         Q_FOREACH (const auto& item, watchedItems_) {
-            if (item->contains(windowItem->mapToItem(item, eventPos))) {
+            if (item->contains(windowItem->mapToItem(item, mouseEvent->pos()))) {
                 Q_EMIT mouseMoved(item);
             }
         }
diff --git a/src/commoncomponents/AccountMigrationDialog.qml b/src/commoncomponents/AccountMigrationDialog.qml
index 04ddf73b8..ae5b14a04 100644
--- a/src/commoncomponents/AccountMigrationDialog.qml
+++ b/src/commoncomponents/AccountMigrationDialog.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Window 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Window
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -194,7 +194,6 @@ Window {
     visible: false
 
     title: JamiStrings.authenticate
-    modality: Qt.WindowModal
     flags: Qt.WindowStaysOnTopHint
 
     width: 600
@@ -504,7 +503,7 @@ Window {
                             onSpinnerDisplyStateChanged: {
                                 switch (spinnerDisplyState) {
                                 case "spinnerLabel_Regular":
-                                    background = Qt.createQmlObject("import QtQuick 2.15;
+                                    background = Qt.createQmlObject("import QtQuick;
                                                                         import \"qrc:/src/constant/\";
                                                                         AnimatedImage {
                                                                         source: JamiResources.jami_eclipse_spinner_gif
@@ -514,7 +513,7 @@ Window {
                                                                         mipmap: true}", spinnerLabel)
                                     break
                                 case "spinnerLabel_Failure":
-                                    background = Qt.createQmlObject("import QtQuick 2.15;
+                                    background = Qt.createQmlObject("import QtQuick;
                                                                         import \"qrc:/src/constant/\";
                                                                         Image {
                                                                         anchors.fill: parent;
diff --git a/src/commoncomponents/Avatar.qml b/src/commoncomponents/Avatar.qml
index 64548cc83..258c807db 100644
--- a/src/commoncomponents/Avatar.qml
+++ b/src/commoncomponents/Avatar.qml
@@ -17,8 +17,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
@@ -64,7 +64,7 @@ Item {
     }
 
     Connections {
-        target: ScreenInfo
+        target: CurrentScreenInfo
 
         function onDevicePixelRatioChanged() {
             image.updateSource()
@@ -94,7 +94,7 @@ Item {
         }
 
         opacity: status === Image.Ready
-        scale: Math.min(opacity + 0.5, 1.0)
+        scale: Math.min(image.opacity + 0.5, 1.0)
 
         Behavior on opacity {
             NumberAnimation {
diff --git a/src/commoncomponents/BackButton.qml b/src/commoncomponents/BackButton.qml
index 39c6c74ca..be794a027 100644
--- a/src/commoncomponents/BackButton.qml
+++ b/src/commoncomponents/BackButton.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/BaseDialog.qml b/src/commoncomponents/BaseDialog.qml
index 69c76819a..fba277166 100644
--- a/src/commoncomponents/BaseDialog.qml
+++ b/src/commoncomponents/BaseDialog.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Dialogs 1.3
+import QtQuick
+import QtQuick.Controls
 
 Dialog {
     id: root
diff --git a/src/commoncomponents/BubbleLabel.qml b/src/commoncomponents/BubbleLabel.qml
index 47e47c1de..3e78f1440 100644
--- a/src/commoncomponents/BubbleLabel.qml
+++ b/src/commoncomponents/BubbleLabel.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/CustomBorder.qml b/src/commoncomponents/CustomBorder.qml
index 4db818911..08a9ee072 100644
--- a/src/commoncomponents/CustomBorder.qml
+++ b/src/commoncomponents/CustomBorder.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 // Inspired by
 // https://stackoverflow.com/questions/16534489/qml-control-border-width-and-color-on-any-one-side-of-rectangle-element
diff --git a/src/commoncomponents/DaemonReconnectPopup.qml b/src/commoncomponents/DaemonReconnectPopup.qml
index ca1ca04e2..8753fd190 100644
--- a/src/commoncomponents/DaemonReconnectPopup.qml
+++ b/src/commoncomponents/DaemonReconnectPopup.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Constants 1.1
 import net.jami.Models 1.1
diff --git a/src/commoncomponents/DataTransferMessageDelegate.qml b/src/commoncomponents/DataTransferMessageDelegate.qml
index 6e5fff3d7..87b0dd464 100644
--- a/src/commoncomponents/DataTransferMessageDelegate.qml
+++ b/src/commoncomponents/DataTransferMessageDelegate.qml
@@ -18,11 +18,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
-import QtWebEngine 1.10
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
+import QtWebEngine
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/commoncomponents/DeleteAccountDialog.qml b/src/commoncomponents/DeleteAccountDialog.qml
index 40565d931..d908b8d68 100644
--- a/src/commoncomponents/DeleteAccountDialog.qml
+++ b/src/commoncomponents/DeleteAccountDialog.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/commoncomponents/ElidedTextLabel.qml b/src/commoncomponents/ElidedTextLabel.qml
index 1d9ff4e32..b62670fff 100644
--- a/src/commoncomponents/ElidedTextLabel.qml
+++ b/src/commoncomponents/ElidedTextLabel.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/GeneralWebEngineView.qml b/src/commoncomponents/GeneralWebEngineView.qml
index b4cc533fa..546172232 100644
--- a/src/commoncomponents/GeneralWebEngineView.qml
+++ b/src/commoncomponents/GeneralWebEngineView.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtWebEngine 1.10
-import QtWebChannel 1.15
+import QtQuick
+import QtWebEngine
+import QtWebChannel
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
@@ -50,14 +50,14 @@ WebEngineView {
         id: webViewChannel
     }
 
-    onNavigationRequested: {
+    onNavigationRequested: function (request) {
         if (request.navigationType === WebEngineView.LinkClickedNavigation) {
             MessagesAdapter.openUrl(request.url)
             request.action = WebEngineView.IgnoreRequest
         }
     }
 
-    onContextMenuRequested: {
+    onContextMenuRequested: function (request) {
         var needContextMenu = request.selectedText.length || request.isContentEditable
         if (!needContextMenu)
             request.accepted = true
diff --git a/src/commoncomponents/GeneratedMessageDelegate.qml b/src/commoncomponents/GeneratedMessageDelegate.qml
index b69335c2e..d5ef26fbe 100644
--- a/src/commoncomponents/GeneratedMessageDelegate.qml
+++ b/src/commoncomponents/GeneratedMessageDelegate.qml
@@ -18,9 +18,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
diff --git a/src/commoncomponents/HalfPill.qml b/src/commoncomponents/HalfPill.qml
index a8f99fdbf..a8bb9c943 100644
--- a/src/commoncomponents/HalfPill.qml
+++ b/src/commoncomponents/HalfPill.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 Item {
     id: root
diff --git a/src/commoncomponents/JamiFileDialog.qml b/src/commoncomponents/JamiFileDialog.qml
index 25b968b26..9a407bcfe 100644
--- a/src/commoncomponents/JamiFileDialog.qml
+++ b/src/commoncomponents/JamiFileDialog.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import Qt.labs.platform 1.1
+import QtQuick
+import Qt.labs.platform
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/JamiFlickable.qml b/src/commoncomponents/JamiFlickable.qml
new file mode 100644
index 000000000..7e7045a9a
--- /dev/null
+++ b/src/commoncomponents/JamiFlickable.qml
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2020 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@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
+ * 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 net.jami.Constants 1.1
+
+Flickable {
+    id: root
+
+    property bool attachedFlickableMoving: root.moving
+    property alias verticalHandleColor: verticalScrollBar.handleColor
+    property alias horizontalHandleColor: horizontalScrollBar.handleColor
+
+    maximumFlickVelocity: 1024
+    clip: true
+
+    ScrollBar.vertical: JamiScrollBar {
+        id: verticalScrollBar
+
+        attachedFlickableMoving: root.attachedFlickableMoving
+    }
+    ScrollBar.horizontal: JamiScrollBar {
+        id: horizontalScrollBar
+
+        attachedFlickableMoving: root.attachedFlickableMoving
+        orientation: Qt.Horizontal
+    }
+
+    Keys.onLeftPressed: horizontalScrollBar.decrease()
+    Keys.onRightPressed: horizontalScrollBar.increase()
+    Keys.onUpPressed: verticalScrollBar.decrease()
+    Keys.onDownPressed: verticalScrollBar.increase()
+}
diff --git a/src/commoncomponents/ListViewJami.qml b/src/commoncomponents/JamiListView.qml
similarity index 60%
rename from src/commoncomponents/ListViewJami.qml
rename to src/commoncomponents/JamiListView.qml
index 77db46589..2f88a8bb6 100644
--- a/src/commoncomponents/ListViewJami.qml
+++ b/src/commoncomponents/JamiListView.qml
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2019-2020 by Savoir-faire Linux
  * Author: Yang Wang   <yang.wang@savoirfairelinux.com>
+ * Author: Mingrui Zhang <mingrui.zhang@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
@@ -16,32 +17,24 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Constants 1.1
 
-Rectangle {
-    id: listViewBackground
+ListView {
+    id: root
 
-    property alias model: listView.model
-    property alias delegate: listView.delegate
-    property alias currentIndex: listView.currentIndex
+    layer.mipmap: false
+    clip: true
+    maximumFlickVelocity: 1024
 
-    border.width: 0
+    ScrollBar.vertical: JamiScrollBar {
+        id: verticalScrollBar
 
-    color: JamiTheme.backgroundColor
-
-    ListView {
-        id: listView
-
-        anchors.fill: parent
-
-        visible: listViewBackground.visible
-        layer.mipmap: false
-        clip: true
-        maximumFlickVelocity: 1024
-
-        ScrollBar.vertical: ScrollBar { }
+        attachedFlickableMoving: root.moving
     }
+
+    Keys.onUpPressed: verticalScrollBar.decrease()
+    Keys.onDownPressed: verticalScrollBar.increase()
 }
diff --git a/src/commoncomponents/JamiScrollBar.qml b/src/commoncomponents/JamiScrollBar.qml
new file mode 100644
index 000000000..65455fe3e
--- /dev/null
+++ b/src/commoncomponents/JamiScrollBar.qml
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2020 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@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
+ * 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 net.jami.Constants 1.1
+
+// Assumed to be attached to Flickable
+ScrollBar {
+    id: root
+
+    property bool attachedFlickableMoving: false
+    property alias handleColor: scrollBarRect.color
+
+    active: {
+        if (root.orientation === Qt.Horizontal)
+            return visible
+        else
+            return hovered || pressed || attachedFlickableMoving
+    }
+    hoverEnabled: true
+    orientation: Qt.Vertical
+
+    topPadding: root.orientation === Qt.Vertical ? 2 : 0
+    leftPadding: root.orientation === Qt.Horizontal ? 2 : 0
+    bottomPadding: 2
+    rightPadding: 2
+
+    contentItem: Rectangle {
+        id: scrollBarRect
+
+        implicitHeight: JamiTheme.scrollBarHandleSize
+        implicitWidth: JamiTheme.scrollBarHandleSize
+        radius: width / 2
+        color: pressed ? Qt.darker(JamiTheme.scrollBarHandleColor, 2.0) :
+                         JamiTheme.scrollBarHandleColor
+        opacity: 0
+
+        states: State {
+            name: "active"
+            when: root.policy === ScrollBar.AlwaysOn ||
+                  (root.active && root.size < 1.0)
+            PropertyChanges {
+                target: root.contentItem
+                opacity: 1
+            }
+        }
+
+        transitions: Transition {
+            from: "active"
+            SequentialAnimation {
+                PauseAnimation { duration: JamiTheme.longFadeDuration }
+                NumberAnimation { target: root.contentItem
+                    duration: JamiTheme.shortFadeDuration
+                    property: "opacity"
+                    to: 0.0
+                }
+            }
+        }
+    }
+
+    background: Rectangle {
+        implicitHeight: scrollBarRect.implicitHeight
+        implicitWidth: scrollBarRect.implicitWidth
+        color: JamiTheme.transparentColor
+        radius: width / 2
+    }
+}
diff --git a/src/commoncomponents/JamiSwitch.qml b/src/commoncomponents/JamiSwitch.qml
index 224ff9a40..98b9d3289 100644
--- a/src/commoncomponents/JamiSwitch.qml
+++ b/src/commoncomponents/JamiSwitch.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/LineEditContextMenu.qml b/src/commoncomponents/LineEditContextMenu.qml
index a9b9158fc..bcbb5faf8 100644
--- a/src/commoncomponents/LineEditContextMenu.qml
+++ b/src/commoncomponents/LineEditContextMenu.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/MaterialButton.qml b/src/commoncomponents/MaterialButton.qml
index 72a45917a..cdec8dced 100644
--- a/src/commoncomponents/MaterialButton.qml
+++ b/src/commoncomponents/MaterialButton.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/MaterialLineEdit.qml b/src/commoncomponents/MaterialLineEdit.qml
index 808a83699..6fef7009f 100644
--- a/src/commoncomponents/MaterialLineEdit.qml
+++ b/src/commoncomponents/MaterialLineEdit.qml
@@ -17,8 +17,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Constants 1.1
 
@@ -62,8 +62,8 @@ TextField {
         color: readOnly? "transparent" : backgroundColor
     }
 
-    onReleased: {
-        if (event.button == Qt.RightButton)
+    onReleased: function (event) {
+        if (event.button === Qt.RightButton)
             lineEditContextMenu.openMenuAt(event)
     }
 
@@ -73,7 +73,7 @@ TextField {
     // Use editingFinished when the info is saved by focus lost
     // (since losing focus will also emit editingFinished)
     // Use accepted when the info is not saved by focus lost
-    Keys.onPressed: {
+    Keys.onPressed: function (event) {
         if (event.key === Qt.Key_Enter ||
                 event.key === Qt.Key_Return) {
             if (loseFocusWhenEnterPressed)
diff --git a/src/commoncomponents/MaterialToolTip.qml b/src/commoncomponents/MaterialToolTip.qml
index c0e6609f4..f7ada9b43 100644
--- a/src/commoncomponents/MaterialToolTip.qml
+++ b/src/commoncomponents/MaterialToolTip.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.0
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/MessageBubble.qml b/src/commoncomponents/MessageBubble.qml
index 621769160..ab1cf3461 100644
--- a/src/commoncomponents/MessageBubble.qml
+++ b/src/commoncomponents/MessageBubble.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtGraphicalEffects 1.0
+import QtQuick
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/ModalPopup.qml b/src/commoncomponents/ModalPopup.qml
index a254ef211..fe8b64600 100644
--- a/src/commoncomponents/ModalPopup.qml
+++ b/src/commoncomponents/ModalPopup.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Constants 1.1
 
@@ -29,11 +29,6 @@ Popup {
     property bool autoClose: true
     property alias backgroundColor: container.color
 
-    onContentItemChanged: {
-        if(root.contentItem !== null)
-            root.contentItem.parent = container
-    }
-
     parent: Overlay.overlay
 
     // center in parent
@@ -65,9 +60,9 @@ Popup {
         horizontalOffset: 3.0
         verticalOffset: 3.0
         radius: container.radius * 4
-        samples: JamiTheme.modalPopupDropShadowSamples
         color: JamiTheme.shadowColor
         source: container
+        transparentBorder: true
     }
 
     enter: Transition {
diff --git a/src/commoncomponents/PasswordDialog.qml b/src/commoncomponents/PasswordDialog.qml
index bb30b99f7..97b680533 100644
--- a/src/commoncomponents/PasswordDialog.qml
+++ b/src/commoncomponents/PasswordDialog.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
diff --git a/src/commoncomponents/PhotoboothView.qml b/src/commoncomponents/PhotoboothView.qml
index 28599ecb6..ce506ba22 100644
--- a/src/commoncomponents/PhotoboothView.qml
+++ b/src/commoncomponents/PhotoboothView.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import Qt.labs.platform 1.1
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Layouts
+import Qt.labs.platform
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/commoncomponents/PreferenceItemDelegate.qml b/src/commoncomponents/PreferenceItemDelegate.qml
index b36651569..c0d07e463 100644
--- a/src/commoncomponents/PreferenceItemDelegate.qml
+++ b/src/commoncomponents/PreferenceItemDelegate.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/commoncomponents/PresenceIndicator.qml b/src/commoncomponents/PresenceIndicator.qml
index c798967f7..65fcb34fa 100644
--- a/src/commoncomponents/PresenceIndicator.qml
+++ b/src/commoncomponents/PresenceIndicator.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/commoncomponents/PushButton.qml b/src/commoncomponents/PushButton.qml
index ad28ae329..2734b498f 100644
--- a/src/commoncomponents/PushButton.qml
+++ b/src/commoncomponents/PushButton.qml
@@ -17,8 +17,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/ReadStatus.qml b/src/commoncomponents/ReadStatus.qml
index fcef8130c..db391ff70 100644
--- a/src/commoncomponents/ReadStatus.qml
+++ b/src/commoncomponents/ReadStatus.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/commoncomponents/ResponsiveImage.qml b/src/commoncomponents/ResponsiveImage.qml
index 1e00cd52a..a0d6b6969 100644
--- a/src/commoncomponents/ResponsiveImage.qml
+++ b/src/commoncomponents/ResponsiveImage.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Constants 1.1
 import net.jami.Helpers 1.1
@@ -48,7 +48,7 @@ Item {
     height: Math.trunc(containerHeight * Math.sqrt(2) * 0.5) + 3 - padding
 
     Connections {
-        target: ScreenInfo
+        target: CurrentScreenInfo
 
         function onDevicePixelRatioChanged() {
             image.setSourceSize()
diff --git a/src/commoncomponents/SBSMessageBase.qml b/src/commoncomponents/SBSMessageBase.qml
index 9ef4a93f9..db09eaf35 100644
--- a/src/commoncomponents/SBSMessageBase.qml
+++ b/src/commoncomponents/SBSMessageBase.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/commoncomponents/Scaffold.qml b/src/commoncomponents/Scaffold.qml
index 6ec64d193..6fdcf8452 100644
--- a/src/commoncomponents/Scaffold.qml
+++ b/src/commoncomponents/Scaffold.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 // UI dev tool to visualize components/layouts
 Rectangle {
diff --git a/src/commoncomponents/SettingParaCombobox.qml b/src/commoncomponents/SettingParaCombobox.qml
index cdb9ee980..9ccfeb792 100644
--- a/src/commoncomponents/SettingParaCombobox.qml
+++ b/src/commoncomponents/SettingParaCombobox.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Constants 1.1
 
@@ -111,19 +111,18 @@ ComboBox {
     }
 
     popup: Popup {
+        id: popup
+
         y: root.height - 1
         width: root.width
         implicitHeight: contentItem.implicitHeight
         padding: 1
 
-        contentItem: ListView {
+        contentItem: JamiListView {
             id: listView
 
-            clip: true
-            implicitHeight: contentHeight
+            implicitHeight: popup.contentHeight
             model: root.delegateModel
-
-            ScrollBar.vertical: ScrollBar {}
         }
 
         background: Rectangle {
diff --git a/src/commoncomponents/SimpleMessageDialog.qml b/src/commoncomponents/SimpleMessageDialog.qml
index b1c5d52c2..80c710f35 100644
--- a/src/commoncomponents/SimpleMessageDialog.qml
+++ b/src/commoncomponents/SimpleMessageDialog.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
diff --git a/src/commoncomponents/SpinningAnimation.qml b/src/commoncomponents/SpinningAnimation.qml
index 4261a8236..56b9fb5e5 100644
--- a/src/commoncomponents/SpinningAnimation.qml
+++ b/src/commoncomponents/SpinningAnimation.qml
@@ -17,8 +17,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import Qt5Compat.GraphicalEffects
 
 Item {
     id: root
diff --git a/src/commoncomponents/TextMessageDelegate.qml b/src/commoncomponents/TextMessageDelegate.qml
index fe66900df..e8d496677 100644
--- a/src/commoncomponents/TextMessageDelegate.qml
+++ b/src/commoncomponents/TextMessageDelegate.qml
@@ -17,10 +17,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/commoncomponents/TypingDots.qml b/src/commoncomponents/TypingDots.qml
index 939f4193b..a0c52eadd 100644
--- a/src/commoncomponents/TypingDots.qml
+++ b/src/commoncomponents/TypingDots.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/UsernameLineEdit.qml b/src/commoncomponents/UsernameLineEdit.qml
index c07dd24ba..96961cbbc 100644
--- a/src/commoncomponents/UsernameLineEdit.qml
+++ b/src/commoncomponents/UsernameLineEdit.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/commoncomponents/contextmenu/BaseContextMenu.qml b/src/commoncomponents/contextmenu/BaseContextMenu.qml
index 162a846f1..73b9dd3d7 100644
--- a/src/commoncomponents/contextmenu/BaseContextMenu.qml
+++ b/src/commoncomponents/contextmenu/BaseContextMenu.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Constants 1.1
 
@@ -111,8 +111,8 @@ Menu {
             horizontalOffset: 3.0
             verticalOffset: 3.0
             radius: 16.0
-            samples: 16
             color: JamiTheme.shadowColor
+            transparentBorder: true
         }
     }
 
diff --git a/src/commoncomponents/contextmenu/ContextMenuAutoLoader.qml b/src/commoncomponents/contextmenu/ContextMenuAutoLoader.qml
index 0c08a2d53..f2facf5f6 100644
--- a/src/commoncomponents/contextmenu/ContextMenuAutoLoader.qml
+++ b/src/commoncomponents/contextmenu/ContextMenuAutoLoader.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 import "../../commoncomponents/contextmenu"
 
diff --git a/src/commoncomponents/contextmenu/GeneralMenuItem.qml b/src/commoncomponents/contextmenu/GeneralMenuItem.qml
index 46ed091b7..335c6f24b 100644
--- a/src/commoncomponents/contextmenu/GeneralMenuItem.qml
+++ b/src/commoncomponents/contextmenu/GeneralMenuItem.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Constants 1.1
 
@@ -54,10 +54,13 @@ MenuItem {
 
         background: Rectangle {
             id: background
+
             anchors.fill: parent
             anchors.leftMargin: 1
             anchors.rightMargin: 1
-            color: "transparent"
+
+            color: menuItemContentRect.hovered ?
+                       JamiTheme.hoverColor : JamiTheme.backgroundColor
         }
 
         anchors.fill: parent
@@ -127,25 +130,6 @@ MenuItem {
             menuItem.clicked()
             parentMenu.close()
         }
-
-        states: [
-            State {
-                name: "hovered"
-                when: hovered
-                PropertyChanges {
-                    target: background
-                    color: JamiTheme.hoverColor
-                }
-            },
-            State {
-                name: "normal"
-                when: !hovered
-                PropertyChanges {
-                    target: background
-                    color: JamiTheme.backgroundColor
-                }
-            }
-        ]
     }
 
     highlighted: true
diff --git a/src/commoncomponents/contextmenu/GeneralMenuSeparator.qml b/src/commoncomponents/contextmenu/GeneralMenuSeparator.qml
index 378c12943..2e1f2f0a6 100644
--- a/src/commoncomponents/contextmenu/GeneralMenuSeparator.qml
+++ b/src/commoncomponents/contextmenu/GeneralMenuSeparator.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Constants 1.1
 
diff --git a/src/commoncomponents/emojipicker/EmojiPicker.qml b/src/commoncomponents/emojipicker/EmojiPicker.qml
index e9679657e..dd9ef0bb0 100644
--- a/src/commoncomponents/emojipicker/EmojiPicker.qml
+++ b/src/commoncomponents/emojipicker/EmojiPicker.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtWebEngine 1.10
-import QtWebChannel 1.15
+import QtQuick
+import QtQuick.Controls
+import QtWebEngine
+import QtWebChannel
 
 import net.jami.Constants 1.1
 import net.jami.Adapters 1.1
@@ -82,8 +82,8 @@ Rectangle {
             }
         }
 
-        onLoadingChanged: {
-            if (loadRequest.status == WebEngineView.LoadSucceededStatus) {
+        onLoadingChanged: function (loadingInfo) {
+            if (loadingInfo.status === WebEngineView.LoadSucceededStatus) {
                 emojiPickerWebView.runJavaScript(UtilsAdapter.qStringFromFile(
                                                      ":qwebchannel.js"))
                 emojiPickerWebView.runJavaScript(
diff --git a/src/constant/JamiQmlUtils.qml b/src/constant/JamiQmlUtils.qml
index d0c02d5b7..a1e9c2a32 100644
--- a/src/constant/JamiQmlUtils.qml
+++ b/src/constant/JamiQmlUtils.qml
@@ -19,7 +19,7 @@
 // JamiQmlUtils as a singleton is to provide global property entry
 pragma Singleton
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Adapters 1.1
 
diff --git a/src/constant/JamiStrings.qml b/src/constant/JamiStrings.qml
index da36a1672..4029dd758 100644
--- a/src/constant/JamiStrings.qml
+++ b/src/constant/JamiStrings.qml
@@ -19,7 +19,7 @@
 // JamiStrings as a singleton is to provide global strings entries.
 pragma Singleton
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Helpers 1.1
 
diff --git a/src/constant/JamiTheme.qml b/src/constant/JamiTheme.qml
index 7e847d064..dbd6e49e7 100644
--- a/src/constant/JamiTheme.qml
+++ b/src/constant/JamiTheme.qml
@@ -19,7 +19,7 @@
 // JamiTheme as a singleton is to provide global theme property entry.
 pragma Singleton
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Adapters 1.1
 import net.jami.Enums 1.1
@@ -173,6 +173,9 @@ Item {
     // Files To Send Container
     property color removeFileButtonColor: Qt.rgba(96, 95, 97, 0.5)
 
+    // JamiScrollBar
+    property color scrollBarHandleColor: "#cecece"
+
     // TypingDots
     property color typingDotsNormalColor: darkTheme ? "#686b72" : "lightgrey"
     property color typingDotsEnlargeColor: darkTheme ? "white" : Qt.darker("lightgrey", 3.0)
@@ -194,6 +197,7 @@ Item {
     property color bgDarkMode_: rgba256(32, 32, 32, 100)
 
     property int shortFadeDuration: 150
+    property int longFadeDuration: 400
     property int recordBlinkDuration: 500
     property int overlayFadeDelay: 4000
     property int overlayFadeDuration: 250
@@ -274,7 +278,6 @@ Item {
 
     // Modal Popup
     property real modalPopupRadius: 4
-    property real modalPopupDropShadowSamples: 16
 
     // MessageWebView
     property real chatViewHairLineSize: 1
@@ -336,6 +339,9 @@ Item {
     property real usernameLineEditPointSize: 9
     property real usernameLineEditlookupInterval: 200
 
+    // JamiScrollBar
+    property int scrollBarHandleSize: 6
+
     // Main application spec
     property real mainViewMinWidth: 332
     property real mainViewMinHeight: 500
diff --git a/src/constant/MsgSeq.qml b/src/constant/MsgSeq.qml
index de25c238d..f0e5de72d 100644
--- a/src/constant/MsgSeq.qml
+++ b/src/constant/MsgSeq.qml
@@ -1,5 +1,5 @@
 pragma Singleton
-import QtQml 2.15
+import QtQml
 QtObject {
     //readonly property int unknown: -1
     readonly property int single: 0
diff --git a/src/contactadapter.cpp b/src/contactadapter.cpp
index 96227a737..95508a2c5 100644
--- a/src/contactadapter.cpp
+++ b/src/contactadapter.cpp
@@ -49,18 +49,20 @@ ContactAdapter::getContactSelectableModel(int type)
     // Adjust filter.
     switch (listModeltype_) {
     case SmartListModel::Type::CONVERSATION:
-        selectableProxyModel_->setPredicate([this](const QModelIndex& index, const QRegExp&) {
-            return !defaultModerators_.contains(index.data(Role::URI).toString());
-        });
+        selectableProxyModel_->setPredicate(
+            [this](const QModelIndex& index, const QRegularExpression&) {
+                return !defaultModerators_.contains(index.data(Role::URI).toString());
+            });
         break;
 
     case SmartListModel::Type::CONFERENCE:
-        selectableProxyModel_->setPredicate([](const QModelIndex& index, const QRegExp&) {
+        selectableProxyModel_->setPredicate([](const QModelIndex& index, const QRegularExpression&) {
             return index.data(Role::Presence).toBool();
         });
         break;
     case SmartListModel::Type::TRANSFER:
-        selectableProxyModel_->setPredicate([this](const QModelIndex& index, const QRegExp& regexp) {
+        selectableProxyModel_->setPredicate([this](const QModelIndex& index,
+                                                   const QRegularExpression& regexp) {
             // Exclude current sip callee and filtered contact.
             bool match = true;
             const auto& conv = lrcInstance_->getConversationFromConvUid(
@@ -70,12 +72,13 @@ ContactAdapter::getContactSelectableModel(int type)
                                               ->getAccountInfo(lrcInstance_->get_currentAccountId())
                                               .contactModel->bestIdForContact(conv.participants[0]);
 
-                QRegExp matchExcept = QRegExp(QString("\\b(?!" + calleeDisplayId + "\\b)\\w+"));
-                match = matchExcept.indexIn(index.data(Role::BestId).toString()) != -1;
+                QRegularExpression matchExcept = QRegularExpression(
+                    QString("\\b(?!" + calleeDisplayId + "\\b)\\w+"));
+                match = matchExcept.match(index.data(Role::BestId).toString()).hasMatch();
             }
 
             if (match) {
-                match = regexp.indexIn(index.data(Role::BestId).toString()) != -1;
+                match = regexp.match(index.data(Role::BestId).toString()).hasMatch();
             }
             return match && !index.parent().isValid();
         });
@@ -95,13 +98,13 @@ ContactAdapter::setSearchFilter(const QString& filter)
         smartListModel_->setConferenceableFilter(filter);
     } else if (listModeltype_ == SmartListModel::Type::CONVERSATION) {
         selectableProxyModel_->setPredicate(
-            [this, filter](const QModelIndex& index, const QRegExp&) {
+            [this, filter](const QModelIndex& index, const QRegularExpression&) {
                 return (!defaultModerators_.contains(index.data(Role::URI).toString())
                         && index.data(Role::Title).toString().contains(filter));
             });
     }
-    selectableProxyModel_->setFilterRegExp(
-        QRegExp(filter, Qt::CaseInsensitive, QRegExp::FixedString));
+    selectableProxyModel_->setFilterRegularExpression(
+        QRegularExpression(filter, QRegularExpression::CaseInsensitiveOption));
 }
 
 void
@@ -190,9 +193,10 @@ ContactAdapter::contactSelected(int index)
 void
 ContactAdapter::connectSignals()
 {
-    connect(lrcInstance_->getCurrentContactModel(),
-            &ContactModel::bannedStatusChanged,
-            this,
-            &ContactAdapter::bannedStatusChanged,
-            Qt::UniqueConnection);
+    if (lrcInstance_->getCurrentContactModel())
+        connect(lrcInstance_->getCurrentContactModel(),
+                &ContactModel::bannedStatusChanged,
+                this,
+                &ContactAdapter::bannedStatusChanged,
+                Qt::UniqueConnection);
 }
diff --git a/src/contactadapter.h b/src/contactadapter.h
index a4c15a23c..1d754dcd3 100644
--- a/src/contactadapter.h
+++ b/src/contactadapter.h
@@ -42,7 +42,7 @@ class SelectableProxyModel final : public QSortFilterProxyModel
     Q_OBJECT
 
 public:
-    using FilterPredicate = std::function<bool(const QModelIndex&, const QRegExp&)>;
+    using FilterPredicate = std::function<bool(const QModelIndex&, const QRegularExpression&)>;
 
     explicit SelectableProxyModel(QObject* parent = nullptr)
         : QSortFilterProxyModel(parent)
@@ -61,7 +61,7 @@ public:
     {
         // Accept all contacts in conversation list filtered with account type, except those in a call.
         auto index = sourceModel()->index(sourceRow, 0, sourceParent);
-        return filterPredicate_ ? filterPredicate_(index, filterRegExp()) : false;
+        return filterPredicate_ ? filterPredicate_(index, filterRegularExpression()) : false;
     }
 
     bool lessThan(const QModelIndex& left, const QModelIndex& right) const override
diff --git a/src/conversationlistmodel.cpp b/src/conversationlistmodel.cpp
index 355c79cdc..03f2ad77c 100644
--- a/src/conversationlistmodel.cpp
+++ b/src/conversationlistmodel.cpp
@@ -93,7 +93,7 @@ bool
 ConversationListProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const
 {
     QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
-    auto rx = filterRegExp();
+    auto rx = filterRegularExpression();
     auto uriStripper = URI(rx.pattern());
     bool stripScheme = (uriStripper.schemeType() < URI::SchemeType::COUNT__);
     FlagPack<URI::Section> flags = URI::Section::USER_INFO | URI::Section::HOSTNAME
@@ -118,16 +118,18 @@ ConversationListProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& s
 
     // banned contacts require exact match
     if (index.data(Role::IsBanned).toBool()) {
-        if (!rx.isEmpty()) {
-            Q_FOREACH (const auto& filter, toFilter)
-                if (rx.exactMatch(filter)) {
+        if (!rx.isValid()) {
+            Q_FOREACH (const auto& filter, toFilter) {
+                auto matchResult = rx.match(filter);
+                if (matchResult.hasMatch() && matchResult.captured(0) == filter) {
                     match = true;
                     break;
                 }
+            }
         }
     } else {
         Q_FOREACH (const auto& filter, toFilter)
-            if (rx.indexIn(filter) != -1) {
+            if (rx.match(filter).hasMatch()) {
                 match = true;
                 break;
             }
diff --git a/src/conversationlistmodelbase.cpp b/src/conversationlistmodelbase.cpp
index db577fc40..3de0a53d1 100644
--- a/src/conversationlistmodelbase.cpp
+++ b/src/conversationlistmodelbase.cpp
@@ -95,7 +95,7 @@ ConversationListModelBase::dataForItem(item_t item, int role) const
             if (!draft.isEmpty()) {
                 // Pencil Emoji
                 uint cp = 0x270F;
-                auto emojiString = QString::fromUcs4(&cp, 1);
+                auto emojiString = QString::fromUcs4(reinterpret_cast<char32_t*>(&cp), 1);
                 return emojiString + draft;
             }
         }
diff --git a/src/main.cpp b/src/main.cpp
index 1cf92ae56..cdee5e828 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -24,7 +24,8 @@
 
 #include <QCryptographicHash>
 #include <QApplication>
-#include <QtWebEngine>
+#include <QtWebEngineCore>
+#include <QtWebEngineQuick>
 
 #include <clocale>
 
@@ -74,23 +75,16 @@ main(int argc, char* argv[])
 #endif
 #endif
     qtWebEngineChromiumFlags << disableWebSecurity;
-#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
-    // To be recovered in Qt 6.2 and above
-    // https://bugs.chromium.org/p/chromium/issues/detail?id=1060099#c6*/
     qtWebEngineChromiumFlags << singleProcess;
-#endif
+
+    QtWebEngineQuick::initialize();
+
     QApplication::setApplicationName("Jami");
     QApplication::setOrganizationDomain("jami.net");
-    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
-    QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
     QApplication::setQuitOnLastWindowClosed(false);
-    QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
     QCoreApplication::setApplicationVersion(QString(VERSION_STRING));
-#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
     QApplication::setHighDpiScaleFactorRoundingPolicy(
         Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
-#endif
-    QtWebEngine::initialize();
 
     auto newArgv = parseInputArgument(argc, argv, qtWebEngineChromiumFlags);
 
diff --git a/src/mainapplication.cpp b/src/mainapplication.cpp
index 34cee61ca..23b638ad5 100644
--- a/src/mainapplication.cpp
+++ b/src/mainapplication.cpp
@@ -97,7 +97,7 @@ ScreenInfo::setCurrentFocusWindow(QWindow* window)
 {
     if (window && !currentFocusWindow_) {
         currentFocusWindow_ = window;
-        setDevicePixelRatio(currentFocusWindow_->screen()->devicePixelRatio());
+        set_devicePixelRatio(currentFocusWindow_->screen()->devicePixelRatio());
 
         disconnect(devicePixelRatioConnection_);
         disconnect(currentFocusWindowScreenConnection_);
@@ -105,11 +105,11 @@ ScreenInfo::setCurrentFocusWindow(QWindow* window)
         currentFocusWindowScreenConnection_
             = connect(currentFocusWindow_, &QWindow::screenChanged, [this] {
                   currentFocusWindowScreen_ = currentFocusWindow_->screen();
-                  setDevicePixelRatio(currentFocusWindowScreen_->devicePixelRatio());
+                  set_devicePixelRatio(currentFocusWindowScreen_->devicePixelRatio());
 
                   devicePixelRatioConnection_ = connect(
                       currentFocusWindowScreen_, &QScreen::physicalDotsPerInchChanged, [this] {
-                          setDevicePixelRatio(currentFocusWindowScreen_->devicePixelRatio());
+                          set_devicePixelRatio(currentFocusWindowScreen_->devicePixelRatio());
                       });
               });
     }
@@ -270,12 +270,14 @@ MainApplication::loadTranslations()
     QTranslator* qtTranslator_name = new QTranslator(this);
     if (locale_name != locale_lang) {
         if (qtTranslator_lang->load("qt_" + locale_lang,
-                                    QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
+                                    QLibraryInfo::path(QLibraryInfo::TranslationsPath)))
             installTranslator(qtTranslator_lang);
     }
-    qtTranslator_name->load("qt_" + locale_name,
-                            QLibraryInfo::location(QLibraryInfo::TranslationsPath));
-    installTranslator(qtTranslator_name);
+
+    if (qtTranslator_name->load("qt_" + locale_name,
+                                QLibraryInfo::path(QLibraryInfo::TranslationsPath))) {
+        installTranslator(qtTranslator_name);
+    }
 
     QTranslator* lrcTranslator_lang = new QTranslator(this);
     QTranslator* lrcTranslator_name = new QTranslator(this);
diff --git a/src/mainapplication.h b/src/mainapplication.h
index f7fbc82de..be972170a 100644
--- a/src/mainapplication.h
+++ b/src/mainapplication.h
@@ -21,6 +21,7 @@
 #pragma once
 
 #include "lrcinstance.h"
+#include "qtutils.h"
 
 #include <QFile>
 #include <QApplication>
@@ -41,24 +42,11 @@ class PreviewEngine;
 class ScreenInfo : public QObject
 {
     Q_OBJECT
-    Q_PROPERTY(double devicePixelRatio MEMBER devicePixelRatio_ NOTIFY devicePixelRatioChanged)
+    QML_PROPERTY(double, devicePixelRatio)
 public:
     void setCurrentFocusWindow(QWindow* window);
-    void setDevicePixelRatio(double ratio)
-    {
-        if (ratio != devicePixelRatio_) {
-            devicePixelRatio_ = ratio;
-
-            Q_EMIT devicePixelRatioChanged();
-        }
-    }
-
-Q_SIGNALS:
-    void devicePixelRatioChanged();
 
 private:
-    double devicePixelRatio_ {0.0};
-
     QMetaObject::Connection currentFocusWindowScreenConnection_;
     QMetaObject::Connection devicePixelRatioConnection_;
 
diff --git a/src/mainview/MainView.qml b/src/mainview/MainView.qml
index c3cb6f801..2138d6a04 100644
--- a/src/mainview/MainView.qml
+++ b/src/mainview/MainView.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -340,7 +340,7 @@ Rectangle {
         width: mainViewSidePanelRect.width
         height: mainViewSidePanelRect.height
 
-        onItemSelected: {
+        onItemSelected: function (index) {
             settingsView.setSelected(index)
             if (sidePanelOnly)
                 sidePanelViewStack.push(settingsView, StackView.Immediate)
@@ -454,8 +454,12 @@ Rectangle {
     AboutPopUp {
         id: aboutPopUpDialog
 
-        height: Math.min(preferredHeight,
-                         mainView.height - JamiTheme.preferredMarginSize * 2)
+        onVisibleChanged: {
+            height = Qt.binding(function () {
+                return Math.min(preferredHeight,
+                                mainView.height - JamiTheme.preferredMarginSize * 2)
+            })
+        }
     }
 
     WelcomePageQrDialog {
@@ -510,14 +514,6 @@ Rectangle {
         }
     }
 
-    Shortcut {
-        sequence: "F10"
-        context: Qt.ApplicationShortcut
-        onActivated: {
-            shortcutsTable.open()
-        }
-    }
-
     Shortcut {
         sequence: "F11"
         context: Qt.ApplicationShortcut
@@ -565,8 +561,4 @@ Rectangle {
         context: Qt.ApplicationShortcut
         onActivated: Qt.quit()
     }
-
-    KeyBoardShortcutTable {
-        id: shortcutsTable
-    }
 }
diff --git a/src/mainview/components/AboutPopUp.qml b/src/mainview/components/AboutPopUp.qml
index dab656192..6e2a3295b 100644
--- a/src/mainview/components/AboutPopUp.qml
+++ b/src/mainview/components/AboutPopUp.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -37,217 +37,208 @@ ModalPopup {
         implicitWidth: 400
         color: JamiTheme.backgroundColor
 
-        ScrollView {
+        JamiFlickable {
             id: aboutPopUpScrollView
 
             anchors.fill: parent
 
-            ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
-            ScrollBar.vertical.policy: ScrollBar.AsNeeded
-
-            clip: true
+            contentHeight: aboutPopUpContentRectColumnLayout.implicitHeight
 
             ColumnLayout {
+                id: aboutPopUpContentRectColumnLayout
+
                 width: Math.max(root.width, implicitWidth)
                 height: Math.max(aboutPopUpScrollView.height, implicitHeight)
 
-                spacing: 0
-
-                ColumnLayout {
-                    id: aboutPopUpContentRectColumnLayout
+                ResponsiveImage {
+                    id: aboutPopUPJamiLogoImage
 
                     Layout.alignment: Qt.AlignCenter
+                    Layout.topMargin: JamiTheme.preferredMarginSize
+                    Layout.preferredWidth: 250
+                    Layout.preferredHeight: 88
 
-                    ResponsiveImage {
-                        id: aboutPopUPJamiLogoImage
-
-                        Layout.alignment: Qt.AlignCenter
-                        Layout.topMargin: JamiTheme.preferredMarginSize
-                        Layout.preferredWidth: 250
-                        Layout.preferredHeight: 88
-
-                        source: JamiTheme.darkTheme ?
-                                    JamiResources.logo_jami_standard_coul_white_svg :
-                                    JamiResources.logo_jami_standard_coul_svg
-                    }
+                    source: JamiTheme.darkTheme ?
+                                JamiResources.logo_jami_standard_coul_white_svg :
+                                JamiResources.logo_jami_standard_coul_svg
+                }
 
-                    MaterialLineEdit {
-                        id: jamiVersionText
+                MaterialLineEdit {
+                    id: jamiVersionText
 
-                        Layout.alignment: Qt.AlignCenter
-                        Layout.preferredWidth: contentRect.width
+                    Layout.alignment: Qt.AlignCenter
+                    Layout.preferredWidth: contentRect.width
 
-                        font.pointSize: JamiTheme.textFontSize
+                    font.pointSize: JamiTheme.textFontSize
 
-                        padding: 0
-                        readOnly: true
-                        selectByMouse: true
+                    padding: 0
+                    readOnly: true
+                    selectByMouse: true
 
-                        text: JamiStrings.version + ": " + UtilsAdapter.getVersionStr()
-                        color: JamiTheme.textColor
+                    text: JamiStrings.version + ": " + UtilsAdapter.getVersionStr()
+                    color: JamiTheme.textColor
 
-                        horizontalAlignment: Text.AlignHCenter
-                        verticalAlignment: Text.AlignVCenter
-                    }
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
+                }
 
-                    Label {
-                        id: jamiSlogansText
+                Label {
+                    id: jamiSlogansText
 
-                        Layout.alignment: Qt.AlignCenter
-                        Layout.preferredWidth: contentRect.width
-                        Layout.preferredHeight: textMetricsjamiSlogansText.boundingRect.height
-                        Layout.topMargin: 5
+                    Layout.alignment: Qt.AlignCenter
+                    Layout.preferredWidth: contentRect.width
+                    Layout.preferredHeight: textMetricsjamiSlogansText.boundingRect.height
+                    Layout.topMargin: 5
 
-                        wrapMode: Text.WordWrap
-                        font.pointSize: JamiTheme.textFontSize
+                    wrapMode: Text.WordWrap
+                    font.pointSize: JamiTheme.textFontSize
 
-                        horizontalAlignment: Text.AlignHCenter
-                        verticalAlignment: Text.AlignVCenter
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
 
-                        text: textMetricsjamiSlogansText.text
-                        color: JamiTheme.textColor
+                    text: textMetricsjamiSlogansText.text
+                    color: JamiTheme.textColor
 
-                        TextMetrics {
-                            id: textMetricsjamiSlogansText
-                            font: jamiSlogansText.font
-                            text: JamiStrings.slogan
-                        }
+                    TextMetrics {
+                        id: textMetricsjamiSlogansText
+                        font: jamiSlogansText.font
+                        text: JamiStrings.slogan
                     }
+                }
 
-                    Label {
-                        id: jamiDeclarationText
+                Label {
+                    id: jamiDeclarationText
 
-                        Layout.alignment: Qt.AlignCenter
-                        Layout.preferredWidth: contentRect.width
-                        Layout.preferredHeight: 40
-                        Layout.topMargin: 5
+                    Layout.alignment: Qt.AlignCenter
+                    Layout.preferredWidth: contentRect.width
+                    Layout.preferredHeight: 40
+                    Layout.topMargin: 5
 
-                        wrapMode: Text.WordWrap
-                        font.pointSize: JamiTheme.textFontSize
-                        color: JamiTheme.textColor
+                    wrapMode: Text.WordWrap
+                    font.pointSize: JamiTheme.textFontSize
+                    color: JamiTheme.textColor
 
-                        horizontalAlignment: Text.AlignHCenter
-                        verticalAlignment: Text.AlignVCenter
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
 
-                        // TextMetrics does not work for multi-line.
-                        text: JamiStrings.declaration
-                    }
+                    // TextMetrics does not work for multi-line.
+                    text: JamiStrings.declaration
+                }
 
-                    Label {
-                        id: jamiDeclarationHyperText
+                Label {
+                    id: jamiDeclarationHyperText
 
-                        Layout.alignment: Qt.AlignCenter
+                    Layout.alignment: Qt.AlignCenter
 
-                        // Strangely, hoveredLink works badly when width grows too large
-                        Layout.preferredWidth: 50
-                        Layout.preferredHeight: textMetricsjamiDeclarationHyperText.boundingRect.height
-                        Layout.topMargin: 5
-                        Layout.bottomMargin: 5
-                        color: JamiTheme.textColor
+                    // Strangely, hoveredLink works badly when width grows too large
+                    Layout.preferredWidth: 50
+                    Layout.preferredHeight: textMetricsjamiDeclarationHyperText.boundingRect.height
+                    Layout.topMargin: 5
+                    Layout.bottomMargin: 5
+                    color: JamiTheme.textColor
 
-                        font.pointSize: JamiTheme.textFontSize
-                        horizontalAlignment: Text.AlignHCenter
-                        verticalAlignment: Text.AlignVCenter
+                    font.pointSize: JamiTheme.textFontSize
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
 
-                        text: textMetricsjamiDeclarationHyperText.text
-                        onLinkActivated: Qt.openUrlExternally(link)
+                    text: textMetricsjamiDeclarationHyperText.text
+                    onLinkActivated: Qt.openUrlExternally(link)
 
-                        TextMetrics {
-                            id: textMetricsjamiDeclarationHyperText
-                            font: jamiDeclarationHyperText.font
-                            text: '<html><style type="text/css"></style><a href="https://jami.net">jami.net</a></html>'
-                        }
+                    TextMetrics {
+                        id: textMetricsjamiDeclarationHyperText
+                        font: jamiDeclarationHyperText.font
+                        text: '<html><style type="text/css"></style><a href="https://jami.net">jami.net</a></html>'
+                    }
 
-                        MouseArea {
-                            anchors.fill: parent
+                    MouseArea {
+                        anchors.fill: parent
 
-                            // We don't want to eat clicks on the Text.
-                            acceptedButtons: Qt.NoButton
-                            cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
-                        }
+                        // We don't want to eat clicks on the Text.
+                        acceptedButtons: Qt.NoButton
+                        cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
                     }
+                }
 
-                    Label {
-                        id: jamiDeclarationYearText
+                Label {
+                    id: jamiDeclarationYearText
 
-                        Layout.alignment: Qt.AlignCenter
-                        Layout.preferredWidth: contentRect.width
-                        Layout.preferredHeight: textMetricsjamiDeclarationYearText.boundingRect.height
-                        Layout.bottomMargin: 5
+                    Layout.alignment: Qt.AlignCenter
+                    Layout.preferredWidth: contentRect.width
+                    Layout.preferredHeight: textMetricsjamiDeclarationYearText.boundingRect.height
+                    Layout.bottomMargin: 5
 
-                        font.pointSize: JamiTheme.textFontSize
-                        color: JamiTheme.textColor
+                    font.pointSize: JamiTheme.textFontSize
+                    color: JamiTheme.textColor
 
-                        horizontalAlignment: Text.AlignHCenter
-                        verticalAlignment: Text.AlignVCenter
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
 
-                        text: textMetricsjamiDeclarationYearText.text
+                    text: textMetricsjamiDeclarationYearText.text
 
-                        TextMetrics {
-                            id: textMetricsjamiDeclarationYearText
-                            font: jamiDeclarationYearText.font
-                            text: JamiStrings.companyDeclarationYear
-                        }
+                    TextMetrics {
+                        id: textMetricsjamiDeclarationYearText
+                        font: jamiDeclarationYearText.font
+                        text: JamiStrings.companyDeclarationYear
                     }
+                }
 
-                    Label {
-                        id: jamiNoneWarrantyHyperText
+                Label {
+                    id: jamiNoneWarrantyHyperText
 
-                        Layout.alignment: Qt.AlignCenter
-                        Layout.preferredWidth: 300
-                        Layout.preferredHeight: textMetricsjamiNoneWarrantyHyperText.boundingRect.height * 2
-                        Layout.bottomMargin: 10
+                    Layout.alignment: Qt.AlignCenter
+                    Layout.preferredWidth: 300
+                    Layout.preferredHeight: textMetricsjamiNoneWarrantyHyperText.boundingRect.height * 2
+                    Layout.bottomMargin: 10
 
-                        wrapMode: Text.WordWrap
-                        font.pointSize: JamiTheme.tinyFontSize
+                    wrapMode: Text.WordWrap
+                    font.pointSize: JamiTheme.tinyFontSize
 
-                        horizontalAlignment: Text.AlignHCenter
-                        verticalAlignment: Text.AlignVCenter
-                        color: JamiTheme.textColor
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
+                    color: JamiTheme.textColor
 
-                        text: textMetricsjamiNoneWarrantyHyperText.text
-                        onLinkActivated: Qt.openUrlExternally(link)
+                    text: textMetricsjamiNoneWarrantyHyperText.text
+                    onLinkActivated: Qt.openUrlExternally(link)
 
-                        TextMetrics {
-                            id: textMetricsjamiNoneWarrantyHyperText
-                            font: jamiDeclarationHyperText.font
-                            text: '<html><style type="text/css"></style>This program comes with absolutely no warranty.<br\>See the <a href="http://www.gnu.org/licenses/gpl-3.0.html">GNU General Public License, version 3 or later</a> for details.</html>'
-                        }
+                    TextMetrics {
+                        id: textMetricsjamiNoneWarrantyHyperText
+                        font: jamiDeclarationHyperText.font
+                        text: '<html><style type="text/css"></style>This program comes with absolutely no warranty.<br\>See the <a href="http://www.gnu.org/licenses/gpl-3.0.html">GNU General Public License, version 3 or later</a> for details.</html>'
+                    }
 
-                        MouseArea {
-                            anchors.fill: parent
-                            acceptedButtons: Qt.NoButton
-                            cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
-                        }
+                    MouseArea {
+                        anchors.fill: parent
+                        acceptedButtons: Qt.NoButton
+                        cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
                     }
+                }
 
-                    ProjectCreditsScrollView {
-                        id: projectCreditsScrollView
+                ProjectCreditsScrollView {
+                    id: projectCreditsScrollView
 
-                        Layout.alignment: Qt.AlignCenter
-                        Layout.preferredWidth: contentRect.width - JamiTheme.preferredMarginSize * 2
-                        Layout.preferredHeight: 128
-                        Layout.margins: JamiTheme.preferredMarginSize
-                    }
+                    Layout.alignment: Qt.AlignCenter
+                    Layout.preferredWidth: contentRect.width - JamiTheme.preferredMarginSize * 2
+                    Layout.preferredHeight: 128
+                    Layout.margins: JamiTheme.preferredMarginSize
+                }
 
-                    MaterialButton {
-                        id: btnClose
+                MaterialButton {
+                    id: btnClose
 
-                        Layout.alignment: Qt.AlignHCenter
-                        Layout.bottomMargin: JamiTheme.preferredMarginSize
+                    Layout.alignment: Qt.AlignHCenter
+                    Layout.bottomMargin: JamiTheme.preferredMarginSize
 
-                        preferredWidth: JamiTheme.preferredFieldWidth / 2
-                        preferredHeight: JamiTheme.preferredFieldHeight
+                    preferredWidth: JamiTheme.preferredFieldWidth / 2
+                    preferredHeight: JamiTheme.preferredFieldHeight
 
-                        text: qsTr("Close")
-                        color: enabled? JamiTheme.buttonTintedBlack : JamiTheme.buttonTintedGrey
-                        hoveredColor: JamiTheme.buttonTintedBlackHovered
-                        pressedColor: JamiTheme.buttonTintedBlackPressed
-                        outlined: true
+                    text: qsTr("Close")
+                    color: enabled ? JamiTheme.buttonTintedBlack : JamiTheme.buttonTintedGrey
+                    hoveredColor: JamiTheme.buttonTintedBlackHovered
+                    pressedColor: JamiTheme.buttonTintedBlackPressed
+                    outlined: true
 
-                        onClicked: {
-                            close()
-                        }
+                    onClicked: {
+                        close()
                     }
                 }
             }
diff --git a/src/mainview/components/AccountComboBox.qml b/src/mainview/components/AccountComboBox.qml
index 3cfc96db1..38beaacc1 100644
--- a/src/mainview/components/AccountComboBox.qml
+++ b/src/mainview/components/AccountComboBox.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/AccountComboBoxPopup.qml b/src/mainview/components/AccountComboBoxPopup.qml
index 785245e91..524cf123b 100644
--- a/src/mainview/components/AccountComboBoxPopup.qml
+++ b/src/mainview/components/AccountComboBoxPopup.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -42,19 +42,18 @@ Popup {
     padding: 0
     modal: true
     Overlay.modal: Rectangle {
-        color: "transparent"
+        color: JamiTheme.transparentColor
     }
 
     contentItem: ColumnLayout {
         spacing: 0
-        ListView {
+
+        JamiListView {
             id: listView
 
             Layout.fillHeight: true
             Layout.preferredWidth: parent.width
 
-            clip: true
-
             model: CurrentAccountFilterModel
             delegate: AccountItemDelegate {
                 height: JamiTheme.accountListItemHeight
@@ -64,8 +63,6 @@ Popup {
                     LRCInstance.currentAccountId = ID
                 }
             }
-
-            ScrollBar.vertical: ScrollBar { }
         }
 
         // fake footer item as workaround for Qt 5.15 bug
@@ -114,8 +111,8 @@ Popup {
                 horizontalOffset: 3.0
                 verticalOffset: 3.0
                 radius: 16.0
-                samples: 16
                 color: JamiTheme.shadowColor
+                transparentBorder: true
             }
         }
     }
diff --git a/src/mainview/components/AccountItemDelegate.qml b/src/mainview/components/AccountItemDelegate.qml
index 10eb4c74d..6083b5f13 100644
--- a/src/mainview/components/AccountItemDelegate.qml
+++ b/src/mainview/components/AccountItemDelegate.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/mainview/components/BadgeNotifier.qml b/src/mainview/components/BadgeNotifier.qml
index 4070db0d1..758d0b001 100644
--- a/src/mainview/components/BadgeNotifier.qml
+++ b/src/mainview/components/BadgeNotifier.qml
@@ -17,7 +17,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Constants 1.1
 
diff --git a/src/mainview/components/CallActionBar.qml b/src/mainview/components/CallActionBar.qml
index c87b4ef38..600a65329 100644
--- a/src/mainview/components/CallActionBar.qml
+++ b/src/mainview/components/CallActionBar.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -463,7 +463,7 @@ Control {
                     anchors.bottom: parent.top
                     anchors.bottomMargin: itemSpacing
                     visible: !overflowButton.popup.visible
-                    ListView {
+                    JamiListView {
                         id: urgentOverflowListView
 
                         spacing: itemSpacing
@@ -473,7 +473,6 @@ Control {
                                    null
 
                         delegate: buttonDelegate
-                        ScrollBar.vertical: ScrollBar { }
 
                         add: Transition {
                             NumberAnimation {
@@ -494,7 +493,7 @@ Control {
                     implicitHeight: contentItem.implicitHeight
                     padding: 0
 
-                    contentItem: ListView {
+                    contentItem: JamiListView {
                         id: overflowHiddenListView
                         spacing: itemSpacing
                         implicitHeight: contentHeight
@@ -502,8 +501,6 @@ Control {
                         model: overflowButton.popup.visible ?
                                    overflowButton.delegateModel :
                                    null
-
-                        ScrollBar.vertical: ScrollBar { }
                     }
 
                     background: Rectangle {
diff --git a/src/mainview/components/CallButtonDelegate.qml b/src/mainview/components/CallButtonDelegate.qml
index bda715d5a..c229c5862 100644
--- a/src/mainview/components/CallButtonDelegate.qml
+++ b/src/mainview/components/CallButtonDelegate.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
@@ -244,7 +244,7 @@ ItemDelegate {
 
             onOpened: menuAction.triggered()
 
-            contentItem: ListView {
+            contentItem: JamiListView {
                 id: itemListView
 
                 property real menuItemWidth: 0
@@ -255,10 +255,6 @@ ItemDelegate {
                 implicitWidth: menuItemWidth
                 implicitHeight: Math.min(contentHeight, menuItemHeight * 6) + 24
 
-                ScrollBar.vertical: ScrollBar { }
-
-                clip: true
-
                 model: menu.delegateModel
 
                 TextMetrics {
@@ -300,8 +296,8 @@ ItemDelegate {
             horizontalOffset: 0
             verticalOffset: 0
             radius: 8.0
-            samples: 16
             color: "#80000000"
+            transparentBorder: true
         }
     }
 
diff --git a/src/mainview/components/CallOverlay.qml b/src/mainview/components/CallOverlay.qml
index 19e3966f6..fce06a3c1 100644
--- a/src/mainview/components/CallOverlay.qml
+++ b/src/mainview/components/CallOverlay.qml
@@ -18,7 +18,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/CallStackView.qml b/src/mainview/components/CallStackView.qml
index 343caa2f7..91d40b776 100644
--- a/src/mainview/components/CallStackView.qml
+++ b/src/mainview/components/CallStackView.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/CallViewContextMenu.qml b/src/mainview/components/CallViewContextMenu.qml
index e43c8a31f..866be5e20 100644
--- a/src/mainview/components/CallViewContextMenu.qml
+++ b/src/mainview/components/CallViewContextMenu.qml
@@ -18,7 +18,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/ChatView.qml b/src/mainview/components/ChatView.qml
index fe8be3a1e..b13ffa716 100644
--- a/src/mainview/components/ChatView.qml
+++ b/src/mainview/components/ChatView.qml
@@ -18,9 +18,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/ChatViewFooter.qml b/src/mainview/components/ChatViewFooter.qml
index ea520b3b2..0aace177e 100644
--- a/src/mainview/components/ChatViewFooter.qml
+++ b/src/mainview/components/ChatViewFooter.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/mainview/components/ChatViewHeader.qml b/src/mainview/components/ChatViewHeader.qml
index 4a25b45bd..ea629a8d0 100644
--- a/src/mainview/components/ChatViewHeader.qml
+++ b/src/mainview/components/ChatViewHeader.qml
@@ -17,8 +17,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/mainview/components/ContactPicker.qml b/src/mainview/components/ContactPicker.qml
index 2388a94b6..31b97aeea 100644
--- a/src/mainview/components/ContactPicker.qml
+++ b/src/mainview/components/ContactPicker.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
@@ -105,7 +105,7 @@ Popup {
                 }
             }
 
-            ListViewJami {
+            JamiListView {
                 id: contactPickerListView
 
                 Layout.alignment: Qt.AlignCenter
@@ -114,8 +114,6 @@ Popup {
 
                 model: ContactAdapter.getContactSelectableModel(type)
 
-                clip: true
-
                 delegate: ContactPickerItemDelegate {
                     id: contactPickerItemDelegate
 
diff --git a/src/mainview/components/ContactPickerItemDelegate.qml b/src/mainview/components/ContactPickerItemDelegate.qml
index 0df745420..f3b6877d0 100644
--- a/src/mainview/components/ContactPickerItemDelegate.qml
+++ b/src/mainview/components/ContactPickerItemDelegate.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
diff --git a/src/mainview/components/ContactSearchBar.qml b/src/mainview/components/ContactSearchBar.qml
index a2d88dc4a..740c0fd51 100644
--- a/src/mainview/components/ContactSearchBar.qml
+++ b/src/mainview/components/ContactSearchBar.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
@@ -94,8 +94,8 @@ Rectangle {
         }
 
         onTextChanged: root.contactSearchBarTextChanged(contactSearchBar.text)
-        onReleased: {
-            if (event.button == Qt.RightButton)
+        onReleased: function (event) {
+            if (event.button === Qt.RightButton)
                 lineEditContextMenu.openMenuAt(event)
         }
     }
diff --git a/src/mainview/components/ConversationAvatar.qml b/src/mainview/components/ConversationAvatar.qml
index 1a42e1165..6b96b4f5e 100644
--- a/src/mainview/components/ConversationAvatar.qml
+++ b/src/mainview/components/ConversationAvatar.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Adapters 1.1
 
diff --git a/src/mainview/components/ConversationListView.qml b/src/mainview/components/ConversationListView.qml
index cae64a224..72f05ebe2 100644
--- a/src/mainview/components/ConversationListView.qml
+++ b/src/mainview/components/ConversationListView.qml
@@ -17,14 +17,16 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
 
-ListView {
+import "../../commoncomponents"
+
+JamiListView {
     id: root
 
     // the following should be marked required (Qtver >= 5.15)
@@ -35,10 +37,6 @@ ListView {
     delegate: SmartListItemDelegate {}
     currentIndex: model.currentFilteredRow
 
-    clip: true
-    maximumFlickVelocity: 1024
-    ScrollBar.vertical: ScrollBar { }
-
     // highlight selection
     // down and hover states are done within the delegate
     highlight: Rectangle {
diff --git a/src/mainview/components/ConversationSmartListContextMenu.qml b/src/mainview/components/ConversationSmartListContextMenu.qml
index 7530d56c0..c560f2204 100644
--- a/src/mainview/components/ConversationSmartListContextMenu.qml
+++ b/src/mainview/components/ConversationSmartListContextMenu.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/FilesToSendContainer.qml b/src/mainview/components/FilesToSendContainer.qml
index 2db495467..926b80712 100644
--- a/src/mainview/components/FilesToSendContainer.qml
+++ b/src/mainview/components/FilesToSendContainer.qml
@@ -16,12 +16,14 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
 
+import "../../commoncomponents"
+
 Rectangle {
     id: root
 
@@ -30,7 +32,7 @@ Rectangle {
 
     color: JamiTheme.messageOutBgColor
 
-    ScrollView {
+    JamiFlickable {
         id: filesToSendContainerScrollView
 
         anchors.fill: root
@@ -38,16 +40,9 @@ Rectangle {
         contentHeight: root.height
         contentWidth: filesToSendContainerRow.width
 
-        ScrollBar.horizontal.visible: {
-            var ratio = filesToSendContainerRow.width / root.width
-            return ratio > 1
-        }
-        ScrollBar.horizontal.contentItem: Rectangle {
-            implicitHeight: 5
-            radius: width / 2
-            color: filesToSendContainerScrollView.ScrollBar.horizontal.pressed ?
-                       JamiTheme.darkGreyColor : JamiTheme.whiteColor
-        }
+        horizontalHandleColor:
+            filesToSendContainerScrollView.ScrollBar.horizontal.pressed ?
+                JamiTheme.darkGreyColor : JamiTheme.whiteColor
         ScrollBar.vertical.policy: ScrollBar.AlwaysOff
 
         Row {
diff --git a/src/mainview/components/FilesToSendDelegate.qml b/src/mainview/components/FilesToSendDelegate.qml
index 0ff8a0a2b..fb642e1f0 100644
--- a/src/mainview/components/FilesToSendDelegate.qml
+++ b/src/mainview/components/FilesToSendDelegate.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Constants 1.1
 import net.jami.Models 1.1
diff --git a/src/mainview/components/FilterTabButton.qml b/src/mainview/components/FilterTabButton.qml
index fa3271b9e..b17cc0135 100644
--- a/src/mainview/components/FilterTabButton.qml
+++ b/src/mainview/components/FilterTabButton.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Constants 1.1
 
diff --git a/src/mainview/components/InitialCallPage.qml b/src/mainview/components/InitialCallPage.qml
index aa7970671..d84b5aa23 100644
--- a/src/mainview/components/InitialCallPage.qml
+++ b/src/mainview/components/InitialCallPage.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -82,7 +82,9 @@ Rectangle {
         anchors.fill: parent
         propagateComposedEvents: false
         acceptedButtons: Qt.AllButtons
-        onDoubleClicked: mouse.accepted = true
+        onDoubleClicked: function (mouse) {
+            mouse.accepted = true
+        }
     }
 
     ColumnLayout {
diff --git a/src/mainview/components/InvitationView.qml b/src/mainview/components/InvitationView.qml
index 6499a1f34..fcac254ba 100644
--- a/src/mainview/components/InvitationView.qml
+++ b/src/mainview/components/InvitationView.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
diff --git a/src/mainview/components/MainOverlay.qml b/src/mainview/components/MainOverlay.qml
index cdcd20b3d..fd428dacd 100644
--- a/src/mainview/components/MainOverlay.qml
+++ b/src/mainview/components/MainOverlay.qml
@@ -19,8 +19,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/MessageBar.qml b/src/mainview/components/MessageBar.qml
index ed56cd206..8ac2d3e93 100644
--- a/src/mainview/components/MessageBar.qml
+++ b/src/mainview/components/MessageBar.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
diff --git a/src/mainview/components/MessageBarTextArea.qml b/src/mainview/components/MessageBarTextArea.qml
index 3148be89e..8b8c94d4f 100644
--- a/src/mainview/components/MessageBarTextArea.qml
+++ b/src/mainview/components/MessageBarTextArea.qml
@@ -16,15 +16,15 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
 
 import "../../commoncomponents"
 
-Flickable {
+JamiFlickable {
     id: root
 
     property alias text: textArea.text
@@ -57,15 +57,11 @@ Flickable {
         }
     }
 
-    ScrollBar.vertical: ScrollBar {
-        policy: contentHeight > height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded
-    }
-
     contentWidth: width
     contentHeight: textArea.implicitHeight
 
     interactive: true
-    clip: true
+    attachedFlickableMoving: contentHeight > height || root.moving
 
     function ensureVisible(r) {
         if (contentY >= r.y)
@@ -118,7 +114,7 @@ Flickable {
             color: JamiTheme.transparentColor
         }
 
-        onReleased: {
+        onReleased: function (event) {
             if (event.button == Qt.RightButton)
                 textAreaContextMenu.openMenuAt(event)
         }
diff --git a/src/mainview/components/MessageListView.qml b/src/mainview/components/MessageListView.qml
index dee42c3bd..9aec8fa86 100644
--- a/src/mainview/components/MessageListView.qml
+++ b/src/mainview/components/MessageListView.qml
@@ -17,10 +17,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import Qt.labs.qmlmodels 1.0
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt.labs.qmlmodels
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/OngoingCallPage.qml b/src/mainview/components/OngoingCallPage.qml
index 738ab910b..bfdc0d031 100644
--- a/src/mainview/components/OngoingCallPage.qml
+++ b/src/mainview/components/OngoingCallPage.qml
@@ -18,10 +18,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -151,12 +151,12 @@ Rectangle {
 
                 acceptedButtons: Qt.LeftButton | Qt.RightButton
 
-                onDoubleClicked: {
+                onDoubleClicked: function (mouse) {
                     if (mouse.button === Qt.LeftButton)
                         callStackView.toggleFullScreen()
                 }
 
-                onClicked: {
+                onClicked: function (mouse) {
                     if (mouse.button === Qt.RightButton)
                         callOverlay.openCallViewContextMenuInPos(mouse.x, mouse.y)
                 }
@@ -223,7 +223,7 @@ Rectangle {
 
                         anchors.fill: previewRenderer
 
-                        onPressed: {
+                        onPressed: function (mouse) {
                             clickPos = Qt.point(mouse.x, mouse.y)
                         }
 
@@ -232,7 +232,7 @@ Rectangle {
                             previewMagneticSnap()
                         }
 
-                        onPositionChanged: {
+                        onPositionChanged: function (mouse) {
                             // Calculate mouse position relative change.
                             var delta = Qt.point(mouse.x - clickPos.x,
                                                  mouse.y - clickPos.y)
diff --git a/src/mainview/components/ParticipantCallInStatusDelegate.qml b/src/mainview/components/ParticipantCallInStatusDelegate.qml
index 8bc5d65ca..e576f8d16 100644
--- a/src/mainview/components/ParticipantCallInStatusDelegate.qml
+++ b/src/mainview/components/ParticipantCallInStatusDelegate.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
diff --git a/src/mainview/components/ParticipantCallInStatusView.qml b/src/mainview/components/ParticipantCallInStatusView.qml
index da8709e61..a3fa42c35 100644
--- a/src/mainview/components/ParticipantCallInStatusView.qml
+++ b/src/mainview/components/ParticipantCallInStatusView.qml
@@ -16,14 +16,16 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
 
-ListView {
+import "../../commoncomponents"
+
+JamiListView {
     id: root
 
     width: currentItem ? currentItem.width + currentItem.spinningAnimationWidth
@@ -52,8 +54,4 @@ ListView {
                                       : preferredHeight
         }
     }
-
-    clip: true
-    maximumFlickVelocity: 1024
-    ScrollBar.vertical: ScrollBar { }
 }
diff --git a/src/mainview/components/ParticipantControlLayout.qml b/src/mainview/components/ParticipantControlLayout.qml
index 146836c31..184cd94b9 100644
--- a/src/mainview/components/ParticipantControlLayout.qml
+++ b/src/mainview/components/ParticipantControlLayout.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick.Layouts 1.15
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
diff --git a/src/mainview/components/ParticipantOverlay.qml b/src/mainview/components/ParticipantOverlay.qml
index 6a080fd6d..9fb874608 100644
--- a/src/mainview/components/ParticipantOverlay.qml
+++ b/src/mainview/components/ParticipantOverlay.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Shapes 1.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Shapes
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
diff --git a/src/mainview/components/ParticipantOverlayButton.qml b/src/mainview/components/ParticipantOverlayButton.qml
index ec646cdfe..0f4ac7edf 100644
--- a/src/mainview/components/ParticipantOverlayButton.qml
+++ b/src/mainview/components/ParticipantOverlayButton.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Constants 1.1
 
diff --git a/src/mainview/components/ParticipantOverlayMenu.qml b/src/mainview/components/ParticipantOverlayMenu.qml
index b3e82741c..26c93e0bc 100644
--- a/src/mainview/components/ParticipantOverlayMenu.qml
+++ b/src/mainview/components/ParticipantOverlayMenu.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
diff --git a/src/mainview/components/ParticipantsLayer.qml b/src/mainview/components/ParticipantsLayer.qml
index b29320567..6aba4e8e1 100644
--- a/src/mainview/components/ParticipantsLayer.qml
+++ b/src/mainview/components/ParticipantsLayer.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 Item {
     id: root
diff --git a/src/mainview/components/PluginHandlerItemDelegate.qml b/src/mainview/components/PluginHandlerItemDelegate.qml
index 2a5d6a901..d573d3f58 100644
--- a/src/mainview/components/PluginHandlerItemDelegate.qml
+++ b/src/mainview/components/PluginHandlerItemDelegate.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/mainview/components/PluginHandlerPicker.qml b/src/mainview/components/PluginHandlerPicker.qml
index e531b97b7..e659d9a02 100644
--- a/src/mainview/components/PluginHandlerPicker.qml
+++ b/src/mainview/components/PluginHandlerPicker.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -123,7 +123,7 @@ Popup {
                     }
                 }
 
-                ListViewJami {
+                JamiListView {
                     id: pluginhandlerPickerListView
 
                     Layout.alignment: Qt.AlignHCenter
@@ -142,8 +142,6 @@ Popup {
                         }
                     }
 
-                    clip: true
-
                     delegate: PluginHandlerItemDelegate {
                         id: pluginHandlerItemDelegate
                         visible: PluginModel.getPluginsEnabled()
@@ -167,8 +165,6 @@ Popup {
                             updateProperties()
                         }
                     }
-
-                    ScrollBar.vertical: ScrollBar { }
                 }
             }
         }
@@ -241,7 +237,7 @@ Popup {
                     }
                 }
 
-                ListViewJami {
+                JamiListView {
                     id: pluginhandlerPreferencePickerListView
 
                     Layout.alignment: Qt.AlignHCenter
@@ -253,8 +249,6 @@ Popup {
 
                     model: PluginAdapter.getHandlerPreferencesModel(pluginId, handlerName)
 
-                    clip: true
-
                     delegate: PreferenceItemDelegate {
                         id: pluginHandlerPreferenceDelegate
                         width: pluginhandlerPreferencePickerListView.width
diff --git a/src/mainview/components/ProjectCreditsScrollView.qml b/src/mainview/components/ProjectCreditsScrollView.qml
index d22e3b9ec..e08925f5d 100644
--- a/src/mainview/components/ProjectCreditsScrollView.qml
+++ b/src/mainview/components/ProjectCreditsScrollView.qml
@@ -16,47 +16,49 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
 
-ScrollView {
-    id: projectCreditsScrollView
+import "../../commoncomponents"
 
-    clip: true
+Rectangle {
+    id: root
 
-    ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
+    radius: 5
+    border.color: JamiTheme.tabbarBorderColor
 
-    TextEdit {
-        id: projectCreditsTextArea
+    JamiFlickable {
+        id: projectCreditsFlickable
 
-        horizontalAlignment: Text.AlignHCenter
+        anchors.fill: parent
 
-        width: projectCreditsScrollView.width
+        contentHeight: projectCreditsTextArea.paintedHeight
 
-        selectByMouse: false
-        readOnly: true
-        wrapMode: Text.WordWrap
+        TextEdit {
+            id: projectCreditsTextArea
 
-        font.pointSize: JamiTheme.textFontSize
-        text: UtilsAdapter.getProjectCredits()
-        textFormat: TextEdit.RichText
+            horizontalAlignment: Text.AlignHCenter
 
-        MouseArea {
-            anchors.fill: parent
-            propagateComposedEvents: true
-            cursorShape: Qt.ArrowCursor
-            acceptedButtons: Qt.NoButton
-        }
-    }
+            width: projectCreditsFlickable.width
 
-    background: Rectangle {
-        id: projectCreditsScrollViewBackground
+            selectByMouse: false
+            readOnly: true
+            wrapMode: Text.WordWrap
 
-        radius: 5
-        border.color: JamiTheme.tabbarBorderColor
+            font.pointSize: JamiTheme.textFontSize
+            text: UtilsAdapter.getProjectCredits()
+            textFormat: TextEdit.RichText
+
+            MouseArea {
+                anchors.fill: parent
+                propagateComposedEvents: true
+                cursorShape: Qt.ArrowCursor
+                acceptedButtons: Qt.NoButton
+            }
+        }
     }
 }
diff --git a/src/mainview/components/ReadOnlyFooter.qml b/src/mainview/components/ReadOnlyFooter.qml
index 97033315e..0e1b2fff0 100644
--- a/src/mainview/components/ReadOnlyFooter.qml
+++ b/src/mainview/components/ReadOnlyFooter.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
diff --git a/src/mainview/components/RecordBox.qml b/src/mainview/components/RecordBox.qml
index ccfcc6feb..51819406b 100644
--- a/src/mainview/components/RecordBox.qml
+++ b/src/mainview/components/RecordBox.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtGraphicalEffects 1.15
-import QtQuick.Shapes 1.15
+import QtQuick
+import QtQuick.Controls
+import Qt5Compat.GraphicalEffects
+import QtQuick.Shapes
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/ScreenRubberBand.qml b/src/mainview/components/ScreenRubberBand.qml
index 79f255217..71fb789e1 100644
--- a/src/mainview/components/ScreenRubberBand.qml
+++ b/src/mainview/components/ScreenRubberBand.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Window 2.15
+import QtQuick
+import QtQuick.Window
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
diff --git a/src/mainview/components/ScrollToBottomButton.qml b/src/mainview/components/ScrollToBottomButton.qml
index 7eae256bb..7f3c0245c 100644
--- a/src/mainview/components/ScrollToBottomButton.qml
+++ b/src/mainview/components/ScrollToBottomButton.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Constants 1.1
 
@@ -123,7 +123,6 @@ Control {
                 horizontalOffset: 3.0
                 verticalOffset: 3.0
                 radius: 8.0
-                samples: 16
                 color: JamiTheme.shadowColor
             }
         }
diff --git a/src/mainview/components/SelectScreen.qml b/src/mainview/components/SelectScreen.qml
index e4902d2bc..0a5d0a0c8 100644
--- a/src/mainview/components/SelectScreen.qml
+++ b/src/mainview/components/SelectScreen.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Window 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Window
+import QtQuick.Controls
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
@@ -76,10 +76,6 @@ Window {
 
     screen: JamiQmlUtils.mainApplicationScreen
 
-    modality: Qt.ApplicationModal
-
-    title: JamiStrings.selectScreen
-
     Rectangle {
         id: selectScreenWindowRect
 
@@ -87,7 +83,20 @@ Window {
 
         color: JamiTheme.backgroundColor
 
-        ScrollView {
+        Text {
+            id: screenListText
+
+            anchors.top: selectScreenWindowRect.top
+            anchors.topMargin: JamiTheme.preferredMarginSize
+            anchors.horizontalCenter: selectScreenWindowRect.horizontalCenter
+
+            font.pointSize: JamiTheme.textFontSize + 2
+            font.bold: true
+            text: JamiStrings.selectScreen
+            color: JamiTheme.textColor
+        }
+
+        JamiFlickable {
             id: screenSelectionScrollView
 
             anchors.topMargin: JamiTheme.preferredMarginSize
@@ -97,10 +106,7 @@ Window {
             height: selectScreenWindowRect.height -
                     (selectButton.height + JamiTheme.preferredMarginSize * 4)
 
-            clip: true
-
-            ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
-            ScrollBar.vertical.policy: ScrollBar.AlwaysOn
+            contentHeight: screenSelectionScrollViewColumn.implicitHeight
 
             Flow {
                 id: screenSelectionScrollViewFlow
diff --git a/src/mainview/components/SidePanel.qml b/src/mainview/components/SidePanel.qml
index 71660cc57..dbdb6a1ef 100644
--- a/src/mainview/components/SidePanel.qml
+++ b/src/mainview/components/SidePanel.qml
@@ -17,8 +17,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -69,7 +69,7 @@ Rectangle {
         anchors.right: sidePanelRect.right
         anchors.rightMargin: 15
 
-        onContactSearchBarTextChanged: {
+        onContactSearchBarTextChanged: function (text) {
             // not calling positionViewAtBeginning will cause
             // sort animation visual bugs
             conversationListView.positionViewAtBeginning()
diff --git a/src/mainview/components/SidePanelTabBar.qml b/src/mainview/components/SidePanelTabBar.qml
index 970b081f1..4020a11f6 100644
--- a/src/mainview/components/SidePanelTabBar.qml
+++ b/src/mainview/components/SidePanelTabBar.qml
@@ -17,7 +17,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick.Controls 2.15
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/SipInputPanel.qml b/src/mainview/components/SipInputPanel.qml
index 426047a02..6ac9fc676 100644
--- a/src/mainview/components/SipInputPanel.qml
+++ b/src/mainview/components/SipInputPanel.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
diff --git a/src/mainview/components/SmartListItemDelegate.qml b/src/mainview/components/SmartListItemDelegate.qml
index 612e95061..56f004914 100644
--- a/src/mainview/components/SmartListItemDelegate.qml
+++ b/src/mainview/components/SmartListItemDelegate.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -190,6 +190,8 @@ ItemDelegate {
     MouseArea {
         anchors.fill: parent
         acceptedButtons: Qt.RightButton
-        onClicked: root.ListView.view.openContextMenuAt(mouse.x, mouse.y, root)
+        onClicked: function (mouse) {
+            root.ListView.view.openContextMenuAt(mouse.x, mouse.y, root)
+        }
     }
 }
diff --git a/src/mainview/components/UserProfile.qml b/src/mainview/components/UserProfile.qml
index 9e5bc9a9f..0a82fbd4d 100644
--- a/src/mainview/components/UserProfile.qml
+++ b/src/mainview/components/UserProfile.qml
@@ -17,8 +17,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Constants 1.1
 
diff --git a/src/mainview/components/WelcomePage.qml b/src/mainview/components/WelcomePage.qml
index f6ce1a406..bd912b8ff 100644
--- a/src/mainview/components/WelcomePage.qml
+++ b/src/mainview/components/WelcomePage.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/mainview/components/WelcomePageQrDialog.qml b/src/mainview/components/WelcomePageQrDialog.qml
index 75c7b0384..5efd84cb1 100644
--- a/src/mainview/components/WelcomePageQrDialog.qml
+++ b/src/mainview/components/WelcomePageQrDialog.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Adapters 1.1
 
diff --git a/src/messagesadapter.cpp b/src/messagesadapter.cpp
index 25f912183..91f8eed02 100644
--- a/src/messagesadapter.cpp
+++ b/src/messagesadapter.cpp
@@ -248,7 +248,8 @@ MessagesAdapter::onPaste()
         // Extract the local paths of the files.
         for (int i = 0; i < urlList.size(); ++i) {
             // Trim file:// or file:/// from url.
-            QString filePath = urlList.at(i).toString().remove(QRegExp("^file:\\/{2,3}"));
+            QString filePath = urlList.at(i).toString().remove(
+                QRegularExpression("^file:\\/{2,3}"));
             Q_EMIT newFilePasted(filePath);
         }
     } else {
diff --git a/src/networkmanager.cpp b/src/networkmanager.cpp
index d82c3d3d2..c5ba2b0dc 100644
--- a/src/networkmanager.cpp
+++ b/src/networkmanager.cpp
@@ -81,11 +81,7 @@ NetWorkManager::get(const QUrl& url, const DoneCallBack& doneCb, const QString&
     Q_EMIT statusChanged(GetStatus::STARTED);
 
     connect(reply_,
-#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
             QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::errorOccurred),
-#else
-            QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
-#endif
             [this, doneCb, path](QNetworkReply::NetworkError error) {
                 reply_->disconnect();
                 reset(true);
diff --git a/src/previewengine.cpp b/src/previewengine.cpp
index 5796ff07b..abced5db4 100644
--- a/src/previewengine.cpp
+++ b/src/previewengine.cpp
@@ -19,7 +19,6 @@
 
 #include "previewengine.h"
 
-#include <QtWebEngine>
 #include <QWebEngineScript>
 #include <QWebEngineProfile>
 #include <QWebEngineSettings>
diff --git a/src/previewengine.h b/src/previewengine.h
index 8cb7e322f..c19eb6b7d 100644
--- a/src/previewengine.h
+++ b/src/previewengine.h
@@ -22,9 +22,7 @@
 #include "utils.h"
 
 #include <QtWebChannel>
-#include <QtWebEngine>
 #include <QtWebEngineCore>
-#include <QtWebEngine>
 #include <QWebEngineView>
 
 class PreviewEngine;
diff --git a/src/qmlregister.cpp b/src/qmlregister.cpp
index 6954d3988..759b0043c 100644
--- a/src/qmlregister.cpp
+++ b/src/qmlregister.cpp
@@ -179,7 +179,7 @@ registerTypes(QQmlEngine* engine,
     QML_REGISTERSINGLETONTYPE_URL(NS_CONSTANTS, "qrc:/src/constant/JamiResources.qml", JamiResources);
     QML_REGISTERSINGLETONTYPE_URL(NS_CONSTANTS, "qrc:/src/constant/MsgSeq.qml", MsgSeq);
 
-    QML_REGISTERSINGLETONTYPE_POBJECT(NS_CONSTANTS, screenInfo, "ScreenInfo")
+    QML_REGISTERSINGLETONTYPE_POBJECT(NS_CONSTANTS, screenInfo, "CurrentScreenInfo")
     QML_REGISTERSINGLETONTYPE_POBJECT(NS_CONSTANTS, lrcInstance, "LRCInstance")
     QML_REGISTERSINGLETONTYPE_POBJECT(NS_CONSTANTS, settingsManager, "AppSettingsManager")
 
diff --git a/src/quickimageproviderbase.h b/src/quickimageproviderbase.h
index 896269d10..66c84751c 100644
--- a/src/quickimageproviderbase.h
+++ b/src/quickimageproviderbase.h
@@ -24,7 +24,7 @@
 
 class LRCInstance;
 
-class QuickImageProviderBase : public QObject, public QQuickImageProvider
+class QuickImageProviderBase : public QQuickImageProvider
 {
 public:
     QuickImageProviderBase(QQuickImageProvider::ImageType type,
diff --git a/src/settingsview/SettingsView.qml b/src/settingsview/SettingsView.qml
index d89b61cec..752adbace 100644
--- a/src/settingsview/SettingsView.qml
+++ b/src/settingsview/SettingsView.qml
@@ -17,15 +17,16 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
 
 import "components"
+import "../commoncomponents"
 import "../mainview/js/contactpickercreation.js" as ContactPickerCreation
 
 Rectangle {
@@ -129,7 +130,7 @@ Rectangle {
             onBackArrowClicked: root.settingsBackArrowClicked()
         }
 
-        Flickable {
+        JamiFlickable {
             id: settingsViewScrollView
 
             anchors.top: settingsHeader.bottom
@@ -138,10 +139,6 @@ Rectangle {
             height: settingsViewRect.height - settingsHeader.height
             width: settingsViewRect.width
 
-            maximumFlickVelocity: 1024
-            ScrollBar.vertical: ScrollBar { }
-
-            clip: true
             contentHeight: rightSettingsStackLayout.height
 
             StackLayout {
@@ -194,7 +191,7 @@ Rectangle {
                         leaveSettingsSlot(false)
                     }
 
-                    onAdvancedSettingsToggled: {
+                    onAdvancedSettingsToggled: function (settingsVisible) {
                         if (settingsVisible)
                             settingsViewScrollView.contentY = getAdvancedSettingsScrollPosition()
                         else
diff --git a/src/settingsview/components/AccountProfile.qml b/src/settingsview/components/AccountProfile.qml
index 9b1e3fb4b..8074d264f 100644
--- a/src/settingsview/components/AccountProfile.qml
+++ b/src/settingsview/components/AccountProfile.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AdvancedCallSettings.qml b/src/settingsview/components/AdvancedCallSettings.qml
index 3e327280f..445297351 100644
--- a/src/settingsview/components/AdvancedCallSettings.qml
+++ b/src/settingsview/components/AdvancedCallSettings.qml
@@ -17,8 +17,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -161,7 +161,7 @@ ColumnLayout {
                         - JamiTheme.preferredMarginSize * 4
         }
 
-        ListViewJami {
+        JamiListView {
             id: moderatorListWidget
 
             Layout.fillWidth: true
diff --git a/src/settingsview/components/AdvancedChatSettings.qml b/src/settingsview/components/AdvancedChatSettings.qml
index be7530758..eb68320d0 100644
--- a/src/settingsview/components/AdvancedChatSettings.qml
+++ b/src/settingsview/components/AdvancedChatSettings.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
diff --git a/src/settingsview/components/AdvancedConnectivitySettings.qml b/src/settingsview/components/AdvancedConnectivitySettings.qml
index b7b29a473..f068285c8 100644
--- a/src/settingsview/components/AdvancedConnectivitySettings.qml
+++ b/src/settingsview/components/AdvancedConnectivitySettings.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AdvancedJamiSecuritySettings.qml b/src/settingsview/components/AdvancedJamiSecuritySettings.qml
index 4e68c9457..bb0e3a8d7 100644
--- a/src/settingsview/components/AdvancedJamiSecuritySettings.qml
+++ b/src/settingsview/components/AdvancedJamiSecuritySettings.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AdvancedMediaSettings.qml b/src/settingsview/components/AdvancedMediaSettings.qml
index badf90250..4eff63706 100644
--- a/src/settingsview/components/AdvancedMediaSettings.qml
+++ b/src/settingsview/components/AdvancedMediaSettings.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AdvancedNameServerSettings.qml b/src/settingsview/components/AdvancedNameServerSettings.qml
index 0843ba31a..2dcbede86 100644
--- a/src/settingsview/components/AdvancedNameServerSettings.qml
+++ b/src/settingsview/components/AdvancedNameServerSettings.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AdvancedOpenDHTSettings.qml b/src/settingsview/components/AdvancedOpenDHTSettings.qml
index f8b076185..655b1a3d2 100644
--- a/src/settingsview/components/AdvancedOpenDHTSettings.qml
+++ b/src/settingsview/components/AdvancedOpenDHTSettings.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AdvancedPublicAddressSettings.qml b/src/settingsview/components/AdvancedPublicAddressSettings.qml
index 552cb8657..7525d6e4d 100644
--- a/src/settingsview/components/AdvancedPublicAddressSettings.qml
+++ b/src/settingsview/components/AdvancedPublicAddressSettings.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AdvancedSDPSettings.qml b/src/settingsview/components/AdvancedSDPSettings.qml
index 59862b54e..76032a958 100644
--- a/src/settingsview/components/AdvancedSDPSettings.qml
+++ b/src/settingsview/components/AdvancedSDPSettings.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AdvancedSIPSecuritySettings.qml b/src/settingsview/components/AdvancedSIPSecuritySettings.qml
index 237c1bb5d..933cc12dc 100644
--- a/src/settingsview/components/AdvancedSIPSecuritySettings.qml
+++ b/src/settingsview/components/AdvancedSIPSecuritySettings.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AdvancedSettings.qml b/src/settingsview/components/AdvancedSettings.qml
index c1c735935..753502db0 100644
--- a/src/settingsview/components/AdvancedSettings.qml
+++ b/src/settingsview/components/AdvancedSettings.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AdvancedVoiceMailSettings.qml b/src/settingsview/components/AdvancedVoiceMailSettings.qml
index b01269878..c079fb0dc 100644
--- a/src/settingsview/components/AdvancedVoiceMailSettings.qml
+++ b/src/settingsview/components/AdvancedVoiceMailSettings.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AudioSettings.qml b/src/settingsview/components/AudioSettings.qml
index 34649f314..fb416e540 100644
--- a/src/settingsview/components/AudioSettings.qml
+++ b/src/settingsview/components/AudioSettings.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/AvSettingPage.qml b/src/settingsview/components/AvSettingPage.qml
index 52cd2b50f..76eadd545 100644
--- a/src/settingsview/components/AvSettingPage.qml
+++ b/src/settingsview/components/AvSettingPage.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/BannedContacts.qml b/src/settingsview/components/BannedContacts.qml
index e86281a39..4da3bec12 100644
--- a/src/settingsview/components/BannedContacts.qml
+++ b/src/settingsview/components/BannedContacts.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -100,7 +100,7 @@ ColumnLayout {
         }
     }
 
-    ListViewJami {
+    JamiListView {
         id: bannedListWidget
 
         Layout.fillWidth: true
diff --git a/src/settingsview/components/ChatviewSettings.qml b/src/settingsview/components/ChatviewSettings.qml
index 660807e66..85dc572ef 100644
--- a/src/settingsview/components/ChatviewSettings.qml
+++ b/src/settingsview/components/ChatviewSettings.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/ContactItemDelegate.qml b/src/settingsview/components/ContactItemDelegate.qml
index 7418ad035..f7814aac6 100644
--- a/src/settingsview/components/ContactItemDelegate.qml
+++ b/src/settingsview/components/ContactItemDelegate.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/settingsview/components/CurrentAccountSettings.qml b/src/settingsview/components/CurrentAccountSettings.qml
index d1189acb1..d71b5cc32 100644
--- a/src/settingsview/components/CurrentAccountSettings.qml
+++ b/src/settingsview/components/CurrentAccountSettings.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import Qt.labs.platform 1.1
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt.labs.platform
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/DeviceItemDelegate.qml b/src/settingsview/components/DeviceItemDelegate.qml
index b209c4fd2..ea5429c90 100644
--- a/src/settingsview/components/DeviceItemDelegate.qml
+++ b/src/settingsview/components/DeviceItemDelegate.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/FileTransferSettings.qml b/src/settingsview/components/FileTransferSettings.qml
index 64eb8cbe6..b7224a300 100644
--- a/src/settingsview/components/FileTransferSettings.qml
+++ b/src/settingsview/components/FileTransferSettings.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Enums 1.1
diff --git a/src/settingsview/components/GeneralSettingsPage.qml b/src/settingsview/components/GeneralSettingsPage.qml
index 0b913dc49..e55c0975c 100644
--- a/src/settingsview/components/GeneralSettingsPage.qml
+++ b/src/settingsview/components/GeneralSettingsPage.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/JamiUserIdentity.qml b/src/settingsview/components/JamiUserIdentity.qml
index 29f2b05df..416728598 100644
--- a/src/settingsview/components/JamiUserIdentity.qml
+++ b/src/settingsview/components/JamiUserIdentity.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/KeyBoardShortcutKey.qml b/src/settingsview/components/KeyBoardShortcutKey.qml
deleted file mode 100644
index 2189283e0..000000000
--- a/src/settingsview/components/KeyBoardShortcutKey.qml
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2019-2020 by Savoir-faire Linux
- * Author: Mingrui Zhang   <mingrui.zhang@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
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-import QtQuick 2.15
-
-import net.jami.Constants 1.1
-
-Item {
-    property alias text: shortcutText.text
-    Rectangle{
-        id: keyRect
-        width: t_metrics.tightBoundingRect.width + 10
-        height: t_metrics.tightBoundingRect.height + 10
-        color: JamiTheme.buttonTintedGrey
-        radius: 5
-        anchors.centerIn: parent
-        Text {
-            id : shortcutText
-            anchors.centerIn: parent
-            anchors.leftMargin: 10
-            font.family: "Arial"
-            font.pointSize: 12
-            color: JamiTheme.whiteColor
-        }
-        TextMetrics {
-            id:     t_metrics
-            font:   shortcutText.font
-            text:   shortcutText.text
-        }
-    }
-}
diff --git a/src/settingsview/components/KeyBoardShortcutTable.qml b/src/settingsview/components/KeyBoardShortcutTable.qml
deleted file mode 100644
index bd9d4b917..000000000
--- a/src/settingsview/components/KeyBoardShortcutTable.qml
+++ /dev/null
@@ -1,624 +0,0 @@
-/*
- * Copyright (C) 2019-2020 by Savoir-faire Linux
- * Author: Mingrui Zhang   <mingrui.zhang@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
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Controls 1.4
-import QtQuick.Controls.Styles 1.4
-import QtQuick.Layouts 1.15
-
-import net.jami.Models 1.1
-import net.jami.Constants 1.1
-
-import "../../commoncomponents"
-
-BaseDialog {
-    id: root
-
-    visible: false
-    title: qsTr("Shortcuts")
-
-    contentItem: Rectangle {
-        id: shortcutsTableContentRect
-
-        implicitWidth: 800
-        implicitHeight: 600
-        color: JamiTheme.backgroundColor
-
-        ListModel {
-            id: keyboardGeneralShortcutsModel
-            ListElement {
-                Shortcut: "Ctrl+J"
-                Description: qsTr("Open account list")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "Ctrl+L"
-                Description: qsTr("Focus conversations list")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "Ctrl+R"
-                Description: qsTr("Requests list")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "Ctrl+↑"
-                Description: qsTr("Previous conversation")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "Ctrl+↓"
-                Description: qsTr("Next conversation")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "Ctrl+F"
-                Description: qsTr("Search bar")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "F11"
-                Description: qsTr("Fullscreen")
-                KeyLength: 1
-            }
-        }
-        ListModel {
-            id: keyboardConversationShortcutsModel
-            ListElement {
-                Shortcut: "Ctrl+Shift+C"
-                Description: qsTr("Start an audio call")
-                KeyLength: 3
-            }
-            ListElement {
-                Shortcut: "Ctrl+Shift+X"
-                Description: qsTr("Start a video call")
-                KeyLength: 3
-            }
-            ListElement {
-                Shortcut: "Ctrl+Shift+L"
-                Description: qsTr("Clear history")
-                KeyLength: 3
-            }
-            ListElement {
-                Shortcut: "Ctrl+Shift+B"
-                Description: qsTr("Block contact")
-                KeyLength: 3
-            }
-            ListElement {
-                Shortcut: "Ctrl+Shift+Delete"
-                Description: qsTr("Remove conversation")
-                KeyLength: 3
-            }
-            ListElement {
-                Shortcut: "Shift+Ctrl+A"
-                Description: qsTr("Accept contact request")
-                KeyLength: 3
-            }
-        }
-        ListModel {
-            id: keyboardSettingsShortcutsModel
-            ListElement {
-                Shortcut: "Ctrl+M"
-                Description: qsTr("Media settings")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "Ctrl+G"
-                Description: qsTr("General settings")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "Ctrl+I"
-                Description: qsTr("Account settings")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "Ctrl+Shift+N"
-                Description: qsTr("Open account creation wizard")
-                KeyLength: 3
-            }
-            ListElement {
-                Shortcut: "F10"
-                Description: qsTr("Open window")
-                KeyLength: 1
-            }
-        }
-        ListModel {
-            id: keyboardCallsShortcutsModel
-            ListElement {
-                Shortcut: "Ctrl+Y"
-                Description: qsTr("Answer an incoming call")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "Ctrl+D"
-                Description: qsTr("End call")
-                KeyLength: 2
-            }
-            ListElement {
-                Shortcut: "Ctrl+Shift+D"
-                Description: qsTr("Decline the call request")
-                KeyLength: 2
-            }
-        }
-        Component {
-            id: shortcutDelegateWithThreeKeys
-
-            Rectangle {
-                id: cellRectWithThreeKeys
-
-                implicitWidth: JamiTheme.mainViewMinWidth / 2
-                implicitHeight: 50
-                anchors.left: parent.left
-                anchors.leftMargin: 20
-                color: JamiTheme.backgroundColor
-                border.color: JamiTheme.backgroundColor
-
-                Rectangle {
-                    id: containerRectWithThreeKeys
-
-                    implicitWidth: parent.width - 10
-                    implicitHeight: 50
-
-                    anchors.horizontalCenter: parent.horizontalCenter
-                    anchors.verticalCenter: parent.verticalCenter
-                    color: JamiTheme.backgroundColor
-
-                    Component.onCompleted: {
-                        var componentKeyOne = Qt.createComponent("KeyBoardShortcutKey.qml")
-                        if (componentKeyOne.status === Component.Ready) {
-                            var objectKeyOne = componentKeyOne.createObject(containerRectWithThreeKeys)
-                            objectKeyOne.anchors.verticalCenter = containerRectWithThreeKeys.verticalCenter
-                            objectKeyOne.anchors.left = containerRectWithThreeKeys.left
-                            objectKeyOne.text = Qt.binding(function() { return modelData.Shortcut.split("+")[0] })
-                        }
-                        if (modelData.Shortcut.split("+").length === 1)
-                            return
-                        var componentPlusSign = Qt.createQmlObject('import QtQuick 2.0;' +
-                                                                'Text {anchors.verticalCenter: containerRectWithThreeKeys.verticalCenter;' +
-                                                                'anchors.verticalCenterOffset: -2;' +
-                                                                'anchors.left: containerRectWithThreeKeys.left;' +
-                                                                'anchors.leftMargin: 30;' +
-                                                                'font.bold: true;' +
-                                                                'font.pointSize : 12;' +
-                                                                'text: "+"}',
-                                                                containerRectWithThreeKeys)
-                        componentPlusSign.color = Qt.binding(function() { return JamiTheme.textColor })
-                        var componentKeyTwo = Qt.createComponent("KeyBoardShortcutKey.qml")
-                        if (componentKeyTwo.status === Component.Ready) {
-                            var objectKeyTwo = componentKeyTwo.createObject(containerRectWithThreeKeys)
-                            objectKeyTwo.anchors.verticalCenter = containerRectWithThreeKeys.verticalCenter
-                            objectKeyTwo.anchors.left = containerRectWithThreeKeys.left
-                            objectKeyTwo.anchors.leftMargin = componentPlusSign.anchors.leftMargin + 42
-                            objectKeyTwo.text = Qt.binding(function() { return modelData.Shortcut.split("+")[1] })
-                        }
-
-                        if (modelData.Shortcut.split("+").length === 2)
-                            return
-                        var componentPlusSignTwo = Qt.createQmlObject('import QtQuick 2.0;' +
-                                                                    'Text {anchors.verticalCenter: containerRectWithThreeKeys.verticalCenter;' +
-                                                                    'anchors.verticalCenterOffset: -2;' +
-                                                                    'anchors.left: containerRectWithThreeKeys.left;' +
-                                                                    'anchors.leftMargin: 97;' +
-                                                                    'font.bold: true;' +
-                                                                    'font.pointSize : 12;' +
-                                                                    'text: "+"}',
-                                                                    containerRectWithThreeKeys)
-                        componentPlusSignTwo.color = Qt.binding(function() { return JamiTheme.textColor })
-                        var componentKeyThree = Qt.createComponent("KeyBoardShortcutKey.qml")
-                        if (componentKeyThree.status === Component.Ready) {
-                            var objectKeyThree = componentKeyThree.createObject(containerRectWithThreeKeys)
-                            objectKeyThree.anchors.verticalCenter = containerRectWithThreeKeys.verticalCenter
-                            objectKeyThree.anchors.left = containerRectWithThreeKeys.left
-                            objectKeyThree.anchors.leftMargin = componentPlusSignTwo.anchors.leftMargin + 35
-                            objectKeyThree.text = Qt.binding(function() { return modelData.Shortcut.split("+")[2] })
-                        }
-                    }
-                }
-            }
-        }
-        Component {
-            id: descriptionDelegate
-
-            Rectangle {
-                implicitWidth: root.width / 2
-                implicitHeight: 50
-
-                color: JamiTheme.backgroundColor
-                border.color: JamiTheme.backgroundColor
-                Text {
-                    id : descriptionText
-                    anchors.verticalCenter: parent.verticalCenter
-                    anchors.left: parent.left
-                    anchors.leftMargin: 10
-                    font.family: "Arial"
-                    font.pointSize: JamiTheme.textFontSize
-                    text: styleData.value
-                    color: JamiTheme.textColor
-                }
-            }
-        }
-
-        Column {
-            spacing: 2
-            id: columnAll
-            anchors.rightMargin: 20
-            anchors.leftMargin: 20
-            anchors.bottomMargin: 20
-            anchors.topMargin: 50
-
-            width: JamiTheme.mainViewMinWidth
-            height: JamiTheme.mainViewMinHeight - 100
-            anchors.fill: parent
-
-            StackLayout {
-                // pages
-                implicitWidth: parent.width
-                implicitHeight: parent.height - tabBar.height
-                currentIndex: tabBar.currentIndex
-                Item {
-                    id: tabOne
-                    Rectangle {
-                        implicitWidth: parent.width / 2
-                        implicitHeight: parent.height
-                        anchors.left: parent.left
-                        TableView {
-                            id: generalTableView
-                            anchors.fill: parent
-                            horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
-                            frameVisible: false
-                            TableViewColumn {
-                                role: "Description"
-                                width: generalTableView.width / 2
-                                delegate: descriptionDelegate
-                            }
-                            TableViewColumn {
-                                role: "Shortcut"
-                                width: generalTableView.width / 2
-                                delegate: Component{
-                                    Loader {
-                                        property variant modelData: model
-                                        sourceComponent: shortcutDelegateWithThreeKeys
-                                        asynchronous: true
-                                    }
-                                }
-                            }
-                            model: keyboardGeneralShortcutsModel
-                            rowDelegate: Rectangle {
-                                height: 50
-                                color: JamiTheme.backgroundColor
-                            }
-                            style: TableViewStyle {
-                                backgroundColor: JamiTheme.backgroundColor
-                                alternateBackgroundColor: JamiTheme.backgroundColor
-                                headerDelegate: Rectangle {
-                                    // Only first column's header is shown
-                                    height: [t_metrics_general.tightBoundingRect.height + 10, 0][styleData.column % 2]
-                                    width: [parent.width, 0][styleData.column % 2]
-                                    color: JamiTheme.backgroundColor
-                                    radius: 4
-                                    anchors.top: parent.top
-                                    anchors.topMargin: 5
-                                    Text {
-                                        id : generalShortcutText
-                                        anchors.verticalCenter: parent.verticalCenter
-                                        anchors.left: parent.left
-                                        anchors.leftMargin: 10
-                                        font.family: "Arial"
-                                        font.pointSize: JamiTheme.headerFontSize
-                                        text: styleData.column % 2 ? "" : "General"
-                                        color: JamiTheme.textColor
-                                    }
-                                    TextMetrics {
-                                        id:     t_metrics_general
-                                        font:   generalShortcutText.font
-                                        text:   generalShortcutText.text
-                                    }
-                                }
-                            }
-                        }
-                    }
-                    Rectangle {
-                        implicitWidth: parent.width / 2
-                        implicitHeight: parent.height
-                        anchors.right: parent.right
-                        TableView {
-                            id: conversationsTableView
-                            anchors.fill: parent
-                            horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
-                            frameVisible: false
-                            TableViewColumn {
-                                role: "Description"
-                                width: conversationsTableView.width / 2
-                                delegate: descriptionDelegate
-                            }
-                            TableViewColumn {
-                                role: "Shortcut"
-                                width: conversationsTableView.width / 2
-                                delegate: Component{
-                                    Loader {
-                                        property variant modelData: model
-                                        sourceComponent: shortcutDelegateWithThreeKeys
-                                        asynchronous: true
-                                    }
-                                }
-                            }
-                            model: keyboardConversationShortcutsModel
-                            rowDelegate: Rectangle {
-                                height: 50
-                                color: JamiTheme.backgroundColor
-                            }
-                            style: TableViewStyle {
-                                backgroundColor: JamiTheme.backgroundColor
-                                alternateBackgroundColor: JamiTheme.backgroundColor
-                                headerDelegate: Rectangle {
-                                    // Only first column's header is shown
-                                    height: [t_metrics_conversations.tightBoundingRect.height + 10, 0][styleData.column % 2]
-                                    width: [parent.width, 0][styleData.column % 2]
-                                    color: JamiTheme.backgroundColor
-                                    radius: 4
-                                    anchors.top: parent.top
-                                    anchors.topMargin: 5
-                                    Text {
-                                        id : conversationsShortcutText
-                                        anchors.verticalCenter: parent.verticalCenter
-                                        anchors.left: parent.left
-                                        anchors.leftMargin: 10
-                                        font.family: "Arial"
-                                        font.pointSize: JamiTheme.headerFontSize
-                                        text: styleData.column % 2 ? "" : JamiStrings.conversations
-                                        color: JamiTheme.textColor
-                                    }
-                                    TextMetrics {
-                                        id:     t_metrics_conversations
-                                        font:   conversationsShortcutText.font
-                                        text:   conversationsShortcutText.text
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-                Item {
-                    id: tabTwo
-                    Rectangle {
-                        implicitWidth: parent.width / 2
-                        implicitHeight: parent.height
-                        anchors.left: parent.left
-                        TableView {
-                            id: callsTableView
-                            anchors.fill: parent
-                            horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
-                            frameVisible: false
-                            TableViewColumn {
-                                role: "Description"
-                                width: callsTableView.width / 2
-                                delegate: descriptionDelegate
-                            }
-                            TableViewColumn {
-                                role: "Shortcut"
-                                width: callsTableView.width / 2
-                                delegate: Component{
-                                    Loader {
-                                        property variant modelData: model
-                                        sourceComponent: shortcutDelegateWithThreeKeys
-                                        asynchronous: true
-                                    }
-                                }
-                            }
-                            model: keyboardCallsShortcutsModel
-                            rowDelegate: Rectangle {
-                                height: 50
-                                color: JamiTheme.backgroundColor
-                            }
-                            style: TableViewStyle {
-                                backgroundColor: JamiTheme.backgroundColor
-                                alternateBackgroundColor: JamiTheme.backgroundColor
-                                headerDelegate: Rectangle {
-                                    // Only first column's header is shown
-                                    height: [t_metrics_calls.tightBoundingRect.height + 10, 0][styleData.column % 2]
-                                    width: [parent.width, 0][styleData.column % 2]
-                                    color: JamiTheme.backgroundColor
-                                    radius: 4
-                                    anchors.top: parent.top
-                                    anchors.topMargin: 5
-                                    Text {
-                                        id : callsShortcutText
-                                        anchors.verticalCenter: parent.verticalCenter
-                                        anchors.left: parent.left
-                                        anchors.leftMargin: 10
-                                        font.family: "Arial"
-                                        font.pointSize: 12
-                                        text: styleData.column % 2 ? "" : "Calls"
-                                        color: JamiTheme.textColor
-                                    }
-                                    // make sure that calls and settings header are parallel
-                                    TextMetrics {
-                                        id:     t_metrics_calls
-                                        font:   callsShortcutText.font
-                                        text:   "Settings"
-                                    }
-                                }
-                            }
-                        }
-                    }
-                    Rectangle {
-                        implicitWidth: parent.width / 2
-                        implicitHeight: parent.height
-                        anchors.right: parent.right
-                        TableView {
-                            id: settingsTableView
-                            anchors.fill: parent
-                            horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
-                            frameVisible: false
-                            TableViewColumn {
-                                role: "Description"
-                                width: settingsTableView.width / 2
-                                delegate: descriptionDelegate
-                            }
-                            TableViewColumn {
-                                role: "Shortcut"
-                                width: settingsTableView.width / 2
-                                delegate: Component{
-                                    Loader {
-                                        property variant modelData: model
-                                        sourceComponent: shortcutDelegateWithThreeKeys
-                                        asynchronous: true
-                                    }
-                                }
-                            }
-                            model: keyboardSettingsShortcutsModel
-                            rowDelegate: Rectangle {
-                                height: 50
-                                color: JamiTheme.backgroundColor
-                            }
-                            style: TableViewStyle {
-                                backgroundColor: JamiTheme.backgroundColor
-                                alternateBackgroundColor: JamiTheme.backgroundColor
-                                headerDelegate: Rectangle {
-                                    // Only first column's header is shown
-                                    height: [t_metrics_settings.tightBoundingRect.height + 10, 0][styleData.column % 2]
-                                    width: [parent.width, 0][styleData.column % 2]
-                                    color: JamiTheme.backgroundColor
-                                    radius: 4
-                                    anchors.top: parent.top
-                                    anchors.topMargin: 5
-                                    Text {
-                                        id : settingsShortcutText
-                                        anchors.verticalCenter: parent.verticalCenter
-                                        anchors.left: parent.left
-                                        anchors.leftMargin: 10
-                                        font.family: "Arial"
-                                        font.pointSize: 12
-                                        text: styleData.column % 2 ? "" : "Settings"
-                                        color: JamiTheme.textColor
-                                    }
-                                    TextMetrics {
-                                        id:     t_metrics_settings
-                                        font:   settingsShortcutText.font
-                                        text:   settingsShortcutText.text
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        TabBar {
-            id: tabBar
-            anchors.horizontalCenter: parent.horizontalCenter
-
-            anchors.bottom: parent.bottom
-            anchors.bottomMargin: parent.height - 500  // Forced postion below table
-
-            width: JamiTheme.preferredFieldWidth * 2
-            height: JamiTheme.preferredFieldHeight
-            background: Rectangle { color: "transparent" }
-
-            currentIndex: 0
-            TabButton {
-                id: pageOne
-                width: JamiTheme.preferredFieldWidth
-                text: "1"
-                down: true
-                // customize tab button
-                contentItem: Text {
-                    text: pageOne.text
-                    font: pageOne.font
-                    opacity: enabled ? 1.0 : 0.3
-                    horizontalAlignment: Text.AlignHCenter
-                    verticalAlignment: Text.AlignVCenter
-                    elide: Text.ElideRight
-                    color: JamiTheme.textColor
-                }
-                // customize tab button
-                background: Rectangle {
-                    id: buttonRectOne
-                    implicitWidth: JamiTheme.preferredFieldWidth
-                    implicitHeight: JamiTheme.preferredFieldHeight
-                    radius: 4
-                    color: pageOne.down ? JamiTheme.selectedColor : "transparent"
-                    MouseArea {
-                        anchors.fill: parent
-                        hoverEnabled: true
-                        onPressed: { buttonRectOne.color = JamiTheme.pressColor; tabBar.currentIndex = 0; pageOne.down = true; pageTwo.down = false;}
-                        onReleased: { buttonRectOne.color = JamiTheme.selectedColor; }
-                        onEntered: { buttonRectOne.color = JamiTheme.hoverColor; }
-                        onExited: { buttonRectOne.color = Qt.binding(function() { return pageOne.down ? JamiTheme.selectedColor : "transparent" }); }
-                    }
-                }
-            }
-            TabButton {
-                id: pageTwo
-                text: "2"
-                width: JamiTheme.preferredFieldWidth
-                contentItem: Text {
-                    text: pageTwo.text
-                    font: pageTwo.font
-                    opacity: enabled ? 1.0 : 0.3
-                    horizontalAlignment: Text.AlignHCenter
-                    verticalAlignment: Text.AlignVCenter
-                    elide: Text.ElideRight
-                    color: JamiTheme.textColor
-                }
-
-                background: Rectangle {
-                    id: buttonRectTwo
-                    implicitWidth: JamiTheme.preferredFieldWidth
-                    implicitHeight: JamiTheme.preferredFieldHeight
-
-                    radius: 4
-                    color: pageTwo.down ? JamiTheme.selectedColor : "transparent"
-                    MouseArea {
-                        anchors.fill: parent
-                        hoverEnabled: true
-                        onPressed: { buttonRectTwo.color = JamiTheme.pressColor; tabBar.currentIndex = 1; pageTwo.down = true; pageOne.down = false;}
-                        onReleased: { buttonRectTwo.color = JamiTheme.selectedColor; }
-                        onEntered: { buttonRectTwo.color = JamiTheme.hoverColor; }
-                        onExited: { buttonRectTwo.color = Qt.binding(function() { return pageTwo.down ? JamiTheme.selectedColor : "transparent" }); }
-                    }
-                }
-            }
-        }
-
-        MaterialButton {
-            id: btnClose
-
-            anchors.bottom: parent.bottom
-            anchors.bottomMargin: JamiTheme.preferredMarginSize
-            anchors.horizontalCenter: parent.horizontalCenter
-
-            preferredWidth: JamiTheme.preferredFieldWidth / 2
-            preferredHeight: JamiTheme.preferredFieldHeight
-
-            color: JamiTheme.buttonTintedBlack
-            hoveredColor: JamiTheme.buttonTintedBlackHovered
-            pressedColor: JamiTheme.buttonTintedBlackPressed
-            outlined: true
-
-            text: JamiStrings.close
-
-            onClicked: {
-                close()
-            }
-        }
-    }
-}
diff --git a/src/settingsview/components/LevelMeter.qml b/src/settingsview/components/LevelMeter.qml
index aa5ead412..0968d0aec 100644
--- a/src/settingsview/components/LevelMeter.qml
+++ b/src/settingsview/components/LevelMeter.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -34,9 +34,9 @@ ProgressBar {
     onVisibleChanged: {
         if (visible) {
             rmsLevel = 0
-            AvAdapter.startAudioMeter(true)
+            AvAdapter.startAudioMeter()
         } else
-            AvAdapter.stopAudioMeter(true)
+            AvAdapter.stopAudioMeter()
     }
 
     function clamp(num, a, b) {
diff --git a/src/settingsview/components/LinkDeviceDialog.qml b/src/settingsview/components/LinkDeviceDialog.qml
index 7be430dfd..1cdff81e3 100644
--- a/src/settingsview/components/LinkDeviceDialog.qml
+++ b/src/settingsview/components/LinkDeviceDialog.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/LinkedDevices.qml b/src/settingsview/components/LinkedDevices.qml
index f091f467b..a35eacede 100644
--- a/src/settingsview/components/LinkedDevices.qml
+++ b/src/settingsview/components/LinkedDevices.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -75,7 +75,7 @@ ColumnLayout {
         font.kerning: true
     }
 
-    ListViewJami {
+    JamiListView {
         id: settingsListView
 
         Layout.fillWidth: true
diff --git a/src/settingsview/components/LogsView.qml b/src/settingsview/components/LogsView.qml
index bd28ef848..98edfb607 100644
--- a/src/settingsview/components/LogsView.qml
+++ b/src/settingsview/components/LogsView.qml
@@ -16,10 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Dialogs 1.2
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -89,10 +88,9 @@ Dialog {
     }
 
     title: JamiStrings.logsViewTitle
-    modality: Qt.NonModal
     width: 800
     height: 700
-    standardButtons: StandardButton.NoButton
+    standardButtons: Dialog.NoButton
 
     ColumnLayout {
 
diff --git a/src/settingsview/components/MediaCodecDelegate.qml b/src/settingsview/components/MediaCodecDelegate.qml
index 41cf1b182..afde87c07 100644
--- a/src/settingsview/components/MediaCodecDelegate.qml
+++ b/src/settingsview/components/MediaCodecDelegate.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/settingsview/components/MediaSettings.qml b/src/settingsview/components/MediaSettings.qml
index 614133db9..ce3b4400b 100644
--- a/src/settingsview/components/MediaSettings.qml
+++ b/src/settingsview/components/MediaSettings.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -100,7 +100,7 @@ ColumnLayout {
         }
     }
 
-    ListViewJami {
+    JamiListView {
         id: mediaListWidget
 
         Layout.fillWidth: true
diff --git a/src/settingsview/components/NameRegistrationDialog.qml b/src/settingsview/components/NameRegistrationDialog.qml
index c617f73c6..96d62ed7e 100644
--- a/src/settingsview/components/NameRegistrationDialog.qml
+++ b/src/settingsview/components/NameRegistrationDialog.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/PluginItemDelegate.qml b/src/settingsview/components/PluginItemDelegate.qml
index 258bfcf11..45bbdf74d 100644
--- a/src/settingsview/components/PluginItemDelegate.qml
+++ b/src/settingsview/components/PluginItemDelegate.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/PluginListPreferencesView.qml b/src/settingsview/components/PluginListPreferencesView.qml
index 3195e2554..5152197d5 100644
--- a/src/settingsview/components/PluginListPreferencesView.qml
+++ b/src/settingsview/components/PluginListPreferencesView.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
diff --git a/src/settingsview/components/PluginListSettingsView.qml b/src/settingsview/components/PluginListSettingsView.qml
index f3b7d9a4a..ce6f773ac 100644
--- a/src/settingsview/components/PluginListSettingsView.qml
+++ b/src/settingsview/components/PluginListSettingsView.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import Qt.labs.platform 1.1
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt.labs.platform
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/PluginSettingsPage.qml b/src/settingsview/components/PluginSettingsPage.qml
index 758cc7c71..7e68452f3 100644
--- a/src/settingsview/components/PluginSettingsPage.qml
+++ b/src/settingsview/components/PluginSettingsPage.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
diff --git a/src/settingsview/components/RecordingSettings.qml b/src/settingsview/components/RecordingSettings.qml
index 962290470..3ef714318 100644
--- a/src/settingsview/components/RecordingSettings.qml
+++ b/src/settingsview/components/RecordingSettings.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import Qt.labs.platform 1.1
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt.labs.platform
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/RevokeDevicePasswordDialog.qml b/src/settingsview/components/RevokeDevicePasswordDialog.qml
index 23a5b50cd..e5e4362c0 100644
--- a/src/settingsview/components/RevokeDevicePasswordDialog.qml
+++ b/src/settingsview/components/RevokeDevicePasswordDialog.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Constants 1.1
 
diff --git a/src/settingsview/components/SIPUserIdentity.qml b/src/settingsview/components/SIPUserIdentity.qml
index 083f0a85b..7adfab3db 100644
--- a/src/settingsview/components/SIPUserIdentity.qml
+++ b/src/settingsview/components/SIPUserIdentity.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/SettingMaterialButton.qml b/src/settingsview/components/SettingMaterialButton.qml
index aed909d1a..876885e90 100644
--- a/src/settingsview/components/SettingMaterialButton.qml
+++ b/src/settingsview/components/SettingMaterialButton.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/SettingSpinBox.qml b/src/settingsview/components/SettingSpinBox.qml
index eb03538de..56069591e 100644
--- a/src/settingsview/components/SettingSpinBox.qml
+++ b/src/settingsview/components/SettingSpinBox.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/SettingsComboBox.qml b/src/settingsview/components/SettingsComboBox.qml
index 63a4f7b76..afb71b4de 100644
--- a/src/settingsview/components/SettingsComboBox.qml
+++ b/src/settingsview/components/SettingsComboBox.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Constants 1.1
 
diff --git a/src/settingsview/components/SettingsHeader.qml b/src/settingsview/components/SettingsHeader.qml
index d8d46a04d..1189db39b 100644
--- a/src/settingsview/components/SettingsHeader.qml
+++ b/src/settingsview/components/SettingsHeader.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/settingsview/components/SettingsMaterialLineEdit.qml b/src/settingsview/components/SettingsMaterialLineEdit.qml
index 77b0c53f1..ddf7a1d74 100644
--- a/src/settingsview/components/SettingsMaterialLineEdit.qml
+++ b/src/settingsview/components/SettingsMaterialLineEdit.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/SettingsMenu.qml b/src/settingsview/components/SettingsMenu.qml
index 8045dca56..98d9e3bca 100644
--- a/src/settingsview/components/SettingsMenu.qml
+++ b/src/settingsview/components/SettingsMenu.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/settingsview/components/SystemSettings.qml b/src/settingsview/components/SystemSettings.qml
index 5ac2f213f..ad994fd7b 100644
--- a/src/settingsview/components/SystemSettings.qml
+++ b/src/settingsview/components/SystemSettings.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import Qt.labs.platform 1.1
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt.labs.platform
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/ToggleSwitch.qml b/src/settingsview/components/ToggleSwitch.qml
index 2a6e0bb0c..d839c0a20 100644
--- a/src/settingsview/components/ToggleSwitch.qml
+++ b/src/settingsview/components/ToggleSwitch.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Constants 1.1
 
diff --git a/src/settingsview/components/TroubleshootSettings.qml b/src/settingsview/components/TroubleshootSettings.qml
index a8bec519c..81a62ed2b 100644
--- a/src/settingsview/components/TroubleshootSettings.qml
+++ b/src/settingsview/components/TroubleshootSettings.qml
@@ -16,9 +16,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/UpdateSettings.qml b/src/settingsview/components/UpdateSettings.qml
index 3793783e3..00be6e6ce 100644
--- a/src/settingsview/components/UpdateSettings.qml
+++ b/src/settingsview/components/UpdateSettings.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Adapters 1.1
 import net.jami.Enums 1.1
@@ -244,7 +244,7 @@ ColumnLayout {
         buttonTitles: [JamiStrings.optionCancel]
         buttonStyles: [SimpleMessageDialog.ButtonStyle.TintedBlue]
         buttonCallBacks: [function() {UpdateManager.cancelUpdate()}]
-        onVisibilityChanged: {
+        onVisibleChanged: {
             if (!visible)
                 UpdateManager.cancelUpdate()
         }
diff --git a/src/settingsview/components/UserIdentity.qml b/src/settingsview/components/UserIdentity.qml
index 5e573bece..c3aa218c0 100644
--- a/src/settingsview/components/UserIdentity.qml
+++ b/src/settingsview/components/UserIdentity.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/settingsview/components/VideoSettings.qml b/src/settingsview/components/VideoSettings.qml
index 064ed0a1f..9e8bb283e 100644
--- a/src/settingsview/components/VideoSettings.qml
+++ b/src/settingsview/components/VideoSettings.qml
@@ -16,10 +16,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import QtGraphicalEffects 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import Qt5Compat.GraphicalEffects
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/updatemanager.cpp b/src/updatemanager.cpp
index 1d5b3e923..88958d62d 100644
--- a/src/updatemanager.cpp
+++ b/src/updatemanager.cpp
@@ -32,6 +32,11 @@ static constexpr bool isBeta = false;
 #endif
 
 static constexpr int updatePeriod = 1000 * 60 * 60 * 24; // one day in millis
+static constexpr char downloadUrl[] = "https://dl.jami.net/windows";
+static constexpr char versionSubUrl[] = "/version";
+static constexpr char betaVersionSubUrl[] = "/beta/version";
+static constexpr char msiSubUrl[] = "/jami.release.x64.msi";
+static constexpr char betaMsiSubUrl[] = "/beta/jami.beta.x64.msi";
 
 UpdateManager::UpdateManager(const QString& url,
                              ConnectivityMonitor* cm,
@@ -39,7 +44,7 @@ UpdateManager::UpdateManager(const QString& url,
                              QObject* parent)
     : NetWorkManager(cm, parent)
     , lrcInstance_(instance)
-    , baseUrl_(url.isEmpty() ? "https://dl.jami.net/windows" : url.toLatin1())
+    , baseUrlString_(url.isEmpty() ? downloadUrl : url)
     , tempPath_(Utils::WinGetEnv("TEMP"))
     , updateTimer_(new QTimer(this))
 {
@@ -76,9 +81,8 @@ UpdateManager::checkForUpdates(bool quiet)
         connect(this, &NetWorkManager::errorOccured, this, &UpdateManager::updateCheckErrorOccurred);
 
     cleanUpdateFiles();
-    QUrl versionUrl {isBeta ? QUrl::fromEncoded(baseUrl_ + "/beta/version")
-                            : QUrl::fromEncoded(baseUrl_ + "/version")};
-
+    QUrl versionUrl {isBeta ? QUrl::fromUserInput(baseUrlString_ + betaVersionSubUrl)
+                            : QUrl::fromUserInput(baseUrlString_ + versionSubUrl)};
     get(versionUrl, [this, quiet](const QString& latestVersionString) {
         if (latestVersionString.isEmpty()) {
             qWarning() << "Error checking version";
@@ -122,8 +126,8 @@ UpdateManager::applyUpdates(bool beta)
         }
     });
 
-    QUrl downloadUrl {(beta || isBeta) ? QUrl::fromEncoded(baseUrl_ + "/beta/jami.beta.x64.msi")
-                                       : QUrl::fromEncoded(baseUrl_ + "/jami.release.x64.msi")};
+    QUrl downloadUrl {(beta || isBeta) ? QUrl::fromUserInput(baseUrlString_ + betaMsiSubUrl)
+                                       : QUrl::fromUserInput(baseUrlString_ + msiSubUrl)};
 
     get(
         downloadUrl,
diff --git a/src/updatemanager.h b/src/updatemanager.h
index 23edead43..14b8e3ccd 100644
--- a/src/updatemanager.h
+++ b/src/updatemanager.h
@@ -53,7 +53,7 @@ private:
     // LRCInstance pointer
     LRCInstance* lrcInstance_ {nullptr};
 
-    QByteArray baseUrl_;
+    QString baseUrlString_;
     QString tempPath_;
     QTimer* updateTimer_;
 
diff --git a/src/utils.cpp b/src/utils.cpp
index a903569b9..3d647c796 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -476,7 +476,7 @@ Utils::forceDeleteAsync(const QString& path)
      * Keep deleting file until the process holding it let go,
      * or the file itself does not exist anymore.
      */
-    QtConcurrent::run([path] {
+    auto futureResult = QtConcurrent::run([path] {
         QFile file(path);
         if (!QFile::exists(path))
             return;
@@ -499,7 +499,6 @@ Utils::getProjectCredits()
         return {};
     }
     QTextStream in(&projectCreditsFile);
-    in.setCodec("UTF-8");
     while (!in.atEnd()) {
         QString currentLine = in.readLine();
         if (currentLine.contains("Created by:")) {
@@ -637,12 +636,14 @@ Utils::fallbackAvatar(const QString& canonicalUri, const QString& name, const QS
     // if a letter was passed, then we paint a letter in the circle,
     // otherwise we draw the default avatar icon
     QString trimmedName(name);
-    if (!trimmedName.remove(QRegExp("[\\n\\t\\r]")).isEmpty()) {
+    if (!trimmedName.remove(QRegularExpression("[\\n\\t\\r]")).isEmpty()) {
         auto unicode = trimmedName.toUcs4().at(0);
         if (unicode >= 0x1F000 && unicode <= 0x1FFFF) {
             // emoticon
-            auto letter = QString::fromUcs4(&unicode, 1);
-            QFont font(QStringLiteral("Segoe UI Emoji"), avatar.height() / 2.66667, QFont::Medium);
+            auto letter = QString::fromUcs4(reinterpret_cast<char32_t*>(&unicode), 1);
+            QFont font(QString("Segoe UI Emoji").split(QLatin1Char(',')),
+                       avatar.height() / 2.66667,
+                       QFont::Medium);
             painter.setFont(font);
             QRect emojiRect(avatar.rect());
             emojiRect.moveTop(-6);
@@ -650,13 +651,17 @@ Utils::fallbackAvatar(const QString& canonicalUri, const QString& name, const QS
         } else if (unicode >= 0x0000 && unicode <= 0x00FF) {
             // basic Latin
             auto letter = trimmedName.at(0).toUpper();
-            QFont font("Arial", avatar.height() / 2.66667, QFont::Medium);
+            QFont font(QString("Arial").split(QLatin1Char(',')),
+                       avatar.height() / 2.66667,
+                       QFont::Medium);
             painter.setFont(font);
             painter.setPen(Qt::white);
             painter.drawText(avatar.rect(), QString(letter), QTextOption(Qt::AlignCenter));
         } else {
-            auto letter = QString::fromUcs4(&unicode, 1);
-            QFont font("Arial", avatar.height() / 2.66667, QFont::Medium);
+            auto letter = QString::fromUcs4(reinterpret_cast<char32_t*>(&unicode), 1);
+            QFont font(QString("Arial").split(QLatin1Char(',')),
+                       avatar.height() / 2.66667,
+                       QFont::Medium);
             painter.setFont(font);
             painter.setPen(Qt::white);
             painter.drawText(avatar.rect(), QString(letter), QTextOption(Qt::AlignCenter));
diff --git a/src/utilsadapter.cpp b/src/utilsadapter.cpp
index 2d470aa4b..13f552cd2 100644
--- a/src/utilsadapter.cpp
+++ b/src/utilsadapter.cpp
@@ -288,9 +288,11 @@ UtilsAdapter::getAbsPath(QString path)
     // contain 'file:///' for reasons we don't understand.
     // TODO: this logic can be refactored into the JamiFileDialog component.
 #ifdef Q_OS_WIN
-    return path.replace(QRegExp("^file:\\/{2,3}"), "").replace("\n", "").replace("\r", "");
+    return path.replace(QRegularExpression("^file:\\/{2,3}"), "").replace("\n", "").replace("\r", "");
 #else
-    return path.replace(QRegExp("^file:\\/{2,3}"), "/").replace("\n", "").replace("\r", "");
+    return path.replace(QRegularExpression("^file:\\/{2,3}"), "/")
+        .replace("\n", "")
+        .replace("\r", "");
 #endif
 }
 
diff --git a/src/wizardview/WizardView.qml b/src/wizardview/WizardView.qml
index eb4f48283..086de9917 100644
--- a/src/wizardview/WizardView.qml
+++ b/src/wizardview/WizardView.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -62,17 +62,13 @@ Rectangle {
         }
     }
 
-    ScrollView {
+    JamiFlickable {
         id: wizardViewScrollView
 
         property ScrollBar vScrollBar: ScrollBar.vertical
 
         anchors.fill: parent
 
-        ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
-        ScrollBar.vertical.policy: ScrollBar.AsNeeded
-
-        clip: true
         contentHeight: controlPanelStackView.height
 
         StackLayout {
diff --git a/src/wizardview/components/AccountCreationStepIndicator.qml b/src/wizardview/components/AccountCreationStepIndicator.qml
index fc897c3dd..5d0c96b3c 100644
--- a/src/wizardview/components/AccountCreationStepIndicator.qml
+++ b/src/wizardview/components/AccountCreationStepIndicator.qml
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
+import QtQuick
 
 import net.jami.Constants 1.1
 
diff --git a/src/wizardview/components/BackupKeyPage.qml b/src/wizardview/components/BackupKeyPage.qml
index 18efe4304..a73d2f6fc 100644
--- a/src/wizardview/components/BackupKeyPage.qml
+++ b/src/wizardview/components/BackupKeyPage.qml
@@ -17,10 +17,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
-import Qt.labs.platform 1.1
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
+import Qt.labs.platform
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/wizardview/components/ConnectToAccountManagerPage.qml b/src/wizardview/components/ConnectToAccountManagerPage.qml
index 03dcc6d82..00b0a3cb1 100644
--- a/src/wizardview/components/ConnectToAccountManagerPage.qml
+++ b/src/wizardview/components/ConnectToAccountManagerPage.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
@@ -123,6 +123,8 @@ Rectangle {
         }
 
         Label {
+            id: credentialsLabel
+
             Layout.alignment: Qt.AlignCenter
             Layout.preferredWidth: connectBtn.width
 
@@ -131,7 +133,8 @@ Rectangle {
             wrapMode: Text.Wrap
 
             onTextChanged: Layout.preferredHeight =
-                           JamiQmlUtils.getTextBoundingRect(font, text).height
+                           JamiQmlUtils.getTextBoundingRect(
+                               credentialsLabel.font, credentialsLabel.text).height
         }
 
         MaterialLineEdit {
diff --git a/src/wizardview/components/CreateAccountPage.qml b/src/wizardview/components/CreateAccountPage.qml
index 84765878e..f7aadc584 100644
--- a/src/wizardview/components/CreateAccountPage.qml
+++ b/src/wizardview/components/CreateAccountPage.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/src/wizardview/components/CreateSIPAccountPage.qml b/src/wizardview/components/CreateSIPAccountPage.qml
index 7b901326e..c9c539913 100644
--- a/src/wizardview/components/CreateSIPAccountPage.qml
+++ b/src/wizardview/components/CreateSIPAccountPage.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/src/wizardview/components/ImportFromBackupPage.qml b/src/wizardview/components/ImportFromBackupPage.qml
index 0deb16901..b1fd6cf0e 100644
--- a/src/wizardview/components/ImportFromBackupPage.qml
+++ b/src/wizardview/components/ImportFromBackupPage.qml
@@ -17,10 +17,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
-import Qt.labs.platform 1.1
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
+import Qt.labs.platform
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
@@ -158,7 +158,7 @@ Rectangle {
             color: JamiTheme.textColor
             wrapMode: Text.Wrap
 
-            onTextChanged: {
+            onTextChanged: function (text) {
                 var boundingRect = JamiQmlUtils.getTextBoundingRect(font, text)
                 preferredHeight += (boundingRect.width / fileImportBtn.preferredWidth)
                         * boundingRect.height
diff --git a/src/wizardview/components/ImportFromDevicePage.qml b/src/wizardview/components/ImportFromDevicePage.qml
index b7252c028..2f593f01c 100644
--- a/src/wizardview/components/ImportFromDevicePage.qml
+++ b/src/wizardview/components/ImportFromDevicePage.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
@@ -122,7 +122,7 @@ Rectangle {
             color: JamiTheme.textColor
             wrapMode: Text.Wrap
 
-            onTextChanged: {
+            onTextChanged: function (text) {
                 var boundingRect = JamiQmlUtils.getTextBoundingRect(font, text)
                 preferredHeight += (boundingRect.width / connectBtn.preferredWidth)
                         * boundingRect.height
diff --git a/src/wizardview/components/ProfilePage.qml b/src/wizardview/components/ProfilePage.qml
index be24841f2..631139385 100644
--- a/src/wizardview/components/ProfilePage.qml
+++ b/src/wizardview/components/ProfilePage.qml
@@ -17,9 +17,9 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
-import QtQuick.Controls 2.15
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
 
 import net.jami.Adapters 1.1
 import net.jami.Constants 1.1
diff --git a/src/wizardview/components/WelcomePage.qml b/src/wizardview/components/WelcomePage.qml
index c8c413020..2012e254f 100644
--- a/src/wizardview/components/WelcomePage.qml
+++ b/src/wizardview/components/WelcomePage.qml
@@ -18,8 +18,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.15
-import QtQuick.Layouts 1.15
+import QtQuick
+import QtQuick.Layouts
 
 import net.jami.Models 1.1
 import net.jami.Adapters 1.1
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index df4fce0fa..8904d5ec9 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,4 +1,4 @@
-find_package(Qt5 CONFIG REQUIRED QuickTest Test)
+find_package(Qt${QT_VERSION_MAJOR} CONFIG REQUIRED QuickTest Test)
 
 if(MSVC)
     # Download and unpack googletest for windows
@@ -15,7 +15,7 @@ else()
 endif()
 
 enable_testing(true)
-set(QML_TEST_LIBS ${QML_LIBS} Qt5::QuickTest Qt5::Test)
+set(QML_TEST_LIBS ${QML_LIBS} Qt::QuickTest Qt::Test)
 set(TESTS_INCLUDES
     ${CMAKE_SOURCE_DIR}/src
     ${CMAKE_SOURCE_DIR}/tests/qml
diff --git a/tests/qml/main.cpp b/tests/qml/main.cpp
index c6d486242..09f59be24 100644
--- a/tests/qml/main.cpp
+++ b/tests/qml/main.cpp
@@ -30,7 +30,9 @@
 #include <QtQuickTest/quicktest.h>
 #include <QQmlEngine>
 #include <QQmlContext>
-#include <QtWebEngine>
+#include <QFontDatabase>
+#include <QtWebEngineCore>
+#include <QtWebEngineQuick>
 
 #ifdef Q_OS_WIN
 #include <windows.h>
@@ -154,7 +156,7 @@ main(int argc, char** argv)
         argc = std::distance(argv, end);
     }
 
-    QtWebEngine::initialize();
+    QtWebEngineQuick::initialize();
 
     QTEST_SET_MAIN_SOURCE_PATH
     Setup setup(muteDring);
diff --git a/tests/qml/src/tst_ChatViewFooter.qml b/tests/qml/src/tst_ChatViewFooter.qml
index f4a7cc8f4..19f81df48 100644
--- a/tests/qml/src/tst_ChatViewFooter.qml
+++ b/tests/qml/src/tst_ChatViewFooter.qml
@@ -16,11 +16,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.14
-import QtQuick.Controls 2.14
-import QtQuick.Layouts 1.14
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
-import QtTest 1.2
+import QtTest
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/tests/qml/src/tst_FilesToSendContainer.qml b/tests/qml/src/tst_FilesToSendContainer.qml
index 42f42d400..e545a8376 100644
--- a/tests/qml/src/tst_FilesToSendContainer.qml
+++ b/tests/qml/src/tst_FilesToSendContainer.qml
@@ -16,11 +16,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.14
-import QtQuick.Controls 2.14
-import QtQuick.Layouts 1.14
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
-import QtTest 1.2
+import QtTest
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/tests/qml/src/tst_LocalAccount.qml b/tests/qml/src/tst_LocalAccount.qml
index d9627aaef..95da78438 100644
--- a/tests/qml/src/tst_LocalAccount.qml
+++ b/tests/qml/src/tst_LocalAccount.qml
@@ -17,8 +17,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.14
-import QtTest 1.2
+import QtQuick
+import QtTest
 
 import net.jami.Adapters 1.1
 
diff --git a/tests/qml/src/tst_PresenceIndicator.qml b/tests/qml/src/tst_PresenceIndicator.qml
index 10124cf39..d6a1c1638 100644
--- a/tests/qml/src/tst_PresenceIndicator.qml
+++ b/tests/qml/src/tst_PresenceIndicator.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.14
-import QtTest 1.2
+import QtQuick
+import QtTest
 
 import net.jami.Models 1.1
 import net.jami.Constants 1.1
diff --git a/tests/qml/src/tst_WizardView.qml b/tests/qml/src/tst_WizardView.qml
index cac2e4b7f..47b10eb05 100644
--- a/tests/qml/src/tst_WizardView.qml
+++ b/tests/qml/src/tst_WizardView.qml
@@ -16,8 +16,8 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-import QtQuick 2.14
-import QtTest 1.2
+import QtQuick
+import QtTest
 
 import net.jami.Adapters 1.1
 import net.jami.Models 1.1
diff --git a/tests/unittests/account_unittest.cpp b/tests/unittests/account_unittest.cpp
index 51b8e60ed..fc9032347 100644
--- a/tests/unittests/account_unittest.cpp
+++ b/tests/unittests/account_unittest.cpp
@@ -64,7 +64,7 @@ TEST_F(AccountFixture, CreateSIPAccountTest)
     EXPECT_EQ(accountAddedSpy.count(), 1);
 
     QList<QVariant> accountAddedArguments = accountAddedSpy.takeFirst();
-    EXPECT_TRUE(accountAddedArguments.at(0).type() == QVariant::String);
+    EXPECT_TRUE(accountAddedArguments.at(0).typeId() == qMetaTypeId<QString>());
 
     // Select the created account
     globalEnv.lrcInstance->set_currentAccountId(accountAddedArguments.at(0).toString());
diff --git a/tests/unittests/contact_unittest.cpp b/tests/unittests/contact_unittest.cpp
index 6a0fbf2f6..6ad0e003b 100644
--- a/tests/unittests/contact_unittest.cpp
+++ b/tests/unittests/contact_unittest.cpp
@@ -52,7 +52,7 @@ TEST_F(ContactFixture, AddSIPContactTest)
     EXPECT_EQ(accountAddedSpy.count(), 1);
 
     QList<QVariant> accountAddedArguments = accountAddedSpy.takeFirst();
-    EXPECT_TRUE(accountAddedArguments.at(0).type() == QVariant::String);
+    EXPECT_TRUE(accountAddedArguments.at(0).typeId() == qMetaTypeId<QString>());
 
     // Select the created account
     globalEnv.lrcInstance->set_currentAccountId(accountAddedArguments.at(0).toString());
@@ -75,7 +75,7 @@ TEST_F(ContactFixture, AddSIPContactTest)
     EXPECT_EQ(modelUpdatedSpy.count(), 1);
 
     QList<QVariant> modelUpdatedArguments = modelUpdatedSpy.takeFirst();
-    EXPECT_TRUE(modelUpdatedArguments.at(0).type() == QVariant::String);
+    EXPECT_TRUE(modelUpdatedArguments.at(0).typeId() == qMetaTypeId<QString>());
 
     // Get conversation id
     auto convId = globalEnv.lrcInstance
-- 
GitLab