diff --git a/src/imports/positioning/plugins.qmltypes b/src/imports/positioning/plugins.qmltypes
index bfb76203f4f0918aaff0d8d8045196ba0b2cf5dc..a956a7861cabd016c18954004ea7177e217467fe 100644
--- a/src/imports/positioning/plugins.qmltypes
+++ b/src/imports/positioning/plugins.qmltypes
@@ -4,15 +4,15 @@ import QtQuick.tooling 1.1
 // It is used for QML tooling purposes only.
 //
 // This file was auto-generated by:
-// 'qmlplugindump -notrelocatable QtPositioning 5.3'
+// 'qmlplugindump -notrelocatable QtPositioning 5.4'
 
 Module {
     Component {
         name: "GeoShapeValueType"
         prototype: "QQmlValueType"
-        exports: ["QtPositioning/GeoShape 5.0", "QtPositioning/GeoShape 5.2"]
+        exports: ["QtPositioning/GeoShape 5.0"]
         isCreatable: false
-        exportMetaObjectRevisions: [0, 0]
+        exportMetaObjectRevisions: [0]
         Enum {
             name: "ShapeType"
             values: {
@@ -33,13 +33,10 @@ Module {
     Component {
         name: "LocationSingleton"
         prototype: "QObject"
-        exports: [
-            "QtPositioning/QtPositioning 5.0",
-            "QtPositioning/QtPositioning 5.2"
-        ]
+        exports: ["QtPositioning/QtPositioning 5.0"]
         isCreatable: false
         isSingleton: true
-        exportMetaObjectRevisions: [0, 0]
+        exportMetaObjectRevisions: [0]
         Method { name: "coordinate"; type: "QGeoCoordinate" }
         Method {
             name: "coordinate"
@@ -90,8 +87,8 @@ Module {
     Component {
         name: "QDeclarativeGeoAddress"
         prototype: "QObject"
-        exports: ["QtPositioning/Address 5.0", "QtPositioning/Address 5.2"]
-        exportMetaObjectRevisions: [0, 0]
+        exports: ["QtPositioning/Address 5.0"]
+        exportMetaObjectRevisions: [0]
         Property { name: "address"; type: "QGeoAddress" }
         Property { name: "text"; type: "string" }
         Property { name: "country"; type: "string" }
@@ -115,8 +112,8 @@ Module {
     Component {
         name: "QDeclarativeGeoLocation"
         prototype: "QObject"
-        exports: ["QtPositioning/Location 5.0", "QtPositioning/Location 5.2"]
-        exportMetaObjectRevisions: [0, 0]
+        exports: ["QtPositioning/Location 5.0"]
+        exportMetaObjectRevisions: [0]
         Property { name: "location"; type: "QGeoLocation" }
         Property { name: "address"; type: "QDeclarativeGeoAddress"; isPointer: true }
         Property { name: "coordinate"; type: "QGeoCoordinate" }
@@ -127,10 +124,10 @@ Module {
         prototype: "QObject"
         exports: [
             "QtPositioning/Position 5.0",
-            "QtPositioning/Position 5.2",
-            "QtPositioning/Position 5.3"
+            "QtPositioning/Position 5.3",
+            "QtPositioning/Position 5.4"
         ]
-        exportMetaObjectRevisions: [0, 0, 1]
+        exportMetaObjectRevisions: [0, 1, 2]
         Property { name: "latitudeValid"; type: "bool"; isReadonly: true }
         Property { name: "longitudeValid"; type: "bool"; isReadonly: true }
         Property { name: "altitudeValid"; type: "bool"; isReadonly: true }
@@ -146,6 +143,8 @@ Module {
         Property { name: "direction"; revision: 1; type: "double"; isReadonly: true }
         Property { name: "verticalSpeedValid"; revision: 1; type: "bool"; isReadonly: true }
         Property { name: "verticalSpeed"; revision: 1; type: "double"; isReadonly: true }
+        Property { name: "magneticVariation"; revision: 2; type: "double"; isReadonly: true }
+        Property { name: "magneticVariationValid"; revision: 2; type: "bool"; isReadonly: true }
         Signal { name: "directionValidChanged"; revision: 1 }
         Signal { name: "directionChanged"; revision: 1 }
         Signal { name: "verticalSpeedValidChanged"; revision: 1 }
@@ -154,11 +153,8 @@ Module {
     Component {
         name: "QDeclarativePositionSource"
         prototype: "QObject"
-        exports: [
-            "QtPositioning/PositionSource 5.0",
-            "QtPositioning/PositionSource 5.2"
-        ]
-        exportMetaObjectRevisions: [0, 0]
+        exports: ["QtPositioning/PositionSource 5.0"]
+        exportMetaObjectRevisions: [0]
         Enum {
             name: "PositioningMethod"
             values: {
diff --git a/src/imports/positioning/positioning.cpp b/src/imports/positioning/positioning.cpp
index 7b2139603cf126ede6e29d5601a4ce796a28b01a..cff324769adff3fbf3f6de2a809df6e6c2883747 100644
--- a/src/imports/positioning/positioning.cpp
+++ b/src/imports/positioning/positioning.cpp
@@ -129,7 +129,7 @@ public:
             // Register the 5.4 types
             // Introduction of 5.4 version; existing 5.3 exports become automatically available under 5.4
             minor = 4;
-            qmlRegisterSingletonType<LocationSingleton  >(uri, major, minor, "QtPositioning", singleton_type_factory);
+            qmlRegisterType<QDeclarativePosition, 2>(uri, major, minor, "Position");
         } else {
             qDebug() << "Unsupported URI given to load positioning QML plugin: " << QLatin1String(uri);
         }
diff --git a/src/imports/positioning/qdeclarativeposition.cpp b/src/imports/positioning/qdeclarativeposition.cpp
index dbd6729087ce718472b703fd03a2d5be03a1a634..9497fa7abac112533b8a342e2dec98e9b021e6c5 100644
--- a/src/imports/positioning/qdeclarativeposition.cpp
+++ b/src/imports/positioning/qdeclarativeposition.cpp
@@ -142,7 +142,10 @@ void QDeclarativePosition::setPosition(const QGeoPositionInfo &info)
     bool emitVerticalSpeedValidChanged = exclusiveNaN(pVerticalSpeed, verticalSpeed);
 
     // magnetic variation
-    // not in QML API
+    const qreal pMagneticVariation = m_info.attribute(QGeoPositionInfo::MagneticVariation);
+    const qreal magneticVariation = info.attribute(QGeoPositionInfo::MagneticVariation);
+    bool emitMagneticVariationChanged = !equalOrNaN(pMagneticVariation, magneticVariation);
+    bool emitMagneticVariationValidChanged = exclusiveNaN(pMagneticVariation, magneticVariation);
 
     // horizontal accuracy
     const qreal pHorizontalAccuracy = m_info.attribute(QGeoPositionInfo::HorizontalAccuracy);
@@ -188,6 +191,10 @@ void QDeclarativePosition::setPosition(const QGeoPositionInfo &info)
         emit verticalAccuracyChanged();
     if (emitVerticalAccuracyValidChanged)
         emit verticalAccuracyValidChanged();
+    if (emitMagneticVariationChanged)
+        emit magneticVariationChanged();
+    if (emitMagneticVariationValidChanged)
+        emit magneticVariationValidChanged();
 }
 
 /*!
@@ -429,6 +436,38 @@ double QDeclarativePosition::verticalSpeed() const
     return m_info.attribute(QGeoPositionInfo::VerticalSpeed);
 }
 
+/*!
+    \qmlproperty bool Position::magneticVariationValid
+    \since Qt Positioning 5.4
+
+    This property is true if \l magneticVariation has been set (to indicate whether that data has been
+    received or not, as every update does not necessarily contain all data).
+
+    \sa magneticVariation
+*/
+bool QDeclarativePosition::isMagneticVariationValid() const
+{
+    return !qIsNaN(m_info.attribute(QGeoPositionInfo::MagneticVariation));
+}
+
+/*!
+    \qmlproperty double Position::magneticVariation
+    \since Qt Positioning 5.4
+
+    This property holds the angle between the horizontal component of the
+    magnetic field and true north, in degrees. Also known as magnetic
+    declination. A positive value indicates a clockwise direction from
+    true north and a negative value indicates a counter-clockwise direction.
+
+    It is a read-only property.
+
+    \sa magneticVariationValid
+*/
+double QDeclarativePosition::magneticVariation() const
+{
+    return m_info.attribute(QGeoPositionInfo::MagneticVariation);
+}
+
 #include "moc_qdeclarativeposition_p.cpp"
 
 QT_END_NAMESPACE
diff --git a/src/imports/positioning/qdeclarativeposition_p.h b/src/imports/positioning/qdeclarativeposition_p.h
index d92353689a0d74915bbf7e1d7088dc2a711f4d12..ed054835206dbaa0f871b0c47a6e8f8dba363700 100644
--- a/src/imports/positioning/qdeclarativeposition_p.h
+++ b/src/imports/positioning/qdeclarativeposition_p.h
@@ -72,6 +72,9 @@ class QDeclarativePosition : public QObject
     Q_PROPERTY(bool verticalSpeedValid READ isVerticalSpeedValid NOTIFY verticalSpeedValidChanged REVISION 1)
     Q_PROPERTY(double verticalSpeed READ verticalSpeed NOTIFY verticalSpeedChanged REVISION 1)
 
+    Q_PROPERTY(double magneticVariation READ magneticVariation NOTIFY magneticVariationChanged REVISION 2)
+    Q_PROPERTY(bool magneticVariationValid READ isMagneticVariationValid NOTIFY magneticVariationChanged REVISION 2)
+
 public:
     explicit QDeclarativePosition(QObject *parent = 0);
     ~QDeclarativePosition();
@@ -98,6 +101,9 @@ public:
     double verticalSpeed() const;
     void setVerticalSpeed(double speed);
 
+    bool isMagneticVariationValid() const;
+    double magneticVariation() const;
+
     void setPosition(const QGeoPositionInfo &info);
 
 Q_SIGNALS:
@@ -118,6 +124,9 @@ Q_SIGNALS:
     Q_REVISION(1) void verticalSpeedValidChanged();
     Q_REVISION(1) void verticalSpeedChanged();
 
+    Q_REVISION(2) void magneticVariationChanged();
+    Q_REVISION(2) void magneticVariationValidChanged();
+
 private:
     QGeoPositionInfo m_info;
 };