diff --git a/src/controls/Button.qml b/src/controls/Button.qml
index 0e51b7a2961120d055ff082a2a897961b86672e0..0286077223315ecce23d8138386fb92c4a966435 100644
--- a/src/controls/Button.qml
+++ b/src/controls/Button.qml
@@ -114,7 +114,10 @@ BasicButton {
         interval: 10
         onTriggered: {
             __behavior.keyPressed = false
-            menu.__popup(0, button.height, 0)
+            if (Qt.application.layoutDirection === Qt.RightToLeft)
+                menu.__popup(button.width, button.height, 0)
+            else
+                menu.__popup(0, button.height, 0)
         }
     }
 }
diff --git a/src/controls/ComboBox.qml b/src/controls/ComboBox.qml
index 76a8442a7c20299dc2c16d79dcc1a56244a540aa..75af9844d0d74f7e0d8978ab7ac0af716ece2165 100644
--- a/src/controls/ComboBox.qml
+++ b/src/controls/ComboBox.qml
@@ -223,7 +223,10 @@ Control {
             if (items[__selectedIndex])
                 items[__selectedIndex].checked = true
             __currentIndex = comboBox.currentIndex
-            __popup(0, y, isPopup ? __selectedIndex : 0)
+            if (Qt.application.layoutDirection === Qt.RightToLeft)
+                __popup(comboBox.width, y, isPopup ? __selectedIndex : 0)
+            else
+                __popup(0, y, isPopup ? __selectedIndex : 0)
         }
     }
 
diff --git a/src/controls/Menu.qml b/src/controls/Menu.qml
index e89099db402750042747c7c1c4a62aa6126741fe..61c9daa9241c7e442a03885105e5bb58f21e1bc4 100644
--- a/src/controls/Menu.qml
+++ b/src/controls/Menu.qml
@@ -296,8 +296,12 @@ MenuPrivate {
 
                         function showSubMenu(immediately) {
                             if (immediately) {
-                                if (root.__currentIndex === menuItemIndex)
-                                    menuItem.__popup(menuFrameLoader.subMenuXPos, 0, -1)
+                                if (root.__currentIndex === menuItemIndex) {
+                                    if (Qt.application.layoutDirection === Qt.RightToLeft)
+                                        menuItem.__popup(0, 0, -1)
+                                    else
+                                        menuItem.__popup(menuFrameLoader.subMenuXPos, 0, -1)
+                                }
                             } else {
                                 openMenuTimer.start()
                             }
diff --git a/src/controls/MenuBar.qml b/src/controls/MenuBar.qml
index 65af1c124cda7eadc91e5299a7998a0294d42ff1..ea8844a9a006b9333e48ee7d6437bbd838fe0629 100644
--- a/src/controls/MenuBar.qml
+++ b/src/controls/MenuBar.qml
@@ -167,6 +167,8 @@ MenuBarPrivate {
 
             Row {
                 id: row
+                width: parent.width
+                LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft
 
                 Repeater {
                     id: itemsRepeater
@@ -185,7 +187,10 @@ MenuBarPrivate {
                             target: menuBarLoader
                             onOpenedMenuIndexChanged: {
                                 if (menuBarLoader.openedMenuIndex === index) {
-                                    menuItem.__popup(0, menuBarLoader.height, 0)
+                                    if (row.LayoutMirroring.enabled)
+                                        menuItem.__popup(menuItemLoader.width, menuBarLoader.height, 0)
+                                    else
+                                        menuItem.__popup(0, menuBarLoader.height, 0)
                                     if (menuBarLoader.preselectMenuItem)
                                         menuItem.__currentIndex = 0
                                 } else {
diff --git a/src/controls/qquickmenu.cpp b/src/controls/qquickmenu.cpp
index bb0ddae9a98b2d1ef69b89890a0f331470a5c99c..01fd30be249da043e7ed50c2883db19860f03b57 100644
--- a/src/controls/qquickmenu.cpp
+++ b/src/controls/qquickmenu.cpp
@@ -368,8 +368,11 @@ void QQuickMenu::__popup(qreal x, qreal y, int atItemIndex)
 
     if (m_platformMenu) {
         QPointF screenPosition(x + m_xOffset, y + m_yOffset);
-        if (visualItem())
+        if (visualItem()) {
+            if (qGuiApp->isRightToLeft())
+                screenPosition.rx() -= qMax(static_cast<qreal>(m_minimumWidth), m_menuContentItem->width());
             screenPosition = visualItem()->mapToScene(screenPosition);
+        }
         m_platformMenu->showPopup(parentWindow, screenPosition.toPoint(), atItem ? atItem->platformItem() : 0);
     } else {
         m_popupWindow = new QQuickMenuPopupWindow();
diff --git a/src/controls/qquickmenupopupwindow.cpp b/src/controls/qquickmenupopupwindow.cpp
index b44b082cf578d72cab762d2daf509855e8671b10..19d85de07c7c026933578ac7384a6c40af2e89b1 100644
--- a/src/controls/qquickmenupopupwindow.cpp
+++ b/src/controls/qquickmenupopupwindow.cpp
@@ -84,6 +84,8 @@ void QQuickMenuPopupWindow::show()
         posy -= pos.y();
     }
 
+    m_initialPos = QPointF(posx, posy);
+
     if (m_menuContentItem) {
         qreal initialWidth = qMax(qreal(1), m_menuContentItem->width());
         qreal initialHeight = qMax(qreal(1), m_menuContentItem->height());
@@ -180,7 +182,11 @@ void QQuickMenuPopupWindow::dismissMenu()
 void QQuickMenuPopupWindow::updateSize()
 {
     QSize contentSize = contentItem()->childrenRect().size().toSize();
-    setGeometry(position().x(), position().y(), contentSize.width(), contentSize.height());
+    qreal x = m_initialPos.x();
+    qreal y = m_initialPos.y();
+    if (qGuiApp->layoutDirection() == Qt::RightToLeft)
+        x -= contentSize.width();
+    setGeometry(x, y, contentSize.width(), contentSize.height());
 }
 
 void QQuickMenuPopupWindow::updatePosition()
diff --git a/src/controls/qquickmenupopupwindow_p.h b/src/controls/qquickmenupopupwindow_p.h
index aead2bd8cc43ff741e8bc0a9fb4f64d217d5db36..30a71fb2043da5980b89c6607f5bcc027be8078c 100644
--- a/src/controls/qquickmenupopupwindow_p.h
+++ b/src/controls/qquickmenupopupwindow_p.h
@@ -90,6 +90,7 @@ private:
     QPointF m_oldItemPos;
     QQuickItem *m_parentItem;
     QQuickItem *m_menuContentItem;
+    QPointF m_initialPos;
 };
 
 QT_END_NAMESPACE
diff --git a/src/styles/Base/MenuStyle.qml b/src/styles/Base/MenuStyle.qml
index ae8f6e75765d628b153ff2e97baac8f48dc5b9fc..4b2099f8e24d72d23c874cbde6d502c8f7bf07e4 100644
--- a/src/styles/Base/MenuStyle.qml
+++ b/src/styles/Base/MenuStyle.qml
@@ -91,10 +91,11 @@ Style {
         }
 
         readonly property string itemText: parent ? parent.text : ""
+        readonly property bool mirrored: Qt.application.layoutDirection === Qt.RightToLeft
 
         Loader {
             id: checkMark
-            x: 4
+            x: mirrored ? parent.width - width - 4 : 4
             y: 6
             active: __menuItemType === "menuitem" && !!menuItem && !!menuItem["checkable"]
             sourceComponent: exclusive ? exclusiveCheckMark : nonExclusiveCheckMark
@@ -162,7 +163,8 @@ Style {
             id: text
             visible: !isSeparator
             text: StyleHelpers.stylizeMnemonics(itemText)
-            x: __menuItemType === "menuitem" ? 24 : 6
+            readonly property real offset: __menuItemType === "menuitem" ? 24 : 6
+            x: mirrored ? parent.width - width - offset : offset
             anchors.verticalCenter: parent.verticalCenter
             renderType: Text.NativeRendering
             color: selected && enabled ? "white" : syspal.text
@@ -172,8 +174,9 @@ Style {
             id: rightDecoration
             readonly property string shortcut: !!menuItem && menuItem["shortcut"] || ""
             visible: isSubmenu || shortcut !== ""
-            text: isSubmenu ? "\u25b8" // BLACK RIGHT-POINTING SMALL TRIANGLE
+            text: isSubmenu ? mirrored ? "\u25c2" : "\u25b8" // BLACK LEFT/RIGHT-POINTING SMALL TRIANGLE
                             : shortcut
+            LayoutMirroring.enabled: mirrored
             anchors {
                 right: parent.right
                 rightMargin: 6