diff --git a/src/controls/Private/Control.qml b/src/controls/Private/Control.qml
index 6b9a44155a59d9c40f8dd876eacf59ac88b9b9ab..f2b234fd839ff300700c8f1837abfcb9db20f17d 100644
--- a/src/controls/Private/Control.qml
+++ b/src/controls/Private/Control.qml
@@ -68,6 +68,7 @@ FocusScope {
 
     implicitWidth: __panel ? __panel.implicitWidth: 0
     implicitHeight: __panel ? __panel.implicitHeight: 0
+    baselineOffset: __panel ? __panel.baselineOffset: 0
     activeFocusOnTab: false
 
     /*! \internal */
diff --git a/src/controls/Private/qquickstyleitem.cpp b/src/controls/Private/qquickstyleitem.cpp
index 82e503ddf7cdeacb7125d9dbbc4be0b6bd154acb..7278ae5b7aeaac6db366f677231e8c45c074d747 100644
--- a/src/controls/Private/qquickstyleitem.cpp
+++ b/src/controls/Private/qquickstyleitem.cpp
@@ -165,6 +165,10 @@ QQuickStyleItem::QQuickStyleItem(QQuickItem *parent)
     connect(this, SIGNAL(contentWidthChanged(int)), this, SLOT(updateSizeHint()));
     connect(this, SIGNAL(contentHeightChanged(int)), this, SLOT(updateSizeHint()));
     connect(this, SIGNAL(widthChanged()), this, SLOT(updateRect()));
+    connect(this, SIGNAL(heightChanged()), this, SLOT(updateRect()));
+
+    connect(this, SIGNAL(heightChanged()), this, SLOT(updateBaselineOffset()));
+    connect(this, SIGNAL(contentHeightChanged(int)), this, SLOT(updateBaselineOffset()));
 }
 
 QQuickStyleItem::~QQuickStyleItem()
@@ -879,6 +883,69 @@ QSize QQuickStyleItem::sizeFromContents(int width, int height)
     }    return size;
 }
 
+qreal QQuickStyleItem::baselineOffset()
+{
+    QRect r;
+    switch (m_itemType) {
+    case RadioButton:
+        r = qApp->style()->subElementRect(QStyle::SE_RadioButtonContents, m_styleoption);
+        break;
+    case Button:
+        r = qApp->style()->subElementRect(QStyle::SE_PushButtonContents, m_styleoption);
+        break;
+    case CheckBox:
+        r = qApp->style()->subElementRect(QStyle::SE_CheckBoxContents, m_styleoption);
+        break;
+    case Edit:
+        r = qApp->style()->subElementRect(QStyle::SE_LineEditContents, m_styleoption);
+        break;
+    case ComboBox:
+        if (const QStyleOptionComboBox *combo = qstyleoption_cast<const QStyleOptionComboBox *>(m_styleoption)) {
+            r = qApp->style()->subControlRect(QStyle::CC_ComboBox, combo, QStyle::SC_ComboBoxEditField);
+            if (style() != QStringLiteral("mac"))
+                r.adjust(0,0,0,1);
+        }
+        break;
+    case SpinBox:
+        if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(m_styleoption))
+            r = qApp->style()->subControlRect(QStyle::CC_SpinBox, spinbox, QStyle::SC_SpinBoxEditField);
+        break;
+    default:
+        break;
+    }
+    if (r.isValid()) {
+        const QFontMetrics &fm = m_styleoption->fontMetrics;
+        const float surplus = r.height() - fm.height();
+        float result = float(r.top()) + surplus/2.0 + fm.ascent();
+#ifdef Q_OS_OSX
+        if (style() == QStringLiteral("mac")) {
+            switch (m_itemType) {
+            case Button:
+            case Edit:
+                result -= 1;
+                break;
+            case ComboBox:
+                // adjust back the adjustments done in drawControl(CE_ComboBoxLabel)
+                result += 1;
+                break;
+            default:
+                break;
+            }
+        }
+#endif
+        return result;
+    }
+
+    return 0.;
+}
+
+void QQuickStyleItem::updateBaselineOffset()
+{
+    const qreal baseline = baselineOffset();
+    if (baseline > 0)
+        setBaselineOffset(baseline);
+}
+
 void QQuickStyleItem::setContentWidth(int arg)
 {
     if (m_contentWidth != arg) {
@@ -905,6 +972,7 @@ void QQuickStyleItem::updateRect()
 {
     initStyleOption();
     m_styleoption->rect.setWidth(width());
+    m_styleoption->rect.setHeight(height());
 }
 
 int QQuickStyleItem::pixelMetric(const QString &metric)
diff --git a/src/controls/Private/qquickstyleitem_p.h b/src/controls/Private/qquickstyleitem_p.h
index cfe9866ebdb14592ffd8040270f369212d631270..336d3b46233e0c48ff8f6f3b66251a8b6c2ecadb 100644
--- a/src/controls/Private/qquickstyleitem_p.h
+++ b/src/controls/Private/qquickstyleitem_p.h
@@ -184,6 +184,7 @@ public Q_SLOTS:
     QVariant styleHint(const QString&);
     void updateSizeHint();
     void updateRect();
+    void updateBaselineOffset();
     void updateItem(){polish();}
     QString hitTest(int x, int y);
     QRectF subControlRect(const QString &subcontrolString);
@@ -224,6 +225,7 @@ protected:
 
 private:
     QSize sizeFromContents(int width, int height);
+    qreal baselineOffset();
 
 protected:
     QWidget *m_dummywidget;
diff --git a/src/controls/Styles/Desktop/CheckBoxStyle.qml b/src/controls/Styles/Desktop/CheckBoxStyle.qml
index 2cc688a7c6b39d212a03abad5faa46b9cbffb7b7..819c6a8198877e6580591a5db7491da47413431e 100644
--- a/src/controls/Styles/Desktop/CheckBoxStyle.qml
+++ b/src/controls/Styles/Desktop/CheckBoxStyle.qml
@@ -47,7 +47,7 @@ Style {
 
         implicitWidth: styleitem.implicitWidth
         implicitHeight: styleitem.implicitHeight
-
+        baselineOffset: styleitem.baselineOffset
         StyleItem {
             id: styleitem
             elementType: "checkbox"
diff --git a/src/controls/Styles/Desktop/ComboBoxStyle.qml b/src/controls/Styles/Desktop/ComboBoxStyle.qml
index 2c1cd7c2d01d88aa9860b2ddfc21642a6f3c44b9..fd4b6cfe2c96b45258a58b635ea8b5da3a804987 100644
--- a/src/controls/Styles/Desktop/ComboBoxStyle.qml
+++ b/src/controls/Styles/Desktop/ComboBoxStyle.qml
@@ -51,6 +51,7 @@ Style {
 
         implicitWidth: 125
         implicitHeight: styleItem.implicitHeight
+        baselineOffset: styleItem.baselineOffset
         anchors.fill: parent
         StyleItem {
             id: styleItem
diff --git a/src/controls/Styles/Desktop/RadioButtonStyle.qml b/src/controls/Styles/Desktop/RadioButtonStyle.qml
index 34d1efa8e01e62ba233b9238a157b3b02a7d8b97..4a00ee22a6d62f044fbf95fa93470e301e347ddd 100644
--- a/src/controls/Styles/Desktop/RadioButtonStyle.qml
+++ b/src/controls/Styles/Desktop/RadioButtonStyle.qml
@@ -48,6 +48,7 @@ Style {
 
         implicitWidth:  styleitem.implicitWidth
         implicitHeight: styleitem.implicitHeight
+        baselineOffset: styleitem.baselineOffset
 
         StyleItem {
             id: styleitem
diff --git a/src/controls/Styles/Desktop/SpinBoxStyle.qml b/src/controls/Styles/Desktop/SpinBoxStyle.qml
index 6fdd407e7e3f3be9943fa80e1bed95f4f41c1e37..7e19037045768d78dbb3e2071a75222903bbda07 100644
--- a/src/controls/Styles/Desktop/SpinBoxStyle.qml
+++ b/src/controls/Styles/Desktop/SpinBoxStyle.qml
@@ -81,6 +81,7 @@ Style {
 
         implicitWidth: styleitem.implicitWidth
         implicitHeight: styleitem.implicitHeight
+        baselineOffset: styleitem.baselineOffset
 
         Item {
             id: edit