diff --git a/.gitignore b/.gitignore
index 11a723e1f3bd89e596d6ef7709608b4d64e13aa4..6bbb56a682005129db06076bba59c7836a747c73 100644
--- a/.gitignore
+++ b/.gitignore
@@ -95,6 +95,7 @@ examples/sensors/shakeit/shakeit
 # Generated config test binaries
 config.tests/bbsensor_compass/bbsensor_compass
 config.tests/bbsensor_header/bbsensor_header
+config.tests/bbsensor_holster/bbsensor_holster
 
 # Directories to ignore
 # ---------------------
diff --git a/.qmake.conf b/.qmake.conf
index 42ba8e45fb1fbff3ff9c88e788a4470fd72ce478..f5a422c15be7356f7d4aaf8abcef3cf0eed7caa1 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -1 +1,3 @@
 load(qt_build_config)
+
+MODULE_VERSION = 5.1.0
diff --git a/config.tests/bbsensor_holster/bbsensor_holster.pro b/config.tests/bbsensor_holster/bbsensor_holster.pro
new file mode 100644
index 0000000000000000000000000000000000000000..349130a348a35a63c4aa182159fee62d16a87726
--- /dev/null
+++ b/config.tests/bbsensor_holster/bbsensor_holster.pro
@@ -0,0 +1,4 @@
+TEMPLATE = app
+SOURCES += main.cpp
+CONFIG += qt
+requires(blackberry)
diff --git a/config.tests/bbsensor_holster/main.cpp b/config.tests/bbsensor_holster/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..52dde466f5d44bf62444512d8b9dc557f324fab9
--- /dev/null
+++ b/config.tests/bbsensor_holster/main.cpp
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore/qglobal.h>
+#ifndef Q_OS_BLACKBERRY
+#error "Missing Q_OS_BLACKBERRY"
+#endif
+#include <sensor/sensor.h>
+
+int main(int argc, char** argv)
+{
+    Q_UNUSED(argc);
+    Q_UNUSED(argv);
+    sensor_event_t event;
+    const int type = SENSOR_TYPE_HOLSTER;
+    const bool holstered = event.holster_s.holstered;
+    Q_UNUSED(type);
+    Q_UNUSED(holstered);
+    return 0;
+}
diff --git a/doc/config/qt-cpp-ignore.qdocconf b/doc/config/qt-cpp-ignore.qdocconf
index 9b09a60aa8d4172d83446fdbbe9e6d8a3d68cafc..28c211958a980a44c1207203cafb8b4c673dbc13 100644
--- a/doc/config/qt-cpp-ignore.qdocconf
+++ b/doc/config/qt-cpp-ignore.qdocconf
@@ -19,9 +19,7 @@ Cpp.ignoretokens        = QAXFACTORY_EXPORT \
                           QM_EXPORT_XML \
                           QT_ASCII_CAST_WARN \
                           QT_ASCII_CAST_WARN_CONSTRUCTOR \
-                          QT_BEGIN_HEADER \
                           QT_DESIGNER_STATIC \
-                          QT_END_HEADER \
                           QT_FASTCALL \
                           QT_WIDGET_PLUGIN_EXPORT \
                           Q_COMPAT_EXPORT \
diff --git a/qtsensors.pro b/qtsensors.pro
index 0c706b21bf8d46602441a6551eb34a76a8dc6a3e..77441730a9a48a5f4a208bea2126c98c3521bd86 100644
--- a/qtsensors.pro
+++ b/qtsensors.pro
@@ -2,6 +2,7 @@ load(configure)
 blackberry {
     qtCompileTest(bbsensor_header)
     qtCompileTest(bbsensor_compass)
+    qtCompileTest(bbsensor_holster)
 }
 
 load(qt_parts)
diff --git a/src/imports/sensors/plugins.qmltypes b/src/imports/sensors/plugins.qmltypes
index 687a1f256c38010d8f7c865c3a75b42bab0a32a8..2deff792dd20b16df39dfdbac9fb9a97449acf65 100644
--- a/src/imports/sensors/plugins.qmltypes
+++ b/src/imports/sensors/plugins.qmltypes
@@ -3,90 +3,146 @@ import QtQuick.tooling 1.1
 // This file describes the plugin-supplied types contained in the library.
 // It is used for QML tooling purposes only.
 //
-// This file was auto-generated with the command 'qmlplugindump QtSensors 5.0 /home/thomas/src/qtbase/imports/'.
+// This file was auto-generated with the command 'qmlplugindump QtSensors 5.0 /home/thomas/src/qtbase/qml'.
 
 Module {
     Component {
         name: "QmlAccelerometer"
         prototype: "QmlSensor"
-        exports: ["Accelerometer 5.0"]
+        exports: ["Accelerometer 5.0", "Accelerometer 5.1"]
+        exportMetaObjectRevisions: [0, 1]
+        Enum {
+            name: "AccelerationMode"
+            values: {
+                "Combined": 0,
+                "Gravity": 1,
+                "User": 2
+            }
+        }
+        Property { name: "accelerationMode"; revision: 1; type: "AccelerationMode" }
+        Signal {
+            name: "accelerationModeChanged"
+            Parameter { name: "accelerationMode"; type: "AccelerationMode" }
+        }
     }
     Component {
         name: "QmlAccelerometerReading"
         prototype: "QmlSensorReading"
-        exports: ["AccelerometerReading 5.0"]
+        exports: ["AccelerometerReading 5.0", "AccelerometerReading 5.1"]
         Property { name: "x"; type: "double"; isReadonly: true }
         Property { name: "y"; type: "double"; isReadonly: true }
         Property { name: "z"; type: "double"; isReadonly: true }
     }
+    Component {
+        name: "QmlAltimeter"
+        prototype: "QmlSensor"
+        exports: ["Altimeter 5.1"]
+    }
+    Component {
+        name: "QmlAltimeterReading"
+        prototype: "QmlSensorReading"
+        exports: ["AltimeterReading 5.1"]
+        Property { name: "altitude"; type: "double"; isReadonly: true }
+    }
     Component {
         name: "QmlAmbientLightSensor"
         prototype: "QmlSensor"
-        exports: ["AmbientLightSensor 5.0"]
+        exports: ["AmbientLightSensor 5.0", "AmbientLightSensor 5.1"]
     }
     Component {
         name: "QmlAmbientLightSensorReading"
         prototype: "QmlSensorReading"
-        exports: ["AmbientLightReading 5.0"]
+        exports: ["AmbientLightReading 5.0", "AmbientLightReading 5.1"]
         Property { name: "lightLevel"; type: "QAmbientLightReading::LightLevel"; isReadonly: true }
     }
+    Component {
+        name: "QmlAmbientTemperatureReading"
+        prototype: "QmlSensorReading"
+        exports: ["AmbientTemperatureReading 5.1"]
+        Property { name: "temperature"; type: "double"; isReadonly: true }
+    }
+    Component {
+        name: "QmlAmbientTemperatureSensor"
+        prototype: "QmlSensor"
+        exports: ["AmbientTemperatureSensor 5.1"]
+    }
     Component {
         name: "QmlCompass"
         prototype: "QmlSensor"
-        exports: ["Compass 5.0"]
+        exports: ["Compass 5.0", "Compass 5.1"]
     }
     Component {
         name: "QmlCompassReading"
         prototype: "QmlSensorReading"
-        exports: ["CompassReading 5.0"]
+        exports: ["CompassReading 5.0", "CompassReading 5.1"]
         Property { name: "azimuth"; type: "double"; isReadonly: true }
         Property { name: "calibrationLevel"; type: "double"; isReadonly: true }
     }
     Component {
         name: "QmlGyroscope"
         prototype: "QmlSensor"
-        exports: ["Gyroscope 5.0"]
+        exports: ["Gyroscope 5.0", "Gyroscope 5.1"]
     }
     Component {
         name: "QmlGyroscopeReading"
         prototype: "QmlSensorReading"
-        exports: ["GyroscopeReading 5.0"]
+        exports: ["GyroscopeReading 5.0", "GyroscopeReading 5.1"]
         Property { name: "x"; type: "double"; isReadonly: true }
         Property { name: "y"; type: "double"; isReadonly: true }
         Property { name: "z"; type: "double"; isReadonly: true }
     }
+    Component {
+        name: "QmlHolsterReading"
+        prototype: "QmlSensorReading"
+        exports: ["HolsterReading 5.1"]
+        Property { name: "holstered"; type: "bool"; isReadonly: true }
+    }
+    Component {
+        name: "QmlHolsterSensor"
+        prototype: "QmlSensor"
+        exports: ["HolsterSensor 5.1"]
+    }
     Component {
         name: "QmlIRProximitySensor"
         prototype: "QmlSensor"
-        exports: ["IRProximitySensor 5.0"]
+        exports: ["IRProximitySensor 5.0", "IRProximitySensor 5.1"]
     }
     Component {
         name: "QmlIRProximitySensorReading"
         prototype: "QmlSensorReading"
-        exports: ["IRProximityReading 5.0"]
+        exports: ["IRProximityReading 5.0", "IRProximityReading 5.1"]
         Property { name: "reflectance"; type: "double"; isReadonly: true }
     }
     Component {
         name: "QmlLightSensor"
         prototype: "QmlSensor"
-        exports: ["LightSensor 5.0"]
+        exports: ["LightSensor 5.0", "LightSensor 5.1"]
         Property { name: "fieldOfView"; type: "double"; isReadonly: true }
+        Signal {
+            name: "fieldOfViewChanged"
+            Parameter { name: "fieldOfView"; type: "double" }
+        }
     }
     Component {
         name: "QmlLightSensorReading"
         prototype: "QmlSensorReading"
-        exports: ["LightReading 5.0"]
+        exports: ["LightReading 5.0", "LightReading 5.1"]
         Property { name: "illuminance"; type: "double"; isReadonly: true }
     }
     Component {
         name: "QmlMagnetometer"
         prototype: "QmlSensor"
-        exports: ["Magnetometer 5.0"]
+        exports: ["Magnetometer 5.0", "Magnetometer 5.1"]
+        Property { name: "returnGeoValues"; type: "bool" }
+        Signal {
+            name: "returnGeoValuesChanged"
+            Parameter { name: "returnGeoValues"; type: "bool" }
+        }
     }
     Component {
         name: "QmlMagnetometerReading"
         prototype: "QmlSensorReading"
-        exports: ["MagnetometerReading 5.0"]
+        exports: ["MagnetometerReading 5.0", "MagnetometerReading 5.1"]
         Property { name: "x"; type: "double"; isReadonly: true }
         Property { name: "y"; type: "double"; isReadonly: true }
         Property { name: "z"; type: "double"; isReadonly: true }
@@ -95,35 +151,50 @@ Module {
     Component {
         name: "QmlOrientationSensor"
         prototype: "QmlSensor"
-        exports: ["OrientationSensor 5.0"]
+        exports: ["OrientationSensor 5.0", "OrientationSensor 5.1"]
     }
     Component {
         name: "QmlOrientationSensorReading"
         prototype: "QmlSensorReading"
-        exports: ["OrientationReading 5.0"]
+        exports: ["OrientationReading 5.0", "OrientationReading 5.1"]
         Property { name: "orientation"; type: "QOrientationReading::Orientation"; isReadonly: true }
     }
+    Component {
+        name: "QmlPressureReading"
+        prototype: "QmlSensorReading"
+        exports: ["PressureReading 5.1"]
+        Property { name: "pressure"; type: "double"; isReadonly: true }
+    }
+    Component {
+        name: "QmlPressureSensor"
+        prototype: "QmlSensor"
+        exports: ["PressureSensor 5.1"]
+    }
     Component {
         name: "QmlProximitySensor"
         prototype: "QmlSensor"
-        exports: ["ProximitySensor 5.0"]
+        exports: ["ProximitySensor 5.0", "ProximitySensor 5.1"]
     }
     Component {
         name: "QmlProximitySensorReading"
         prototype: "QmlSensorReading"
-        exports: ["ProximityReading 5.0"]
+        exports: ["ProximityReading 5.0", "ProximityReading 5.1"]
         Property { name: "near"; type: "bool"; isReadonly: true }
     }
     Component {
         name: "QmlRotationSensor"
         prototype: "QmlSensor"
-        exports: ["RotationSensor 5.0"]
+        exports: ["RotationSensor 5.0", "RotationSensor 5.1"]
         Property { name: "hasZ"; type: "bool"; isReadonly: true }
+        Signal {
+            name: "hasZChanged"
+            Parameter { name: "hasZ"; type: "bool" }
+        }
     }
     Component {
         name: "QmlRotationSensorReading"
         prototype: "QmlSensorReading"
-        exports: ["RotationReading 5.0"]
+        exports: ["RotationReading 5.0", "RotationReading 5.1"]
         Property { name: "x"; type: "double"; isReadonly: true }
         Property { name: "y"; type: "double"; isReadonly: true }
         Property { name: "z"; type: "double"; isReadonly: true }
@@ -131,7 +202,16 @@ Module {
     Component {
         name: "QmlSensor"
         prototype: "QObject"
-        exports: ["Sensor 5.0"]
+        exports: ["Sensor 5.0", "Sensor 5.1"]
+        exportMetaObjectRevisions: [0, 1]
+        Enum {
+            name: "AxesOrientationMode"
+            values: {
+                "FixedOrientation": 0,
+                "AutomaticOrientation": 1,
+                "UserOrientation": 2
+            }
+        }
         Property { name: "identifier"; type: "string" }
         Property { name: "type"; type: "string"; isReadonly: true }
         Property { name: "connectedToBackend"; type: "bool"; isReadonly: true }
@@ -145,13 +225,48 @@ Module {
         Property { name: "description"; type: "string"; isReadonly: true }
         Property { name: "error"; type: "int"; isReadonly: true }
         Property { name: "alwaysOn"; type: "bool" }
+        Property { name: "skipDuplicates"; revision: 1; type: "bool" }
+        Property { name: "axesOrientationMode"; revision: 1; type: "AxesOrientationMode" }
+        Property { name: "currentOrientation"; revision: 1; type: "int"; isReadonly: true }
+        Property { name: "userOrientation"; revision: 1; type: "int" }
+        Property { name: "maxBufferSize"; revision: 1; type: "int"; isReadonly: true }
+        Property { name: "efficientBufferSize"; revision: 1; type: "int"; isReadonly: true }
+        Property { name: "bufferSize"; revision: 1; type: "int" }
+        Signal {
+            name: "skipDuplicatesChanged"
+            Parameter { name: "skipDuplicates"; type: "bool" }
+        }
+        Signal {
+            name: "axesOrientationModeChanged"
+            Parameter { name: "axesOrientationMode"; type: "AxesOrientationMode" }
+        }
+        Signal {
+            name: "currentOrientationChanged"
+            Parameter { name: "currentOrientation"; type: "int" }
+        }
+        Signal {
+            name: "userOrientationChanged"
+            Parameter { name: "userOrientation"; type: "int" }
+        }
+        Signal {
+            name: "maxBufferSizeChanged"
+            Parameter { name: "maxBufferSize"; type: "int" }
+        }
+        Signal {
+            name: "efficientBufferSizeChanged"
+            Parameter { name: "efficientBufferSize"; type: "int" }
+        }
+        Signal {
+            name: "bufferSizeChanged"
+            Parameter { name: "bufferSize"; type: "int" }
+        }
         Method { name: "start"; type: "bool" }
         Method { name: "stop" }
     }
     Component {
         name: "QmlSensorGesture"
         prototype: "QObject"
-        exports: ["SensorGesture 5.0"]
+        exports: ["SensorGesture 5.0", "SensorGesture 5.1"]
         Property { name: "availableGestures"; type: "QStringList"; isReadonly: true }
         Property { name: "gestures"; type: "QStringList" }
         Property { name: "validGestures"; type: "QStringList"; isReadonly: true }
@@ -165,7 +280,7 @@ Module {
     Component {
         name: "QmlSensorGlobal"
         prototype: "QObject"
-        exports: ["QmlSensors 5.0"]
+        exports: ["QmlSensors 5.0", "QmlSensors 5.1"]
         Signal { name: "availableSensorsChanged" }
         Method { name: "sensorTypes"; type: "QStringList" }
         Method {
@@ -182,7 +297,7 @@ Module {
     Component {
         name: "QmlSensorOutputRange"
         prototype: "QObject"
-        exports: ["OutputRange 5.0"]
+        exports: ["OutputRange 5.0", "OutputRange 5.1"]
         Property { name: "minimum"; type: "double"; isReadonly: true }
         Property { name: "maximum"; type: "double"; isReadonly: true }
         Property { name: "accuracy"; type: "double"; isReadonly: true }
@@ -190,26 +305,30 @@ Module {
     Component {
         name: "QmlSensorRange"
         prototype: "QObject"
-        exports: ["Range 5.0"]
+        exports: ["Range 5.0", "Range 5.1"]
         Property { name: "minimum"; type: "int"; isReadonly: true }
         Property { name: "maximum"; type: "int"; isReadonly: true }
     }
     Component {
         name: "QmlSensorReading"
         prototype: "QObject"
-        exports: ["SensorReading 5.0"]
+        exports: ["SensorReading 5.0", "SensorReading 5.1"]
         Property { name: "timestamp"; type: "qulonglong"; isReadonly: true }
     }
     Component {
         name: "QmlTapSensor"
         prototype: "QmlSensor"
-        exports: ["TapSensor 5.0"]
+        exports: ["TapSensor 5.0", "TapSensor 5.1"]
         Property { name: "returnDoubleTapEvents"; type: "bool" }
+        Signal {
+            name: "returnDoubleTapEventsChanged"
+            Parameter { name: "returnDoubleTapEvents"; type: "bool" }
+        }
     }
     Component {
         name: "QmlTapSensorReading"
         prototype: "QmlSensorReading"
-        exports: ["TapReading 5.0"]
+        exports: ["TapReading 5.0", "TapReading 5.1"]
         Property { name: "tapDirection"; type: "QTapReading::TapDirection"; isReadonly: true }
         Property { name: "doubleTap"; type: "bool"; isReadonly: true }
         Signal { name: "isDoubleTapChanged" }
@@ -217,13 +336,13 @@ Module {
     Component {
         name: "QmlTiltSensor"
         prototype: "QmlSensor"
-        exports: ["TiltSensor 5.0"]
+        exports: ["TiltSensor 5.0", "TiltSensor 5.1"]
         Method { name: "calibrate" }
     }
     Component {
         name: "QmlTiltSensorReading"
         prototype: "QmlSensorReading"
-        exports: ["TiltReading 5.0"]
+        exports: ["TiltReading 5.0", "TiltReading 5.1"]
         Property { name: "yRotation"; type: "double"; isReadonly: true }
         Property { name: "xRotation"; type: "double"; isReadonly: true }
     }
diff --git a/src/imports/sensors/qmlaccelerometer.cpp b/src/imports/sensors/qmlaccelerometer.cpp
index 390f8beb3913c145756a6a8953b4c7056ed098a4..6fc82eab2a46288b89f6996c2ee4bdd3df0419ff 100644
--- a/src/imports/sensors/qmlaccelerometer.cpp
+++ b/src/imports/sensors/qmlaccelerometer.cpp
@@ -65,12 +65,33 @@ QmlAccelerometer::QmlAccelerometer(QObject *parent)
     : QmlSensor(parent)
     , m_sensor(new QAccelerometer(this))
 {
+    connect(m_sensor, SIGNAL(accelerationModeChanged(AccelerationMode)),
+            this, SIGNAL(accelerationModeChanged(AccelerationMode)));
 }
 
 QmlAccelerometer::~QmlAccelerometer()
 {
 }
 
+/*!
+    \qmlproperty AccelerationMode Accelerometer::accelerationMode
+    \since QtSensors 5.1
+
+    This property holds the current acceleration mode.
+
+    Please see QAccelerometer::accelerationMode for information about this property.
+*/
+
+QmlAccelerometer::AccelerationMode QmlAccelerometer::accelerationMode() const
+{
+    return static_cast<QmlAccelerometer::AccelerationMode>(m_sensor->accelerationMode());
+}
+
+void QmlAccelerometer::setAccelerationMode(QmlAccelerometer::AccelerationMode accelerationMode)
+{
+    m_sensor->setAccelerationMode(static_cast<QAccelerometer::AccelerationMode>(accelerationMode));
+}
+
 QmlSensorReading *QmlAccelerometer::createReading() const
 {
     return new QmlAccelerometerReading(m_sensor);
diff --git a/src/imports/sensors/qmlaccelerometer.h b/src/imports/sensors/qmlaccelerometer.h
index 95785ed475e28cbf43bd82d2573338cb6d88801a..7a9a4cd0f80454941748e2d9403806f02451a160 100644
--- a/src/imports/sensors/qmlaccelerometer.h
+++ b/src/imports/sensors/qmlaccelerometer.h
@@ -44,7 +44,6 @@
 
 #include "qmlsensor.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QAccelerometer;
@@ -52,10 +51,25 @@ class QAccelerometer;
 class QmlAccelerometer : public QmlSensor
 {
     Q_OBJECT
+    Q_ENUMS(AccelerationMode)
+    Q_PROPERTY(AccelerationMode accelerationMode READ accelerationMode WRITE setAccelerationMode
+               NOTIFY accelerationModeChanged REVISION 1)
 public:
     explicit QmlAccelerometer(QObject *parent = 0);
     ~QmlAccelerometer();
 
+    // Keep this enum in sync with QAccelerometer::AccelerationMode
+    enum AccelerationMode {
+        Combined,
+        Gravity,
+        User
+    };
+
+    AccelerationMode accelerationMode() const;
+    void setAccelerationMode(AccelerationMode accelerationMode);
+
+signals:
+    void accelerationModeChanged(AccelerationMode accelerationMode);
 
 private:
     QSensor *sensor() const Q_DECL_OVERRIDE;
@@ -92,5 +106,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmlaltimeter.cpp b/src/imports/sensors/qmlaltimeter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..abe3f9221f89d695f2289d268c9c683b5529c407
--- /dev/null
+++ b/src/imports/sensors/qmlaltimeter.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qmlaltimeter.h"
+#include <QAltimeter>
+
+/*!
+    \qmltype Altimeter
+    \instantiates QmlAltimeter
+    \ingroup qml-sensors_type
+    \inqmlmodule QtSensors 5.0
+    \since QtSensors 5.1
+    \inherits Sensor
+    \brief The Altimeter element reports on altitude.
+
+    The Altimeter element reports on altitude.
+
+    This element wraps the QAltimeter class. Please see the documentation for
+    QAltimeter for details.
+
+    \sa AltimeterReading
+*/
+
+QmlAltimeter::QmlAltimeter(QObject *parent)
+    : QmlSensor(parent)
+    , m_sensor(new QAltimeter(this))
+{
+}
+
+QmlAltimeter::~QmlAltimeter()
+{
+}
+
+QmlSensorReading *QmlAltimeter::createReading() const
+{
+    return new QmlAltimeterReading(m_sensor);
+}
+
+QSensor *QmlAltimeter::sensor() const
+{
+    return m_sensor;
+}
+
+/*!
+    \qmltype AltimeterReading
+    \instantiates QmlAltimeterReading
+    \ingroup qml-sensors_reading
+    \inqmlmodule QtSensors 5.0
+    \since QtSensors 5.1
+    \inherits SensorReading
+    \brief The AltimeterReading element holds the most recent Altimeter reading.
+
+    The AltimeterReading element holds the most recent Altimeter reading.
+
+    This element wraps the QAltimeterReading class. Please see the documentation for
+    QAltimeterReading for details.
+
+    This element cannot be directly created.
+*/
+
+QmlAltimeterReading::QmlAltimeterReading(QAltimeter *sensor)
+    : QmlSensorReading(sensor)
+    , m_sensor(sensor)
+    , m_altitude(0)
+{
+}
+
+QmlAltimeterReading::~QmlAltimeterReading()
+{
+}
+
+/*!
+    \qmlproperty qreal AltimeterReading::altitude
+    This property holds the altitude of the device.
+
+    Please see QAltimeterReading::altitude for information about this property.
+*/
+
+qreal QmlAltimeterReading::altitude() const
+{
+    return m_altitude;
+}
+
+QSensorReading *QmlAltimeterReading::reading() const
+{
+    return m_sensor->reading();
+}
+
+void QmlAltimeterReading::readingUpdate()
+{
+    qreal altitude = m_sensor->reading()->altitude();
+    if (m_altitude != altitude) {
+        m_altitude = altitude;
+        Q_EMIT altitudeChanged();
+    }
+}
diff --git a/src/imports/sensors/qmlaltimeter.h b/src/imports/sensors/qmlaltimeter.h
new file mode 100644
index 0000000000000000000000000000000000000000..4568baaa8a81e1a95bb76bd4bc5a9fcd94a393a6
--- /dev/null
+++ b/src/imports/sensors/qmlaltimeter.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QMLALTIMETER_H
+#define QMLALTIMETER_H
+
+#include "qmlsensor.h"
+
+QT_BEGIN_NAMESPACE
+
+class QAltimeter;
+
+class QmlAltimeter : public QmlSensor
+{
+    Q_OBJECT
+public:
+    explicit QmlAltimeter(QObject *parent = 0);
+    ~QmlAltimeter();
+
+private:
+    QSensor *sensor() const Q_DECL_OVERRIDE;
+    QmlSensorReading *createReading() const Q_DECL_OVERRIDE;
+
+    QAltimeter *m_sensor;
+};
+
+class QmlAltimeterReading : public QmlSensorReading
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal altitude READ altitude NOTIFY altitudeChanged)
+public:
+    explicit QmlAltimeterReading(QAltimeter *sensor);
+    ~QmlAltimeterReading();
+
+    qreal altitude() const;
+
+Q_SIGNALS:
+    void altitudeChanged();
+
+private:
+    QSensorReading *reading() const Q_DECL_OVERRIDE;
+    void readingUpdate() Q_DECL_OVERRIDE;
+
+    QAltimeter *m_sensor;
+    qreal m_altitude;
+};
+
+QT_END_NAMESPACE
+#endif
diff --git a/src/imports/sensors/qmlambientlightsensor.h b/src/imports/sensors/qmlambientlightsensor.h
index eecb6b120d437d5e73409545a57730bc2f49234c..7715a39f550ff82331f4278fd634d1fe4a3e231e 100644
--- a/src/imports/sensors/qmlambientlightsensor.h
+++ b/src/imports/sensors/qmlambientlightsensor.h
@@ -45,7 +45,6 @@
 #include "qmlsensor.h"
 #include <QAmbientLightSensor>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QAmbientLightSensor;
@@ -86,5 +85,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmlambienttemperaturesensor.cpp b/src/imports/sensors/qmlambienttemperaturesensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1190fca65a0337a83b32997d24ba243ee4540886
--- /dev/null
+++ b/src/imports/sensors/qmlambienttemperaturesensor.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qmlambienttemperaturesensor.h"
+#include <QAmbientTemperatureSensor>
+
+/*!
+    \qmltype AmbientTemperatureSensor
+    \instantiates QmlAmbientTemperatureSensor
+    \ingroup qml-sensors_type
+    \inqmlmodule QtSensors 5.0
+    \since QtSensors 5.1
+    \inherits Sensor
+    \brief The AmbientTemperatureSensor element reports on the ambient temperature.
+
+    The AmbientTemperatureSensor element reports on the ambient temperature.
+
+    This element wraps the QAmbientTemperatureSensor class. Please see the documentation for
+    QAmbientTemperatureSensor for details.
+
+    \sa AmbientTemperatureReading
+*/
+
+QmlAmbientTemperatureSensor::QmlAmbientTemperatureSensor(QObject *parent)
+    : QmlSensor(parent)
+    , m_sensor(new QAmbientTemperatureSensor(this))
+{
+}
+
+QmlAmbientTemperatureSensor::~QmlAmbientTemperatureSensor()
+{
+}
+
+QmlSensorReading *QmlAmbientTemperatureSensor::createReading() const
+{
+    return new QmlAmbientTemperatureReading(m_sensor);
+}
+
+QSensor *QmlAmbientTemperatureSensor::sensor() const
+{
+    return m_sensor;
+}
+
+/*!
+    \qmltype AmbientTemperatureReading
+    \instantiates QmlAmbientTemperatureReading
+    \ingroup qml-sensors_reading
+    \inqmlmodule QtSensors 5.0
+    \since QtSensors 5.1
+    \inherits SensorReading
+    \brief The AmbientTemperatureReading element holds the most recent temperature reading.
+
+    The AmbientTemperatureReading element holds the most recent temperature reading.
+
+    This element wraps the QAmbientTemperatureReading class. Please see the documentation for
+    QAmbientTemperatureReading for details.
+
+    This element cannot be directly created.
+*/
+
+QmlAmbientTemperatureReading::QmlAmbientTemperatureReading(QAmbientTemperatureSensor *sensor)
+    : QmlSensorReading(sensor)
+    , m_sensor(sensor)
+    , m_temperature(0)
+{
+}
+
+QmlAmbientTemperatureReading::~QmlAmbientTemperatureReading()
+{
+}
+
+/*!
+    \qmlproperty qreal AmbientTemperatureReading::temperature
+    This property holds the ambient temperature in degree Celsius.
+
+    Please see QAmbientTemperatureReading::temperature for information about this property.
+*/
+
+qreal QmlAmbientTemperatureReading::temperature() const
+{
+    return m_temperature;
+}
+
+QSensorReading *QmlAmbientTemperatureReading::reading() const
+{
+    return m_sensor->reading();
+}
+
+void QmlAmbientTemperatureReading::readingUpdate()
+{
+    const qreal temperature = m_sensor->reading()->temperature();
+    if (m_temperature != temperature) {
+        m_temperature = temperature;
+        Q_EMIT temperatureChanged();
+    }
+}
diff --git a/src/imports/sensors/qmlambienttemperaturesensor.h b/src/imports/sensors/qmlambienttemperaturesensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..1c1d8dd6f6235953c2da811052b8bd043ab9b729
--- /dev/null
+++ b/src/imports/sensors/qmlambienttemperaturesensor.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QMLAMBIENTTEMPERATURESENSOR_H
+#define QMLAMBIENTTEMPERATURESENSOR_H
+
+#include "qmlsensor.h"
+
+QT_BEGIN_NAMESPACE
+
+class QAmbientTemperatureSensor;
+
+class QmlAmbientTemperatureSensor : public QmlSensor
+{
+    Q_OBJECT
+public:
+    explicit QmlAmbientTemperatureSensor(QObject *parent = 0);
+    ~QmlAmbientTemperatureSensor();
+
+private:
+    QSensor *sensor() const Q_DECL_OVERRIDE;
+    QmlSensorReading *createReading() const Q_DECL_OVERRIDE;
+
+    QAmbientTemperatureSensor *m_sensor;
+};
+
+class QmlAmbientTemperatureReading : public QmlSensorReading
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal temperature READ temperature NOTIFY temperatureChanged)
+public:
+    explicit QmlAmbientTemperatureReading(QAmbientTemperatureSensor *sensor);
+    ~QmlAmbientTemperatureReading();
+
+    qreal temperature() const;
+
+Q_SIGNALS:
+    void temperatureChanged();
+
+private:
+    QSensorReading *reading() const Q_DECL_OVERRIDE;
+    void readingUpdate() Q_DECL_OVERRIDE;
+
+    QAmbientTemperatureSensor *m_sensor;
+    qreal m_temperature;
+};
+
+QT_END_NAMESPACE
+#endif
diff --git a/src/imports/sensors/qmlcompass.h b/src/imports/sensors/qmlcompass.h
index 30edbf0a581c4b50c2307278c2ed74d03b8fd381..76294bf93db1197cdf654360f295b73bf87f1413 100644
--- a/src/imports/sensors/qmlcompass.h
+++ b/src/imports/sensors/qmlcompass.h
@@ -44,7 +44,6 @@
 
 #include "qmlsensor.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QCompass;
@@ -88,5 +87,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmlgyroscope.h b/src/imports/sensors/qmlgyroscope.h
index c5f6c9023734f855da61752229e27d74e46854c1..f6fb6795d39ddb8aa5ae8d97848074c54e0591ab 100644
--- a/src/imports/sensors/qmlgyroscope.h
+++ b/src/imports/sensors/qmlgyroscope.h
@@ -44,7 +44,6 @@
 
 #include "qmlsensor.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QGyroscope;
@@ -92,5 +91,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmlholstersensor.cpp b/src/imports/sensors/qmlholstersensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a1eae05b48fc7d20c76075fd6dc68442fdb12290
--- /dev/null
+++ b/src/imports/sensors/qmlholstersensor.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qmlholstersensor.h"
+#include <QHolsterSensor>
+
+/*!
+    \qmltype HolsterSensor
+    \instantiates QmlHolsterSensor
+    \ingroup qml-sensors_type
+    \inqmlmodule QtSensors 5.0
+    \since QtSensors 5.1
+    \inherits Sensor
+    \brief The HolsterSensor element reports on whether a device is holstered.
+
+    The HolsterSensor element reports on whether a device is holstered.
+
+    This element wraps the QHolsterSensor class. Please see the documentation for
+    QHolsterSensor for details.
+
+    \sa HolsterReading
+*/
+
+QmlHolsterSensor::QmlHolsterSensor(QObject *parent)
+    : QmlSensor(parent)
+    , m_sensor(new QHolsterSensor(this))
+{
+}
+
+QmlHolsterSensor::~QmlHolsterSensor()
+{
+}
+
+QmlSensorReading *QmlHolsterSensor::createReading() const
+{
+    return new QmlHolsterReading(m_sensor);
+}
+
+QSensor *QmlHolsterSensor::sensor() const
+{
+    return m_sensor;
+}
+
+/*!
+    \qmltype HolsterReading
+    \instantiates QmlHolsterReading
+    \ingroup qml-sensors_reading
+    \inqmlmodule QtSensors 5.0
+    \since QtSensors 5.1
+    \inherits SensorReading
+    \brief The HolsterReading element holds the most recent HolsterSensor reading.
+
+    The HolsterReading element holds the most recent HolsterSensor reading.
+
+    This element wraps the QHolsterReading class. Please see the documentation for
+    QHolsterReading for details.
+
+    This element cannot be directly created.
+*/
+
+QmlHolsterReading::QmlHolsterReading(QHolsterSensor *sensor)
+    : QmlSensorReading(sensor)
+    , m_sensor(sensor)
+    , m_holstered(false)
+{
+}
+
+QmlHolsterReading::~QmlHolsterReading()
+{
+}
+
+/*!
+    \qmlproperty qreal HolsterReading::holstered
+    This property holds whether the device is holstered.
+
+    Please see QHolsterReading::holstered for information about this property.
+*/
+
+bool QmlHolsterReading::holstered() const
+{
+    return m_holstered;
+}
+
+QSensorReading *QmlHolsterReading::reading() const
+{
+    return m_sensor->reading();
+}
+
+void QmlHolsterReading::readingUpdate()
+{
+    qreal holstered = m_sensor->reading()->holstered();
+    if (m_holstered != holstered) {
+        m_holstered = holstered;
+        Q_EMIT holsteredChanged();
+    }
+}
diff --git a/src/imports/sensors/qmlholstersensor.h b/src/imports/sensors/qmlholstersensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..262ba69ddc8a473f5ee7b6b9b8b2cdfd43bc727f
--- /dev/null
+++ b/src/imports/sensors/qmlholstersensor.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QMLHOLSTERSENSOR_H
+#define QMLHOLSTERSENSOR_H
+
+#include "qmlsensor.h"
+
+QT_BEGIN_NAMESPACE
+
+class QHolsterSensor;
+
+class QmlHolsterSensor : public QmlSensor
+{
+    Q_OBJECT
+public:
+    explicit QmlHolsterSensor(QObject *parent = 0);
+    ~QmlHolsterSensor();
+
+private:
+    QSensor *sensor() const Q_DECL_OVERRIDE;
+    QmlSensorReading *createReading() const Q_DECL_OVERRIDE;
+
+    QHolsterSensor *m_sensor;
+};
+
+class QmlHolsterReading : public QmlSensorReading
+{
+    Q_OBJECT
+    Q_PROPERTY(bool holstered READ holstered NOTIFY holsteredChanged)
+public:
+    explicit QmlHolsterReading(QHolsterSensor *sensor);
+    ~QmlHolsterReading();
+
+    bool holstered() const;
+
+Q_SIGNALS:
+    void holsteredChanged();
+
+private:
+    QSensorReading *reading() const Q_DECL_OVERRIDE;
+    void readingUpdate() Q_DECL_OVERRIDE;
+
+    QHolsterSensor *m_sensor;
+    bool m_holstered;
+};
+
+QT_END_NAMESPACE
+#endif
diff --git a/src/imports/sensors/qmlirproximitysensor.h b/src/imports/sensors/qmlirproximitysensor.h
index 2b2d4c495f7ac0d52b13a14b9649c8bcdb5faf41..ec39fe8b186aef5b473ec2d04fe0448f2be1545e 100644
--- a/src/imports/sensors/qmlirproximitysensor.h
+++ b/src/imports/sensors/qmlirproximitysensor.h
@@ -44,7 +44,6 @@
 
 #include "qmlsensor.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QIRProximitySensor;
@@ -83,5 +82,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmllightsensor.cpp b/src/imports/sensors/qmllightsensor.cpp
index 1c3fed2cb988be1c52c9054cd491a464461d041d..86126a2ac512dec2ad1832125308c6d602e9ae95 100644
--- a/src/imports/sensors/qmllightsensor.cpp
+++ b/src/imports/sensors/qmllightsensor.cpp
@@ -63,6 +63,8 @@ QmlLightSensor::QmlLightSensor(QObject *parent)
     : QmlSensor(parent)
     , m_sensor(new QLightSensor(this))
 {
+    connect(m_sensor, SIGNAL(fieldOfViewChanged(qreal)),
+            this, SIGNAL(fieldOfViewChanged(qreal)));
 }
 
 QmlLightSensor::~QmlLightSensor()
@@ -88,13 +90,7 @@ QSensor *QmlLightSensor::sensor() const
 
 qreal QmlLightSensor::fieldOfView() const
 {
-    return m_sensor->property("fieldOfView").value<qreal>();
-}
-
-void QmlLightSensor::_update()
-{
-    if (fieldOfView() != qreal())
-        Q_EMIT fieldOfViewChanged();
+    return m_sensor->fieldOfView();
 }
 
 /*!
diff --git a/src/imports/sensors/qmllightsensor.h b/src/imports/sensors/qmllightsensor.h
index 90fe0b7fd8ea8f513a9b12540f8231f5f78ddb2c..e42d7818140dea7e175d98471af347bc1eab7962 100644
--- a/src/imports/sensors/qmllightsensor.h
+++ b/src/imports/sensors/qmllightsensor.h
@@ -44,7 +44,6 @@
 
 #include "qmlsensor.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QLightSensor;
@@ -59,13 +58,11 @@ public:
 
     qreal fieldOfView() const;
 
-
 Q_SIGNALS:
-    void fieldOfViewChanged();
+    void fieldOfViewChanged(qreal fieldOfView);
 
 private:
     QSensor *sensor() const Q_DECL_OVERRIDE;
-    void _update();
     QLightSensor *m_sensor;
     QmlSensorReading *createReading() const Q_DECL_OVERRIDE;
 };
@@ -91,5 +88,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmlmagnetometer.cpp b/src/imports/sensors/qmlmagnetometer.cpp
index 1f95b3f2d036dfe645f12724ef08aef9cf6632b5..2c531f7055c95efc88ca39c4943b7bd9c6f07d9d 100644
--- a/src/imports/sensors/qmlmagnetometer.cpp
+++ b/src/imports/sensors/qmlmagnetometer.cpp
@@ -65,6 +65,8 @@ QmlMagnetometer::QmlMagnetometer(QObject *parent)
     : QmlSensor(parent)
     , m_sensor(new QMagnetometer(this))
 {
+    connect(m_sensor, SIGNAL(returnGeoValuesChanged(bool)),
+            this, SIGNAL(returnGeoValuesChanged(bool)));
 }
 
 QmlMagnetometer::~QmlMagnetometer()
@@ -90,13 +92,12 @@ QSensor *QmlMagnetometer::sensor() const
 
 bool QmlMagnetometer::returnGeoValues() const
 {
-    return m_sensor->property("returnGeoValues").toBool();
+    return m_sensor->returnGeoValues();
 }
 
 void QmlMagnetometer::setReturnGeoValues(bool geo)
 {
-    if (m_sensor->property("returnGeoValues").toBool() == geo) return;
-    m_sensor->setProperty("returnGeoValues", geo);
+    m_sensor->setReturnGeoValues(geo);
 }
 
 /*!
diff --git a/src/imports/sensors/qmlmagnetometer.h b/src/imports/sensors/qmlmagnetometer.h
index d6c75c1e806dd7c239cac555314b45cf8bc0ff96..6e5facda6ffdfac135ebf4c831c8230dd708adb6 100644
--- a/src/imports/sensors/qmlmagnetometer.h
+++ b/src/imports/sensors/qmlmagnetometer.h
@@ -44,7 +44,6 @@
 
 #include "qmlsensor.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QMagnetometer;
@@ -52,6 +51,7 @@ class QMagnetometer;
 class QmlMagnetometer : public QmlSensor
 {
     Q_OBJECT
+    Q_PROPERTY(bool returnGeoValues READ returnGeoValues WRITE setReturnGeoValues NOTIFY returnGeoValuesChanged)
 public:
     explicit QmlMagnetometer(QObject *parent = 0);
     ~QmlMagnetometer();
@@ -59,6 +59,8 @@ public:
     bool returnGeoValues() const;
     void setReturnGeoValues(bool geo);
 
+Q_SIGNALS:
+    void returnGeoValuesChanged(bool returnGeoValues);
 
 private:
     QSensor *sensor() const Q_DECL_OVERRIDE;
@@ -99,5 +101,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmlorientationsensor.h b/src/imports/sensors/qmlorientationsensor.h
index d14197e872fe370276ec429fe502a56efdbf0f73..35e9d6fb94c6f978c129763abe0a147ecde32546 100644
--- a/src/imports/sensors/qmlorientationsensor.h
+++ b/src/imports/sensors/qmlorientationsensor.h
@@ -45,7 +45,6 @@
 #include "qmlsensor.h"
 #include <QOrientationSensor>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QOrientationSensor;
@@ -86,5 +85,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmlpressuresensor.cpp b/src/imports/sensors/qmlpressuresensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a21f7c0d42314582572cf5cf9296362c132ab4ca
--- /dev/null
+++ b/src/imports/sensors/qmlpressuresensor.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qmlpressuresensor.h"
+#include <QPressureSensor>
+
+/*!
+    \qmltype PressureSensor
+    \instantiates QmlPressureSensor
+    \ingroup qml-sensors_type
+    \inqmlmodule QtSensors 5.0
+    \since QtSensors 5.1
+    \inherits Sensor
+    \brief The PressureSensor element reports on atmospheric pressure values.
+
+    The PressureSensor element reports on atmospheric pressure values.
+
+    This element wraps the QPressureSensor class. Please see the documentation for
+    QPressureSensor for details.
+
+    \sa PressureReading
+*/
+
+QmlPressureSensor::QmlPressureSensor(QObject *parent)
+    : QmlSensor(parent)
+    , m_sensor(new QPressureSensor(this))
+{
+}
+
+QmlPressureSensor::~QmlPressureSensor()
+{
+}
+
+QmlSensorReading *QmlPressureSensor::createReading() const
+{
+    return new QmlPressureReading(m_sensor);
+}
+
+QSensor *QmlPressureSensor::sensor() const
+{
+    return m_sensor;
+}
+
+/*!
+    \qmltype PressureReading
+    \instantiates QmlPressureReading
+    \ingroup qml-sensors_reading
+    \inqmlmodule QtSensors 5.0
+    \since QtSensors 5.1
+    \inherits SensorReading
+    \brief The PressureReading element holds the most recent PressureSensor reading.
+
+    The PressureReading element holds the most recent PressureSensor reading.
+
+    This element wraps the QPressureReading class. Please see the documentation for
+    QPressureReading for details.
+
+    This element cannot be directly created.
+*/
+
+QmlPressureReading::QmlPressureReading(QPressureSensor *sensor)
+    : QmlSensorReading(sensor)
+    , m_sensor(sensor)
+    , m_pressure(0)
+{
+}
+
+QmlPressureReading::~QmlPressureReading()
+{
+}
+
+/*!
+    \qmlproperty qreal PressureReading::pressure
+    This property holds the atmospheric pressure value in Pascals.
+
+    Please see QPressureReading::pressure for information about this property.
+*/
+
+qreal QmlPressureReading::pressure() const
+{
+    return m_pressure;
+}
+
+QSensorReading *QmlPressureReading::reading() const
+{
+    return m_sensor->reading();
+}
+
+void QmlPressureReading::readingUpdate()
+{
+    qreal pressure = m_sensor->reading()->pressure();
+    if (m_pressure != pressure) {
+        m_pressure = pressure;
+        Q_EMIT pressureChanged();
+    }
+}
diff --git a/src/imports/sensors/qmlpressuresensor.h b/src/imports/sensors/qmlpressuresensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..627915a6fbeba6c2212b85a5770fd142cfb62339
--- /dev/null
+++ b/src/imports/sensors/qmlpressuresensor.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QMLPRESSURESENSOR_H
+#define QMLPRESSURESENSOR_H
+
+#include "qmlsensor.h"
+
+QT_BEGIN_NAMESPACE
+
+class QPressureSensor;
+
+class QmlPressureSensor : public QmlSensor
+{
+    Q_OBJECT
+public:
+    explicit QmlPressureSensor(QObject *parent = 0);
+    ~QmlPressureSensor();
+
+private:
+    QSensor *sensor() const Q_DECL_OVERRIDE;
+    QmlSensorReading *createReading() const Q_DECL_OVERRIDE;
+
+    QPressureSensor *m_sensor;
+};
+
+class QmlPressureReading : public QmlSensorReading
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal pressure READ pressure NOTIFY pressureChanged)
+public:
+    explicit QmlPressureReading(QPressureSensor *sensor);
+    ~QmlPressureReading();
+
+    qreal pressure() const;
+
+Q_SIGNALS:
+    void pressureChanged();
+
+private:
+    QSensorReading *reading() const Q_DECL_OVERRIDE;
+    void readingUpdate() Q_DECL_OVERRIDE;
+
+    QPressureSensor *m_sensor;
+    qreal m_pressure;
+};
+
+QT_END_NAMESPACE
+#endif
diff --git a/src/imports/sensors/qmlproximitysensor.h b/src/imports/sensors/qmlproximitysensor.h
index afbc3a015db95c514ce2efbd5f2bee5637720bba..17cb2f9a178de7cf1af0d8cd48d3ea3b1277705e 100644
--- a/src/imports/sensors/qmlproximitysensor.h
+++ b/src/imports/sensors/qmlproximitysensor.h
@@ -44,7 +44,6 @@
 
 #include "qmlsensor.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QProximitySensor;
@@ -84,5 +83,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmlrotationsensor.cpp b/src/imports/sensors/qmlrotationsensor.cpp
index e58a3f8c200adec6d31e5fa2a559c7913953abeb..f1821641e9fe1422015a3f24616af221ca927a68 100644
--- a/src/imports/sensors/qmlrotationsensor.cpp
+++ b/src/imports/sensors/qmlrotationsensor.cpp
@@ -65,6 +65,7 @@ QmlRotationSensor::QmlRotationSensor(QObject *parent)
     : QmlSensor(parent)
     , m_sensor(new QRotationSensor(this))
 {
+    connect(m_sensor, SIGNAL(hasZChanged(bool)), this, SIGNAL(hasZChanged(bool)));
 }
 
 QmlRotationSensor::~QmlRotationSensor()
@@ -90,7 +91,7 @@ QSensor *QmlRotationSensor::sensor() const
 
 bool QmlRotationSensor::hasZ() const
 {
-    return m_sensor->property("hasZ").toBool();
+    return m_sensor->hasZ();
 }
 
 void QmlRotationSensor::_update()
diff --git a/src/imports/sensors/qmlrotationsensor.h b/src/imports/sensors/qmlrotationsensor.h
index db3b62f6ee3033e29c4a189b7a99b298752a9a0d..4d7b543ac0a75a2c22e379e1cc209b2602abba4b 100644
--- a/src/imports/sensors/qmlrotationsensor.h
+++ b/src/imports/sensors/qmlrotationsensor.h
@@ -44,7 +44,6 @@
 
 #include "qmlsensor.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QRotationSensor;
@@ -52,13 +51,15 @@ class QRotationSensor;
 class QmlRotationSensor : public QmlSensor
 {
     Q_OBJECT
-    Q_PROPERTY(bool hasZ READ hasZ)
+    Q_PROPERTY(bool hasZ READ hasZ NOTIFY hasZChanged)
 public:
     explicit QmlRotationSensor(QObject *parent = 0);
     ~QmlRotationSensor();
 
     bool hasZ() const;
 
+Q_SIGNALS:
+    void hasZChanged(bool hasZ);
 
 private:
     QSensor *sensor() const Q_DECL_OVERRIDE;
@@ -96,5 +97,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmlsensor.cpp b/src/imports/sensors/qmlsensor.cpp
index ec1b0691321f9147b37ceb1b88fa924827fc2465..3d59a72dd2d6e82304f6a116d259405f3760e114 100644
--- a/src/imports/sensors/qmlsensor.cpp
+++ b/src/imports/sensors/qmlsensor.cpp
@@ -170,6 +170,25 @@ void QmlSensor::setAlwaysOn(bool alwaysOn)
     sensor()->setAlwaysOn(alwaysOn);
 }
 
+/*!
+    \qmlproperty bool Sensor::skipDuplicates
+    \since QtSensors 5.1
+
+    This property indicates whether duplicate reading values should be omitted.
+
+    Please see QSensor::skipDuplicates for information about this property.
+*/
+
+bool QmlSensor::skipDuplicates() const
+{
+    return sensor()->skipDuplicates();
+}
+
+void QmlSensor::setSkipDuplicates(bool skipDuplicates)
+{
+    sensor()->setSkipDuplicates(skipDuplicates);
+}
+
 /*!
     \qmlproperty list<Range> Sensor::availableDataRates
     This property holds the data rates that the sensor supports.
@@ -287,6 +306,99 @@ QmlSensorReading *QmlSensor::reading() const
     return m_reading;
 }
 
+/*!
+    \qmlproperty Sensor::AxesOrientationMode Sensor::axesOrientationMode
+    \since QtSensors 5.1
+    This property holds the mode that affects how the screen orientation changes reading values.
+
+    Please see QSensor::axesOrientationMode for information about this property.
+*/
+
+QmlSensor::AxesOrientationMode QmlSensor::axesOrientationMode() const
+{
+    return static_cast<QmlSensor::AxesOrientationMode>(sensor()->axesOrientationMode());
+}
+
+void QmlSensor::setAxesOrientationMode(QmlSensor::AxesOrientationMode axesOrientationMode)
+{
+    sensor()->setAxesOrientationMode(static_cast<QSensor::AxesOrientationMode>(axesOrientationMode));
+}
+
+/*!
+    \qmlproperty int Sensor::currentOrientation
+    \since QtSensors 5.1
+    This property holds the current orientation that is used for rotating the reading values.
+
+    Please see QSensor::currentOrientation for information about this property.
+*/
+
+int QmlSensor::currentOrientation() const
+{
+    return sensor()->currentOrientation();
+}
+
+/*!
+    \qmlproperty int Sensor::userOrientation
+    \since QtSensors 5.1
+    This property holds the angle used for rotating the reading values in the UserOrientation mode.
+
+    Please see QSensor::userOrientation for information about this property.
+*/
+
+int QmlSensor::userOrientation() const
+{
+    return sensor()->userOrientation();
+}
+
+void QmlSensor::setUserOrientation(int userOrientation)
+{
+    sensor()->setUserOrientation(userOrientation);
+}
+
+/*!
+    \qmlproperty int Sensor::maxBufferSize
+    \since QtSensors 5.1
+    This property holds the maximum buffer size.
+
+    Please see QSensor::maxBufferSize for information about this property.
+*/
+
+int QmlSensor::maxBufferSize() const
+{
+    return sensor()->maxBufferSize();
+}
+
+/*!
+    \qmlproperty int Sensor::efficientBufferSize
+    \since QtSensors 5.1
+    The property holds the most efficient buffer size.
+
+    Please see QSensor::efficientBufferSize for information about this property.
+*/
+
+int QmlSensor::efficientBufferSize() const
+{
+    return sensor()->efficientBufferSize();
+}
+
+/*!
+    \qmlproperty int Sensor::bufferSize
+    \since QtSensors 5.1
+    This property holds the size of the buffer.
+
+    Please see QSensor::bufferSize for information about this property.
+*/
+
+int QmlSensor::bufferSize() const
+{
+    return sensor()->bufferSize();
+}
+
+void QmlSensor::setBufferSize(int bufferSize)
+{
+    sensor()->setBufferSize(bufferSize);
+}
+
 /*!
     \qmlmethod bool Sensor::start()
     Start retrieving values from the sensor. Returns true if the sensor was started, false otherwise.
@@ -323,6 +435,14 @@ void QmlSensor::componentComplete()
     connect(sensor(), SIGNAL(sensorError(int)), this, SIGNAL(errorChanged()));
     connect(sensor(), SIGNAL(activeChanged()), this, SIGNAL(activeChanged()));
     connect(sensor(), SIGNAL(alwaysOnChanged()), this, SIGNAL(alwaysOnChanged()));
+    connect(sensor(), SIGNAL(skipDuplicatesChanged(bool)), this, SIGNAL(skipDuplicatesChanged(bool)));
+    connect(sensor(), SIGNAL(axesOrientationModeChanged(AxesOrientationMode)),
+            this, SIGNAL(axesOrientationModeChanged(AxesOrientationMode)));
+    connect(sensor(), SIGNAL(userOrientationChanged(int)), this, SIGNAL(userOrientationChanged(int)));
+    connect(sensor(), SIGNAL(currentOrientationChanged(int)), this, SIGNAL(currentOrientationChanged(int)));
+    connect(sensor(), SIGNAL(bufferSizeChanged(int)), this, SIGNAL(bufferSizeChanged(int)));
+    connect(sensor(), SIGNAL(maxBufferSizeChanged(int)), this, SIGNAL(maxBufferSizeChanged(int)));
+    connect(sensor(), SIGNAL(efficientBufferSizeChanged(int)), this, SIGNAL(efficientBufferSizeChanged(int)));
 
     // We need to set this on the sensor object now
     sensor()->setIdentifier(m_identifier.toLocal8Bit());
diff --git a/src/imports/sensors/qmlsensor.h b/src/imports/sensors/qmlsensor.h
index a4ac852db9b53027748b1de647e56b6519e8f74a..f72234ae6b8558cddd5885536da256e0bd49af5c 100644
--- a/src/imports/sensors/qmlsensor.h
+++ b/src/imports/sensors/qmlsensor.h
@@ -46,7 +46,6 @@
 #include <QQmlListProperty>
 #include "qmlsensorrange.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QSensor;
@@ -57,6 +56,7 @@ class QmlSensorReading;
 class QmlSensor : public QObject, public QQmlParserStatus
 {
     Q_OBJECT
+    Q_ENUMS(AxesOrientationMode)
     Q_INTERFACES(QQmlParserStatus)
     Q_PROPERTY(QString identifier READ identifier WRITE setIdentifier NOTIFY identifierChanged)
     Q_PROPERTY(QString type READ type NOTIFY typeChanged)
@@ -71,7 +71,22 @@ class QmlSensor : public QObject, public QQmlParserStatus
     Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
     Q_PROPERTY(int error READ error NOTIFY errorChanged)
     Q_PROPERTY(bool alwaysOn READ isAlwaysOn WRITE setAlwaysOn NOTIFY alwaysOnChanged)
+    Q_PROPERTY(bool skipDuplicates READ skipDuplicates WRITE setSkipDuplicates NOTIFY skipDuplicatesChanged REVISION 1)
+    Q_PROPERTY(AxesOrientationMode axesOrientationMode READ axesOrientationMode WRITE setAxesOrientationMode NOTIFY axesOrientationModeChanged REVISION 1)
+    Q_PROPERTY(int currentOrientation READ currentOrientation NOTIFY currentOrientationChanged REVISION 1)
+    Q_PROPERTY(int userOrientation READ userOrientation WRITE setUserOrientation NOTIFY userOrientationChanged REVISION 1)
+    Q_PROPERTY(int maxBufferSize READ maxBufferSize NOTIFY maxBufferSizeChanged REVISION 1)
+    Q_PROPERTY(int efficientBufferSize READ efficientBufferSize NOTIFY efficientBufferSizeChanged REVISION 1)
+    Q_PROPERTY(int bufferSize READ bufferSize WRITE setBufferSize NOTIFY bufferSizeChanged REVISION 1)
+
 public:
+    // Keep in sync with QSensor::AxesOrientationMode
+    enum AxesOrientationMode {
+        FixedOrientation,
+        AutomaticOrientation,
+        UserOrientation
+    };
+
     explicit QmlSensor(QObject *parent = 0);
     ~QmlSensor();
 
@@ -90,6 +105,9 @@ public:
     bool isAlwaysOn() const;
     void setAlwaysOn(bool alwaysOn);
 
+    bool skipDuplicates() const;
+    void setSkipDuplicates(bool skipDuplicates);
+
     QQmlListProperty<QmlSensorRange> availableDataRates() const;
     int dataRate() const;
     void setDataRate(int rate);
@@ -103,6 +121,21 @@ public:
 
     QmlSensorReading *reading() const;
 
+    AxesOrientationMode axesOrientationMode() const;
+    void setAxesOrientationMode(AxesOrientationMode axesOrientationMode);
+
+    int currentOrientation() const;
+
+    int userOrientation() const;
+    void setUserOrientation(int userOrientation);
+
+    int maxBufferSize() const;
+
+    int efficientBufferSize() const;
+
+    int bufferSize() const;
+    void setBufferSize(int bufferSize);
+
 public Q_SLOTS:
     bool start();
     void stop();
@@ -120,6 +153,13 @@ Q_SIGNALS:
     void descriptionChanged();
     void errorChanged();
     void alwaysOnChanged();
+    void skipDuplicatesChanged(bool skipDuplicates);
+    void axesOrientationModeChanged(AxesOrientationMode axesOrientationMode);
+    void currentOrientationChanged(int currentOrientation);
+    void userOrientationChanged(int userOrientation);
+    void maxBufferSizeChanged(int maxBufferSize);
+    void efficientBufferSizeChanged(int efficientBufferSize);
+    void bufferSizeChanged(int bufferSize);
 
 protected:
     virtual QSensor *sensor() const = 0;
@@ -127,6 +167,8 @@ protected:
 
 private Q_SLOTS:
     void updateReading();
+
+protected Q_SLOTS:
     void componentComplete();
 
 private:
@@ -159,6 +201,5 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
diff --git a/src/imports/sensors/qmlsensorglobal.h b/src/imports/sensors/qmlsensorglobal.h
index fbbd30d7b2027eeec0cc67d5a664a4bf35024bf7..cd28ffefed25740f4f8638b1f9de00dc36aa97ef 100644
--- a/src/imports/sensors/qmlsensorglobal.h
+++ b/src/imports/sensors/qmlsensorglobal.h
@@ -45,7 +45,6 @@
 #include <QObject>
 #include <QStringList>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QSensor;
@@ -69,6 +68,5 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
diff --git a/src/imports/sensors/qmlsensorrange.h b/src/imports/sensors/qmlsensorrange.h
index 261825b54a16f36d0eb989b0860e817eb348cde2..f2fcb5104298b2c8fecf41e972c6179236e700bb 100644
--- a/src/imports/sensors/qmlsensorrange.h
+++ b/src/imports/sensors/qmlsensorrange.h
@@ -44,7 +44,6 @@
 
 #include <QObject>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QmlSensorRange : public QObject
@@ -94,5 +93,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmltapsensor.cpp b/src/imports/sensors/qmltapsensor.cpp
index 65afcb599637a361e4edbbb8aff91dc7905b564c..8877b0b0265b7bcbbdb025b29d8e7749ce248c97 100644
--- a/src/imports/sensors/qmltapsensor.cpp
+++ b/src/imports/sensors/qmltapsensor.cpp
@@ -65,6 +65,8 @@ QmlTapSensor::QmlTapSensor(QObject *parent)
     : QmlSensor(parent)
     , m_sensor(new QTapSensor(this))
 {
+    connect(m_sensor, SIGNAL(returnDoubleTapEventsChanged(bool)),
+            this, SIGNAL(returnDoubleTapEventsChanged(bool)));
 }
 
 QmlTapSensor::~QmlTapSensor()
@@ -90,14 +92,12 @@ QSensor *QmlTapSensor::sensor() const
 
 bool QmlTapSensor::returnDoubleTapEvents() const
 {
-    return m_sensor->property("returnDoubleTapEvents").toBool();
+    return m_sensor->returnDoubleTapEvents();
 }
 
 void QmlTapSensor::setReturnDoubleTapEvents(bool ret)
 {
-    if (m_sensor->property("returnDoubleTapEvents").toBool() == ret) return;
-    m_sensor->setProperty("returnDoubleTapEvents", ret);
-    Q_EMIT returnDoubleTapEventsChanged();
+    m_sensor->setReturnDoubleTapEvents(ret);
 }
 
 /*!
diff --git a/src/imports/sensors/qmltapsensor.h b/src/imports/sensors/qmltapsensor.h
index f9ae94bd779a874ca7cf0a79c2e9533946cc104c..b0c2fa5c19778dee13015f4d03d4447cbc073b12 100644
--- a/src/imports/sensors/qmltapsensor.h
+++ b/src/imports/sensors/qmltapsensor.h
@@ -45,7 +45,6 @@
 #include "qmlsensor.h"
 #include <QTapSensor>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QTapSensor;
@@ -61,9 +60,8 @@ public:
     bool returnDoubleTapEvents() const;
     void setReturnDoubleTapEvents(bool ret);
 
-
 Q_SIGNALS:
-    void returnDoubleTapEventsChanged();
+    void returnDoubleTapEventsChanged(bool returnDoubleTapEvents);
 
 private:
     QSensor *sensor() const Q_DECL_OVERRIDE;
@@ -97,5 +95,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/qmltiltsensor.h b/src/imports/sensors/qmltiltsensor.h
index 9afed564996e166016fe8bdd482f141b44e7140b..422c21dd574f5d52675d84d3eb061c171825812b 100644
--- a/src/imports/sensors/qmltiltsensor.h
+++ b/src/imports/sensors/qmltiltsensor.h
@@ -45,7 +45,6 @@
 #include "qmlsensor.h"
 #include <QtSensors/QTiltSensor>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QTiltSensor;
@@ -90,5 +89,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/imports/sensors/sensors.cpp b/src/imports/sensors/sensors.cpp
index 50ccdf938e3a0a349608dbc9284c94c0b7fb8de4..77ad754a8f2af47d3f9537acf0476105fc8f8265 100644
--- a/src/imports/sensors/sensors.cpp
+++ b/src/imports/sensors/sensors.cpp
@@ -44,7 +44,9 @@
 #include <QtSensors/QSensorManager>
 
 #include <QtSensors/qaccelerometer.h>
+#include <QtSensors/qaltimeter.h>
 #include <QtSensors/qambientlightsensor.h>
+#include <QtSensors/qambienttemperaturesensor.h>
 #include <QtSensors/qcompass.h>
 #include <QtSensors/qmagnetometer.h>
 #include <QtSensors/qorientationsensor.h>
@@ -59,13 +61,17 @@
 #include "qmlsensorglobal.h"
 #include "qmlsensor.h"
 #include "qmlaccelerometer.h"
+#include "qmlaltimeter.h"
 #include "qmlambientlightsensor.h"
+#include "qmlambienttemperaturesensor.h"
 #include "qmlcompass.h"
 #include "qmlgyroscope.h"
+#include "qmlholstersensor.h"
 #include "qmlirproximitysensor.h"
 #include "qmllightsensor.h"
 #include "qmlmagnetometer.h"
 #include "qmlorientationsensor.h"
+#include "qmlpressuresensor.h"
 #include "qmlproximitysensor.h"
 #include "qmlrotationsensor.h"
 #include "qmltapsensor.h"
@@ -125,6 +131,49 @@ public:
         qmlRegisterUncreatableType<QmlTiltSensorReading        >(package, major, minor, "TiltReading",          QLatin1String("Cannot create TiltReading"));
 
         qmlRegisterType           <QmlSensorGesture            >(package, major, minor, "SensorGesture");
+
+        // Register the 5.1 interfaces
+        major = 5;
+        minor = 1;
+        qmlRegisterSingletonType  <QmlSensorGlobal             >(package, major, minor, "QmlSensors", global_object_50);
+        qmlRegisterUncreatableType<QmlSensorRange              >(package, major, minor, "Range",                QLatin1String("Cannot create Range"));
+        qmlRegisterUncreatableType<QmlSensorOutputRange        >(package, major, minor, "OutputRange",          QLatin1String("Cannot create OutputRange"));
+        qmlRegisterUncreatableType<QmlSensor,1                 >(package, major, minor, "Sensor",               QLatin1String("Cannot create Sensor"));
+        qmlRegisterUncreatableType<QmlSensorReading            >(package, major, minor, "SensorReading",        QLatin1String("Cannot create SensorReading"));
+        qmlRegisterType           <QmlAccelerometer,1          >(package, major, minor, "Accelerometer");
+        qmlRegisterUncreatableType<QmlAccelerometerReading     >(package, major, minor, "AccelerometerReading", QLatin1String("Cannot create AccelerometerReading"));
+        qmlRegisterType           <QmlAltimeter                >(package, major, minor, "Altimeter");
+        qmlRegisterUncreatableType<QmlAltimeterReading         >(package, major, minor, "AltimeterReading", QLatin1String("Cannot create AltimeterReading"));
+        qmlRegisterType           <QmlAmbientLightSensor       >(package, major, minor, "AmbientLightSensor");
+        qmlRegisterUncreatableType<QmlAmbientLightSensorReading>(package, major, minor, "AmbientLightReading",  QLatin1String("Cannot create AmbientLightReading"));
+        qmlRegisterType           <QmlAmbientTemperatureSensor >(package, major, minor, "AmbientTemperatureSensor");
+        qmlRegisterUncreatableType<QmlAmbientTemperatureReading>(package, major, minor, "AmbientTemperatureReading",  QLatin1String("Cannot create AmbientTemperatureReading"));
+        qmlRegisterType           <QmlCompass                  >(package, major, minor, "Compass");
+        qmlRegisterUncreatableType<QmlCompassReading           >(package, major, minor, "CompassReading",       QLatin1String("Cannot create CompassReading"));
+        qmlRegisterType           <QmlGyroscope                >(package, major, minor, "Gyroscope");
+        qmlRegisterUncreatableType<QmlGyroscopeReading         >(package, major, minor, "GyroscopeReading",     QLatin1String("Cannot create GyroscopeReading"));
+        qmlRegisterType           <QmlHolsterSensor            >(package, major, minor, "HolsterSensor");
+        qmlRegisterUncreatableType<QmlHolsterReading           >(package, major, minor, "HolsterReading",       QLatin1String("Cannot create HolsterReading"));
+        qmlRegisterType           <QmlIRProximitySensor        >(package, major, minor, "IRProximitySensor");
+        qmlRegisterUncreatableType<QmlIRProximitySensorReading >(package, major, minor, "IRProximityReading",   QLatin1String("Cannot create IRProximityReading"));
+        qmlRegisterType           <QmlLightSensor              >(package, major, minor, "LightSensor");
+        qmlRegisterUncreatableType<QmlLightSensorReading       >(package, major, minor, "LightReading",         QLatin1String("Cannot create LightReading"));
+        qmlRegisterType           <QmlMagnetometer             >(package, major, minor, "Magnetometer");
+        qmlRegisterUncreatableType<QmlMagnetometerReading      >(package, major, minor, "MagnetometerReading",  QLatin1String("Cannot create MagnetometerReading"));
+        qmlRegisterType           <QmlOrientationSensor        >(package, major, minor, "OrientationSensor");
+        qmlRegisterUncreatableType<QmlOrientationSensorReading >(package, major, minor, "OrientationReading",   QLatin1String("Cannot create OrientationReading"));
+        qmlRegisterType           <QmlPressureSensor           >(package, major, minor, "PressureSensor");
+        qmlRegisterUncreatableType<QmlPressureReading          >(package, major, minor, "PressureReading",      QLatin1String("Cannot create PressureReading"));
+        qmlRegisterType           <QmlProximitySensor          >(package, major, minor, "ProximitySensor");
+        qmlRegisterUncreatableType<QmlProximitySensorReading   >(package, major, minor, "ProximityReading",     QLatin1String("Cannot create ProximityReading"));
+        qmlRegisterType           <QmlRotationSensor           >(package, major, minor, "RotationSensor");
+        qmlRegisterUncreatableType<QmlRotationSensorReading    >(package, major, minor, "RotationReading",      QLatin1String("Cannot create RotationReading"));
+        qmlRegisterType           <QmlTapSensor                >(package, major, minor, "TapSensor");
+        qmlRegisterUncreatableType<QmlTapSensorReading         >(package, major, minor, "TapReading",           QLatin1String("Cannot create TapReading"));
+        qmlRegisterType           <QmlTiltSensor               >(package, major, minor, "TiltSensor");
+        qmlRegisterUncreatableType<QmlTiltSensorReading        >(package, major, minor, "TiltReading",          QLatin1String("Cannot create TiltReading"));
+
+        qmlRegisterType           <QmlSensorGesture            >(package, major, minor, "SensorGesture");
     }
 };
 
diff --git a/src/imports/sensors/sensors.pro b/src/imports/sensors/sensors.pro
index 210ceac11bebf683038aa96a0d236f215fe98f44..2236ce115228fcb83c47d4a671dff8e0504bf1c6 100644
--- a/src/imports/sensors/sensors.pro
+++ b/src/imports/sensors/sensors.pro
@@ -1,7 +1,7 @@
 CXX_MODULE = sensors
 TARGET  = declarative_sensors
 TARGETPATH = QtSensors
-IMPORT_VERSION = 5.0 # Doesn't matter, as long as it's a valid version?!
+IMPORT_VERSION = 5.1 # Doesn't matter, as long as it's a valid version?!
 
 QT += qml sensors sensors-private
 
@@ -9,13 +9,17 @@ HEADERS += \
     qmlsensor.h \
     qmlsensorrange.h \
     qmlaccelerometer.h \
+    qmlaltimeter.h \
     qmlambientlightsensor.h \
+    qmlambienttemperaturesensor.h \
     qmlcompass.h \
     qmlgyroscope.h \
+    qmlholstersensor.h \
     qmlirproximitysensor.h \
     qmllightsensor.h \
     qmlmagnetometer.h \
     qmlorientationsensor.h \
+    qmlpressuresensor.h\
     qmlproximitysensor.h \
     qmltapsensor.h \
     qmlrotationsensor.h \
@@ -27,13 +31,17 @@ SOURCES += sensors.cpp \
     qmlsensor.cpp \
     qmlsensorrange.cpp \
     qmlaccelerometer.cpp \
+    qmlaltimeter.cpp \
     qmlambientlightsensor.cpp \
+    qmlambienttemperaturesensor.cpp \
     qmlcompass.cpp \
     qmlgyroscope.cpp \
+    qmlholstersensor.cpp \
     qmlirproximitysensor.cpp \
     qmllightsensor.cpp \
     qmlmagnetometer.cpp \
     qmlorientationsensor.cpp \
+    qmlpressuresensor.cpp\
     qmlproximitysensor.cpp \
     qmltapsensor.cpp \
     qmlrotationsensor.cpp \
diff --git a/src/plugins/sensors/android/android.pro b/src/plugins/sensors/android/android.pro
new file mode 100644
index 0000000000000000000000000000000000000000..0dc6a3fcb8fc24f232045741dea6709a25fb03fc
--- /dev/null
+++ b/src/plugins/sensors/android/android.pro
@@ -0,0 +1,2 @@
+TEMPLATE = subdirs
+SUBDIRS += jar src
diff --git a/src/plugins/sensors/android/jar/AndroidManifest.xml b/src/plugins/sensors/android/jar/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5d15cab2fb18ab13222252d98d7a982b03b0c7e2
--- /dev/null
+++ b/src/plugins/sensors/android/jar/AndroidManifest.xml
@@ -0,0 +1,6 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="org.qtproject.qt5.android.sensors"
+    android:versionCode="1"
+    android:versionName="1.0" >
+    <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
+</manifest>
diff --git a/src/plugins/sensors/android/jar/jar.pro b/src/plugins/sensors/android/jar/jar.pro
new file mode 100644
index 0000000000000000000000000000000000000000..a93507435ec2ff474e0be28fa88bc605198efa53
--- /dev/null
+++ b/src/plugins/sensors/android/jar/jar.pro
@@ -0,0 +1,10 @@
+load(qt_build_paths)
+
+CONFIG += java
+TARGET = QtSensors
+DESTDIR = $$MODULE_BASE_OUTDIR/jar
+
+JAVACLASSPATH += $$PWD/src
+
+JAVASOURCES += \
+    $$PWD/src/org/qtproject/qt5/android/sensors/QtSensors.java
diff --git a/src/plugins/sensors/android/jar/src/org/qtproject/qt5/android/sensors/QtSensors.java b/src/plugins/sensors/android/jar/src/org/qtproject/qt5/android/sensors/QtSensors.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7956d2dccc445463e9bf58714c4e5aaab954f89
--- /dev/null
+++ b/src/plugins/sensors/android/jar/src/org/qtproject/qt5/android/sensors/QtSensors.java
@@ -0,0 +1,161 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensor module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+package org.qtproject.qt5.android.sensors;
+
+import java.util.HashSet;
+import java.util.List;
+
+import android.app.Activity;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.os.Build;
+import android.util.SparseArray;
+
+import android.util.Log;
+
+public class QtSensors implements SensorEventListener
+{
+    static final QtSensors m_sensorsListener = new QtSensors();
+    static SensorManager m_sensorManager = null;
+    static SparseArray<Sensor> m_registeredSensors = new SparseArray<Sensor>();
+    static Object m_syncObject = new Object();
+    static public void setActivity(Activity activity, Object acitvityDelegate)
+    {
+        try {
+            m_sensorManager = (SensorManager)activity.getSystemService(Activity.SENSOR_SERVICE);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private static String getSensorDescription(int sensorType)
+    {
+        try {
+            Sensor s  = m_sensorManager.getDefaultSensor(sensorType);
+            return s.getName() + " " + s.getVendor() + " v" + s.getVersion();
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private static int[] getSensorList()
+    {
+        try {
+            List<Sensor> list = m_sensorManager.getSensorList(Sensor.TYPE_ALL);
+            HashSet<Integer> filteredList = new HashSet<Integer>();
+            for (Sensor s : list)
+                filteredList.add(s.getType());
+            int retList[] = new int[filteredList.size()];
+            int pos = 0;
+            for (int type : filteredList)
+                retList[pos++] = type;
+            return retList;
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private static boolean registerSensor(int sensorType, int rate)
+    {
+        synchronized (m_syncObject) {
+            try {
+                Sensor s  = m_sensorManager.getDefaultSensor(sensorType);
+                m_sensorManager.registerListener(m_sensorsListener, s, rate);
+                m_registeredSensors.put(sensorType, s);
+            } catch(Exception e) {
+                e.printStackTrace();
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static boolean unregisterSensor(int sensorType)
+    {
+        synchronized (m_syncObject) {
+            try {
+                Sensor s = m_registeredSensors.get(sensorType);
+                if (s != null) {
+                    m_sensorManager.unregisterListener(m_sensorsListener, m_registeredSensors.get(sensorType));
+                    m_registeredSensors.remove(sensorType);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static float[] convertQuaternionToEuler(float[] rotationVector)
+    {
+        float matrix[] = new float[9];
+        SensorManager.getRotationMatrixFromVector (matrix, rotationVector);
+        float angles[] = new float[3];
+        SensorManager.getOrientation (matrix, angles);
+        return angles;
+    }
+
+    public static native void accuracyChanged(int sensorType, int accuracy);
+    public static native void sensorChanged(int sensorType, long timestamp, float[] values);
+
+    @Override
+    public void onAccuracyChanged(Sensor sensor, int accuracy)
+    {
+        accuracyChanged(sensor.getType(), accuracy);
+    }
+
+    @Override
+    public void onSensorChanged(SensorEvent sensorEvent)
+    {
+        if (sensorEvent.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
+            //#### hacky, but much easier than exposing the convert function and converting the arrays back and forth...
+            sensorChanged(sensorEvent.sensor.getType(), sensorEvent.timestamp, convertQuaternionToEuler(sensorEvent.values));
+        } else {
+            sensorChanged(sensorEvent.sensor.getType(), sensorEvent.timestamp, sensorEvent.values);
+        }
+    }
+}
diff --git a/src/plugins/sensors/android/src/androidaccelerometer.cpp b/src/plugins/sensors/android/src/androidaccelerometer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b64536ef27985023861adb59d4ca56a7c8e7f4a3
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidaccelerometer.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "androidaccelerometer.h"
+
+AndroidAccelerometer::AndroidAccelerometer(AndroidSensors::AndroidSensorType type, QSensor *sensor)
+    : AndroidCommonSensor<QAccelerometerReading>(type, sensor)
+{}
+
+void AndroidAccelerometer::onSensorChanged(jlong timestamp, const jfloat *values, uint size)
+{
+    if (size < 3)
+        return;
+    m_reader.setTimestamp(timestamp);
+    // check https://developer.android.com/reference/android/hardware/SensorEvent.html#values
+    m_reader.setX(values[0]);
+    m_reader.setY(values[1]);
+    m_reader.setZ(values[2]);
+    newReadingAvailable();
+}
+
+void AndroidAccelerometer::onAccuracyChanged(jint accuracy)
+{
+    Q_UNUSED(accuracy)
+}
diff --git a/src/plugins/sensors/android/src/androidaccelerometer.h b/src/plugins/sensors/android/src/androidaccelerometer.h
new file mode 100644
index 0000000000000000000000000000000000000000..6c95fdb3b00fdd5e431cc9479398febf42fc573d
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidaccelerometer.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ANDROIDACCELEROMETER_H
+#define ANDROIDACCELEROMETER_H
+#include <qaccelerometer.h>
+
+#include "androidcommonsensor.h"
+
+class AndroidAccelerometer : public AndroidCommonSensor<QAccelerometerReading>
+{
+public:
+    AndroidAccelerometer(AndroidSensors::AndroidSensorType type, QSensor *sensor);
+
+private:
+    virtual void onAccuracyChanged(jint accuracy);
+    virtual void onSensorChanged(jlong timestamp, const jfloat *values, uint size);
+
+};
+
+#endif // ANDROIDACCELEROMETER_H
diff --git a/src/plugins/sensors/android/src/androidcommonsensor.h b/src/plugins/sensors/android/src/androidcommonsensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..40f118ed98a88d3f7a0a25a58784697bda07e8f8
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidcommonsensor.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ANDROIDCOMMONSENSOR_H
+#define ANDROIDCOMMONSENSOR_H
+
+#include <qsensorbackend.h>
+#include <qsensor.h>
+#include "androidjnisensors.h"
+
+template <typename ReaderType>
+class AndroidCommonSensor : public QSensorBackend, protected AndroidSensors::AndroidSensorsListenerInterface
+{
+public:
+    AndroidCommonSensor(AndroidSensors::AndroidSensorType type, QSensor *sensor) : QSensorBackend(sensor)
+    {
+        setDescription(AndroidSensors::sensorDescription(type));
+        setReading<ReaderType>(&m_reader);
+        m_type = type;
+        m_isStarted = false;
+    }
+
+    virtual ~AndroidCommonSensor()
+    {
+        if (m_isStarted)
+            stop();
+    }
+    virtual void start()
+    {
+        if (AndroidSensors::registerListener(m_type, this, sensor()->dataRate()))
+            m_isStarted = true;
+    }
+
+    virtual void stop()
+    {
+        if (m_isStarted) {
+            m_isStarted = false;
+            AndroidSensors::unregisterListener(m_type, this);
+        }
+    }
+
+protected:
+    ReaderType m_reader;
+
+private:
+    AndroidSensors::AndroidSensorType m_type;
+    bool m_isStarted;
+};
+
+#endif // ANDROIDCOMMONSENSOR_H
diff --git a/src/plugins/sensors/android/src/androidgyroscope.cpp b/src/plugins/sensors/android/src/androidgyroscope.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..69a05c189a53801f958bfce65717353b216ea919
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidgyroscope.cpp
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "androidgyroscope.h"
+#include <math.h>
+
+AndroidGyroscope::AndroidGyroscope(AndroidSensors::AndroidSensorType type, QSensor *sensor)
+    : AndroidCommonSensor<QGyroscopeReading>(type, sensor)
+{}
+
+void AndroidGyroscope::onSensorChanged(jlong timestamp, const jfloat *values, uint size)
+{
+    if (size < 3)
+        return;
+    m_reader.setTimestamp(timestamp);
+    // check https://developer.android.com/reference/android/hardware/SensorEvent.html#values
+    m_reader.setX(values[0]*180/M_PI);
+    m_reader.setY(values[1]*180/M_PI);
+    m_reader.setZ(values[2]*180/M_PI);
+    newReadingAvailable();
+}
+
+void AndroidGyroscope::onAccuracyChanged(jint accuracy)
+{
+    Q_UNUSED(accuracy)
+}
diff --git a/src/plugins/sensors/android/src/androidgyroscope.h b/src/plugins/sensors/android/src/androidgyroscope.h
new file mode 100644
index 0000000000000000000000000000000000000000..3b633b7c3369ad57a14efc94c9f5666f310ab0b9
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidgyroscope.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ANDROIDGYROSCOPE_H
+#define ANDROIDGYROSCOPE_H
+#include <qgyroscope.h>
+
+#include "androidcommonsensor.h"
+
+class AndroidGyroscope : public AndroidCommonSensor<QGyroscopeReading>
+{
+public:
+    AndroidGyroscope(AndroidSensors::AndroidSensorType type, QSensor *sensor);
+private:
+    virtual void onAccuracyChanged(jint accuracy);
+    virtual void onSensorChanged(jlong timestamp, const jfloat *values, uint size);
+};
+
+#endif // ANDROIDGYROSCOPE_H
diff --git a/src/plugins/sensors/android/src/androidjnisensors.cpp b/src/plugins/sensors/android/src/androidjnisensors.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6365433cfed086b800ba6b1d96466f06257efd0e
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidjnisensors.cpp
@@ -0,0 +1,245 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qglobal.h>
+#include <android/log.h>
+#include <QtCore/QReadWriteLock>
+#include <QtCore/QHash>
+
+#include "androidjnisensors.h"
+
+static JavaVM *javaVM = 0;
+jclass sensorsClass;
+
+static jmethodID getSensorListMethodId;
+static jmethodID registerSensorMethodId;
+static jmethodID unregisterSensorMethodId;
+static jmethodID getSensorDescriptionMethodId;
+
+static QHash<int, QList<AndroidSensors::AndroidSensorsListenerInterface *> > listenersHash;
+QReadWriteLock listenersLocker;
+enum {
+    SENSOR_DELAY_FASTEST = 0,
+    SENSOR_DELAY_GAME = 1,
+    SENSOR_DELAY_NORMAL = 3,
+    SENSOR_DELAY_UI =2
+};
+namespace AndroidSensors
+{
+    struct AttachedJNIEnv
+    {
+        AttachedJNIEnv()
+        {
+            attached = false;
+            if (javaVM->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) < 0) {
+                if (javaVM->AttachCurrentThread(&jniEnv, NULL) < 0) {
+                    __android_log_print(ANDROID_LOG_ERROR, "Qt", "AttachCurrentThread failed");
+                    jniEnv = 0;
+                    return;
+                }
+                attached = true;
+            }
+        }
+
+        ~AttachedJNIEnv()
+        {
+            if (attached)
+                javaVM->DetachCurrentThread();
+        }
+        bool attached;
+        JNIEnv *jniEnv;
+    };
+
+    QVector<AndroidSensorType> availableSensors()
+    {
+        QVector<AndroidSensorType> ret;
+        AttachedJNIEnv aenv;
+        if (!aenv.jniEnv)
+            return ret;
+        jintArray jsensors = static_cast<jintArray>(aenv.jniEnv->CallStaticObjectMethod(sensorsClass,
+                                                                                        getSensorListMethodId));
+        jint *sensors = aenv.jniEnv->GetIntArrayElements(jsensors, 0);
+        const uint sz = aenv.jniEnv->GetArrayLength(jsensors);
+        for (uint i = 0; i < sz; i++)
+            ret.push_back(AndroidSensorType(sensors[i]));
+        aenv.jniEnv->ReleaseIntArrayElements(jsensors, sensors, 0);
+        return ret;
+    }
+
+    QString sensorDescription(AndroidSensorType sensor)
+    {
+        AttachedJNIEnv aenv;
+        if (!aenv.jniEnv)
+            return QString();
+        jstring jstr = static_cast<jstring>(aenv.jniEnv->CallStaticObjectMethod(sensorsClass,
+                                                                                getSensorDescriptionMethodId,
+                                                                                jint(sensor)));
+        const jchar *pstr = aenv.jniEnv->GetStringChars(jstr, 0);
+        QString ret(reinterpret_cast<const QChar *>(pstr), aenv.jniEnv->GetStringLength(jstr));
+        aenv.jniEnv->ReleaseStringChars(jstr, pstr);
+        aenv.jniEnv->DeleteLocalRef(jstr);
+        return ret;
+    }
+
+    bool registerListener(AndroidSensorType sensor, AndroidSensorsListenerInterface *listener, int dataRate)
+    {
+        listenersLocker.lockForWrite();
+        bool startService = listenersHash[sensor].empty();
+        listenersHash[sensor].push_back(listener);
+        listenersLocker.unlock();
+        if (startService) {
+            AttachedJNIEnv aenv;
+            if (!aenv.jniEnv)
+                return false;
+            int rate = dataRate > 0 ? 1000000/dataRate : SENSOR_DELAY_GAME;
+            return aenv.jniEnv->CallStaticBooleanMethod(sensorsClass,
+                                                        registerSensorMethodId,
+                                                        jint(sensor),
+                                                        jint(rate));
+        }
+        return true;
+    }
+
+    bool unregisterListener(AndroidSensorType sensor, AndroidSensorsListenerInterface *listener)
+    {
+        listenersLocker.lockForWrite();
+        listenersHash[sensor].removeOne(listener);
+        bool stopService = listenersHash[sensor].empty();
+        if (stopService)
+            listenersHash.remove(sensor);
+        listenersLocker.unlock();
+        if (stopService) {
+            AttachedJNIEnv aenv;
+            if (!aenv.jniEnv)
+                return false;
+            return aenv.jniEnv->CallStaticBooleanMethod(sensorsClass, unregisterSensorMethodId, jint(sensor));
+        }
+        return true;
+    }
+}
+
+static const char logTag[] = "Qt";
+static const char classErrorMsg[] = "Can't find class \"%s\"";
+static const char methodErrorMsg[] = "Can't find method \"%s%s\"";
+
+static void accuracyChanged(JNIEnv * /*env*/, jobject /*thiz*/, jint sensor, jint accuracy)
+{
+    listenersLocker.lockForRead();
+    foreach (AndroidSensors::AndroidSensorsListenerInterface *listener, listenersHash[sensor])
+        listener->onAccuracyChanged(accuracy);
+    listenersLocker.unlock();
+}
+
+static void sensorChanged(JNIEnv *env, jobject /*thiz*/, jint sensor, jlong timeStamp, jfloatArray array)
+{
+    uint size = env->GetArrayLength(array);
+    jfloat *values = env->GetFloatArrayElements(array, 0);
+    listenersLocker.lockForRead();
+    foreach (AndroidSensors::AndroidSensorsListenerInterface *listener, listenersHash[sensor])
+        listener->onSensorChanged(timeStamp, values, size);
+    listenersLocker.unlock();
+    env->ReleaseFloatArrayElements(array, values, JNI_ABORT); // don't copy back the elements
+
+}
+
+static JNINativeMethod methods[] = {
+    {"accuracyChanged", "(II)V", (void *)accuracyChanged},
+    {"sensorChanged", "(IJ[F)V", (void *)sensorChanged}
+};
+
+#define FIND_AND_CHECK_CLASS(CLASS_NAME) \
+clazz = env->FindClass(CLASS_NAME); \
+if (!clazz) { \
+    __android_log_print(ANDROID_LOG_FATAL, logTag, classErrorMsg, CLASS_NAME); \
+    return JNI_FALSE; \
+}
+
+#define GET_AND_CHECK_STATIC_METHOD(VAR, CLASS, METHOD_NAME, METHOD_SIGNATURE) \
+VAR = env->GetStaticMethodID(CLASS, METHOD_NAME, METHOD_SIGNATURE); \
+if (!VAR) { \
+    __android_log_print(ANDROID_LOG_FATAL, logTag, methodErrorMsg, METHOD_NAME, METHOD_SIGNATURE); \
+    return JNI_FALSE; \
+}
+
+static bool registerNatives(JNIEnv *env)
+{
+    jclass clazz;
+    FIND_AND_CHECK_CLASS("org/qtproject/qt5/android/sensors/QtSensors");
+    sensorsClass = static_cast<jclass>(env->NewGlobalRef(clazz));
+
+    if (env->RegisterNatives(sensorsClass, methods, sizeof(methods) / sizeof(methods[0])) < 0) {
+        __android_log_print(ANDROID_LOG_FATAL, logTag, "RegisterNatives failed");
+        return JNI_FALSE;
+    }
+
+    GET_AND_CHECK_STATIC_METHOD(getSensorListMethodId, sensorsClass, "getSensorList", "()[I");
+    GET_AND_CHECK_STATIC_METHOD(registerSensorMethodId, sensorsClass, "registerSensor", "(II)Z");
+    GET_AND_CHECK_STATIC_METHOD(unregisterSensorMethodId, sensorsClass, "unregisterSensor", "(I)Z");
+    GET_AND_CHECK_STATIC_METHOD(getSensorDescriptionMethodId, sensorsClass, "getSensorDescription", "(I)Ljava/lang/String;");
+
+    return true;
+}
+
+Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/)
+{
+    typedef union {
+        JNIEnv *nativeEnvironment;
+        void *venv;
+    } UnionJNIEnvToVoid;
+
+    __android_log_print(ANDROID_LOG_INFO, logTag, "Sensors start");
+    UnionJNIEnvToVoid uenv;
+    uenv.venv = NULL;
+    javaVM = 0;
+
+    if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
+        __android_log_print(ANDROID_LOG_FATAL, logTag, "GetEnv failed");
+        return -1;
+    }
+    JNIEnv *env = uenv.nativeEnvironment;
+    if (!registerNatives(env)) {
+        __android_log_print(ANDROID_LOG_FATAL, logTag, "registerNatives failed");
+        return -1;
+    }
+
+    javaVM = vm;
+    return JNI_VERSION_1_4;
+}
diff --git a/src/plugins/sensors/android/src/androidjnisensors.h b/src/plugins/sensors/android/src/androidjnisensors.h
new file mode 100644
index 0000000000000000000000000000000000000000..53ca58d0f9aef6577ba33bcda9ceb6e370248601
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidjnisensors.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ANDROIDJNISENSORS_H
+#define ANDROIDJNISENSORS_H
+
+#include <jni.h>
+
+#include <QtCore/QVector>
+#include <QtCore/QString>
+
+namespace AndroidSensors
+{
+    // must be in sync with https://developer.android.com/reference/android/hardware/Sensor.html#TYPE_ACCELEROMETER
+    enum AndroidSensorType
+    {
+        TYPE_ACCELEROMETER = 1,
+        TYPE_AMBIENT_TEMPERATURE = 13,
+        TYPE_GRAVITY = 9,
+        TYPE_GYROSCOPE = 4,
+        TYPE_LIGHT = 5,
+        TYPE_LINEAR_ACCELERATION = 10,
+        TYPE_MAGNETIC_FIELD = 2,
+        TYPE_ORIENTATION = 3, //This constant was deprecated in API level 8. use SensorManager.getOrientation() instead.
+        TYPE_PRESSURE = 6,
+        TYPE_PROXIMITY = 8,
+        TYPE_RELATIVE_HUMIDITY = 12,
+        TYPE_ROTATION_VECTOR = 11,
+        TYPE_TEMPERATURE = 7 //This constant was deprecated in API level 14. use Sensor.TYPE_AMBIENT_TEMPERATURE instead.
+    };
+
+    struct AndroidSensorsListenerInterface
+    {
+        virtual ~AndroidSensorsListenerInterface() {}
+        virtual void onAccuracyChanged(jint accuracy) = 0;
+        virtual void onSensorChanged(jlong timestamp, const jfloat *values, uint size) = 0;
+    };
+
+    QVector<AndroidSensorType> availableSensors();
+    QString sensorDescription(AndroidSensorType sensor);
+    bool registerListener(AndroidSensorType sensor, AndroidSensorsListenerInterface *listener, int dataRate = 0);
+    bool unregisterListener(AndroidSensorType sensor, AndroidSensorsListenerInterface *listener);
+}
+
+#endif // ANDROIDJNISENSORS_H
diff --git a/src/plugins/sensors/android/src/androidlight.cpp b/src/plugins/sensors/android/src/androidlight.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..42295e549902d00636f6502bbd1367fd42ab8d54
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidlight.cpp
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "androidlight.h"
+
+AndroidLight::AndroidLight(AndroidSensors::AndroidSensorType type, QSensor *sensor)
+    : AndroidCommonSensor<QLightReading>(type, sensor)
+{}
+
+
+void AndroidLight::onAccuracyChanged(jint accuracy)
+{
+    Q_UNUSED(accuracy)
+}
+
+void AndroidLight::onSensorChanged(jlong timestamp, const jfloat *values, uint size)
+{
+    if (size < 1)
+        return;
+    m_reader.setTimestamp(timestamp);
+    // check https://developer.android.com/reference/android/hardware/SensorEvent.html#values
+    m_reader.setLux(values[0]);
+    newReadingAvailable();
+}
diff --git a/src/plugins/sensors/android/src/androidlight.h b/src/plugins/sensors/android/src/androidlight.h
new file mode 100644
index 0000000000000000000000000000000000000000..fdea3edb4965b5180116742b647f1ad4a63b68e1
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidlight.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ANDROIDLIGHT_H
+#define ANDROIDLIGHT_H
+#include <qlightsensor.h>
+
+#include "androidcommonsensor.h"
+
+class AndroidLight : public AndroidCommonSensor<QLightReading>
+{
+public:
+    AndroidLight(AndroidSensors::AndroidSensorType type, QSensor *sensor);
+private:
+    virtual void onAccuracyChanged(jint accuracy);
+    virtual void onSensorChanged(jlong timestamp, const jfloat *values, uint size);
+};
+
+#endif // ANDROIDLIGHT_H
diff --git a/src/plugins/sensors/android/src/androidmagnetometer.cpp b/src/plugins/sensors/android/src/androidmagnetometer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9175f584e3507742d05d5ee7c7790af1c4b3fa9d
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidmagnetometer.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "androidmagnetometer.h"
+
+AndroidMagnetometer::AndroidMagnetometer(AndroidSensors::AndroidSensorType type, QSensor *sensor)
+    :AndroidCommonSensor<QMagnetometerReading>(type, sensor)
+{}
+
+void AndroidMagnetometer::onAccuracyChanged(jint accuracy)
+{
+    m_reader.setCalibrationLevel(accuracy);
+}
+
+void AndroidMagnetometer::onSensorChanged(jlong timestamp, const jfloat *values, uint size)
+{
+    if (size<3)
+        return;
+    m_reader.setTimestamp(timestamp);
+    // check https://developer.android.com/reference/android/hardware/SensorEvent.html#values
+    m_reader.setX(values[0]/1e6);
+    m_reader.setY(values[1]/1e6);
+    m_reader.setZ(values[2]/1e6);
+    newReadingAvailable();
+}
diff --git a/src/plugins/sensors/android/src/androidmagnetometer.h b/src/plugins/sensors/android/src/androidmagnetometer.h
new file mode 100644
index 0000000000000000000000000000000000000000..57d9f36dc8a1e544d5154207356218c62f77f3f8
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidmagnetometer.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ANDROIDMAGNETOMETER_H
+#define ANDROIDMAGNETOMETER_H
+#include <qmagnetometer.h>
+
+#include "androidcommonsensor.h"
+
+class AndroidMagnetometer : public AndroidCommonSensor<QMagnetometerReading>
+{
+public:
+    AndroidMagnetometer(AndroidSensors::AndroidSensorType type, QSensor *sensor);
+private:
+    virtual void onAccuracyChanged(jint accuracy);
+    virtual void onSensorChanged(jlong timestamp, const jfloat *values, uint size);
+};
+
+#endif // ANDROIDMAGNETOMETER_H
diff --git a/src/plugins/sensors/android/src/androidrotation.cpp b/src/plugins/sensors/android/src/androidrotation.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..602575fe8f109e8811e441dedfc42202b9ebc946
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidrotation.cpp
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "androidrotation.h"
+#include <math.h>
+
+AndroidRotation::AndroidRotation(AndroidSensors::AndroidSensorType type, QSensor *sensor)
+    : AndroidCommonSensor<QRotationReading>(type, sensor)
+{}
+
+void AndroidRotation::onAccuracyChanged(jint accuracy)
+{
+    Q_UNUSED(accuracy)
+}
+
+void AndroidRotation::onSensorChanged(jlong timestamp, const jfloat *values, uint size)
+{
+    if (size < 3)
+        return;
+    m_reader.setTimestamp(timestamp);
+
+    float rz = -values[0]*180/M_PI;
+    float rx = -values[1]*180/M_PI;
+    float ry = values[2]*180/M_PI;
+    m_reader.setFromEuler(rx, ry, rz);
+    newReadingAvailable();
+}
diff --git a/src/plugins/sensors/android/src/androidrotation.h b/src/plugins/sensors/android/src/androidrotation.h
new file mode 100644
index 0000000000000000000000000000000000000000..cd2c4d656253e9ec912b279ef2d46260ec1e01d8
--- /dev/null
+++ b/src/plugins/sensors/android/src/androidrotation.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ANDROIDROTATION_H
+#define ANDROIDROTATION_H
+#include <qrotationsensor.h>
+
+#include "androidcommonsensor.h"
+class AndroidRotation : public AndroidCommonSensor<QRotationReading>
+{
+public:
+    AndroidRotation(AndroidSensors::AndroidSensorType type, QSensor *sensor);
+private:
+    virtual void onAccuracyChanged(jint accuracy);
+    virtual void onSensorChanged(jlong timestamp, const jfloat *values, uint size);
+};
+
+#endif // ANDROIDROTATION_H
diff --git a/src/plugins/sensors/android/src/main.cpp b/src/plugins/sensors/android/src/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0cb4de4944c793eb48224e444033f3ec02a6d589
--- /dev/null
+++ b/src/plugins/sensors/android/src/main.cpp
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qplugin.h>
+#include <qsensorplugin.h>
+#include <qsensorbackend.h>
+#include <qsensormanager.h>
+#include "androidaccelerometer.h"
+#include "androidgyroscope.h"
+#include "androidlight.h"
+#include "androidmagnetometer.h"
+#include "androidrotation.h"
+
+using namespace AndroidSensors;
+
+class AndroidSensorPlugin : public QObject, public QSensorPluginInterface, public QSensorBackendFactory
+{
+    Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QSensorPluginInterface/1.0" FILE "plugin.json")
+    Q_INTERFACES(QSensorPluginInterface)
+public:
+    void registerSensors()
+    {
+        foreach (AndroidSensorType sensor, availableSensors()) {
+            switch (sensor) {
+            case TYPE_ACCELEROMETER:
+                QSensorManager::registerBackend(QAccelerometer::type, QByteArray::number(sensor), this);
+                break;
+            case TYPE_AMBIENT_TEMPERATURE:
+            case TYPE_TEMPERATURE:
+                break; // add the temperature sensor backend
+            case TYPE_GRAVITY:
+                break; // add the gravity sensor backend
+            case TYPE_GYROSCOPE:
+                QSensorManager::registerBackend(QGyroscope::type, QByteArray::number(sensor), this);
+                break;
+            case TYPE_LIGHT:
+                QSensorManager::registerBackend(QLightSensor::type, QByteArray::number(sensor), this);
+                break; // add the light sensor backend
+            case TYPE_LINEAR_ACCELERATION:
+                break; // add the linear acceleration sensor backend
+            case TYPE_MAGNETIC_FIELD:
+                QSensorManager::registerBackend(QMagnetometer::type, QByteArray::number(sensor), this);
+                break;
+            case TYPE_ORIENTATION:
+                break; // add the orientation sensor backend
+            case TYPE_PRESSURE:
+                break; // add the pressure sensor backend
+            case TYPE_PROXIMITY:
+                break; // add the proximity sensor backend
+            case TYPE_RELATIVE_HUMIDITY:
+                break; // add the relative humidity sensor backend
+            case TYPE_ROTATION_VECTOR:
+                QSensorManager::registerBackend(QRotationSensor::type, QByteArray::number(sensor), this);
+                break;
+            }
+        }
+    }
+
+    QSensorBackend *createBackend(QSensor *sensor)
+    {
+        AndroidSensorType type = static_cast<AndroidSensorType>(sensor->identifier().toInt());
+        switch (type) {
+        case TYPE_ACCELEROMETER:
+            return new AndroidAccelerometer(type, sensor);
+        case TYPE_AMBIENT_TEMPERATURE:
+        case TYPE_TEMPERATURE:
+            break; // add the temperature sensor backend
+        case TYPE_GRAVITY:
+            break; // add the gravity sensor backend
+        case TYPE_GYROSCOPE:
+            return new AndroidGyroscope(type, sensor);
+        case TYPE_LIGHT:
+            return new AndroidLight(type, sensor);
+        case TYPE_LINEAR_ACCELERATION:
+            break; // add the linear acceleration sensor backend
+        case TYPE_MAGNETIC_FIELD:
+            return new AndroidMagnetometer(type, sensor);
+        case TYPE_ORIENTATION:
+            break; // add the orientation sensor backend
+        case TYPE_PRESSURE:
+            break; // add the pressure sensor backend
+        case TYPE_PROXIMITY:
+            break; // add the proximity sensor backend
+        case TYPE_RELATIVE_HUMIDITY:
+            break; // add the relative humidity sensor backend
+        case TYPE_ROTATION_VECTOR:
+            return new AndroidRotation(type, sensor);
+        }
+        return 0;
+    }
+};
+
+Q_IMPORT_PLUGIN (AndroidSensorPlugin) // automatically register the plugin
+
+#include "main.moc"
+
diff --git a/src/plugins/sensors/android/src/plugin.json b/src/plugins/sensors/android/src/plugin.json
new file mode 100644
index 0000000000000000000000000000000000000000..8a55b3ae4d279006a2877dbe80a28834c4ffb5f5
--- /dev/null
+++ b/src/plugins/sensors/android/src/plugin.json
@@ -0,0 +1 @@
+{ "Keys": [ "notused" ] }
diff --git a/src/plugins/sensors/android/src/src.pro b/src/plugins/sensors/android/src/src.pro
new file mode 100644
index 0000000000000000000000000000000000000000..715a011169bfd0f9505c3c9198cdfb342abfbc30
--- /dev/null
+++ b/src/plugins/sensors/android/src/src.pro
@@ -0,0 +1,29 @@
+TARGET = qtsensors_android
+QT = sensors core
+
+PLUGIN_TYPE = sensors
+load(qt_plugin)
+
+# STATICPLUGIN needed because there's a Q_IMPORT_PLUGIN in main.cpp
+# Yes, the plugin imports itself statically
+DEFINES += QT_STATICPLUGIN
+
+HEADERS = \
+    androidjnisensors.h \
+    androidaccelerometer.h \
+    androidcommonsensor.h \
+    androidgyroscope.h \
+    androidmagnetometer.h \
+    androidrotation.h \
+    androidlight.h
+
+SOURCES = \
+    main.cpp \
+    androidjnisensors.cpp \
+    androidaccelerometer.cpp \
+    androidgyroscope.cpp \
+    androidmagnetometer.cpp \
+    androidrotation.cpp \
+    androidlight.cpp
+
+OTHER_FILES = plugin.json
diff --git a/src/plugins/sensors/blackberry/bbaccelerometer.cpp b/src/plugins/sensors/blackberry/bbaccelerometer.cpp
index dcbd7fccffe3d390c1232dc05463268052446af9..0826cf7a0e793af4e565ce293144eeee46d141ec 100644
--- a/src/plugins/sensors/blackberry/bbaccelerometer.cpp
+++ b/src/plugins/sensors/blackberry/bbaccelerometer.cpp
@@ -44,6 +44,12 @@ BbAccelerometer::BbAccelerometer(QSensor *sensor)
     : BbSensorBackend<QAccelerometerReading>(devicePath(), SENSOR_TYPE_ACCELEROMETER, sensor)
 {
     setDescription(QLatin1String("X, Y, and Z axes accelerations in m/s^2"));
+
+    QAccelerometer * const accelerometer = qobject_cast<QAccelerometer *>(sensor);
+    if (accelerometer) {
+        connect(accelerometer, SIGNAL(accelerationModeChanged(AccelerationMode)),
+                this, SLOT(applyAccelerationMode()));
+    }
 }
 
 bool BbAccelerometer::updateReadingFromEvent(const sensor_event_t &event, QAccelerometerReading *reading)
@@ -58,7 +64,39 @@ bool BbAccelerometer::updateReadingFromEvent(const sensor_event_t &event, QAccel
     return true;
 }
 
+void BbAccelerometer::start()
+{
+    applyAccelerationMode();
+    BbSensorBackend<QAccelerometerReading>::start();
+}
+
 QString BbAccelerometer::devicePath()
 {
     return QLatin1String("/dev/sensor/accel");
 }
+
+void BbAccelerometer::applyAccelerationMode()
+{
+    const QAccelerometer * const accelerometer = qobject_cast<QAccelerometer *>(sensor());
+    if (accelerometer) {
+        QString fileName;
+        sensor_type_e sensorType;
+        switch (accelerometer->accelerationMode()) {
+        case QAccelerometer::Gravity:
+            fileName = QLatin1String("/dev/sensor/gravity");
+            sensorType = SENSOR_TYPE_GRAVITY;
+            break;
+        case QAccelerometer::User:
+            fileName = QLatin1String("/dev/sensor/linAccel");
+            sensorType = SENSOR_TYPE_LINEAR_ACCEL;
+            break;
+        default:
+        case QAccelerometer::Combined:
+            fileName = devicePath();
+            sensorType = SENSOR_TYPE_ACCELEROMETER;
+            break;
+        }
+
+        setDevice(fileName, sensorType);
+    }
+}
diff --git a/src/plugins/sensors/blackberry/bbaccelerometer.h b/src/plugins/sensors/blackberry/bbaccelerometer.h
index aa47873c8c607b9a8bbc2ae88c6fb673bb2794a4..3071c8019b575e3a07334be92925a1c00a0dcf60 100644
--- a/src/plugins/sensors/blackberry/bbaccelerometer.h
+++ b/src/plugins/sensors/blackberry/bbaccelerometer.h
@@ -51,10 +51,14 @@ class BbAccelerometer : public BbSensorBackend<QAccelerometerReading>
 public:
     explicit BbAccelerometer(QSensor *sensor);
 
+    void start() Q_DECL_OVERRIDE;
     static QString devicePath();
 
 protected:
     bool updateReadingFromEvent(const sensor_event_t &event, QAccelerometerReading *reading) Q_DECL_OVERRIDE;
+
+private Q_SLOTS:
+    void applyAccelerationMode();
 };
 
 #endif
diff --git a/src/plugins/sensors/blackberry/bbaltimeter.cpp b/src/plugins/sensors/blackberry/bbaltimeter.cpp
index 07aa26460b23bd67cb0957b5f8ae2e0876a0a044..3d21ef32065a7a7ffb672be4637850121f309d78 100644
--- a/src/plugins/sensors/blackberry/bbaltimeter.cpp
+++ b/src/plugins/sensors/blackberry/bbaltimeter.cpp
@@ -40,36 +40,13 @@
 ****************************************************************************/
 #include "bbaltimeter.h"
 
-class BbAltimeterReadingPrivate
-{
-public:
-    BbAltimeterReadingPrivate()
-        : altitude(0)
-    {
-    }
-
-    qreal altitude;
-};
-
-IMPLEMENT_READING(BbAltimeterReading)
-
-qreal BbAltimeterReading::altitude() const
-{
-    return d->altitude;
-}
-
-void BbAltimeterReading::setAltitude(qreal altitude)
-{
-    d->altitude = altitude;
-}
-
 BbAltimeter::BbAltimeter(QSensor *sensor)
-    : BbSensorBackend<BbAltimeterReading>(devicePath(), SENSOR_TYPE_ALTIMETER, sensor)
+    : BbSensorBackend<QAltimeterReading>(devicePath(), SENSOR_TYPE_ALTIMETER, sensor)
 {
     setDescription(QLatin1String("Altitude in meters relative to mean sea level"));
 }
 
-bool BbAltimeter::updateReadingFromEvent(const sensor_event_t &event, BbAltimeterReading *reading)
+bool BbAltimeter::updateReadingFromEvent(const sensor_event_t &event, QAltimeterReading *reading)
 {
     reading->setAltitude(event.altitude_s.altitude);
     return true;
diff --git a/src/plugins/sensors/blackberry/bbaltimeter.h b/src/plugins/sensors/blackberry/bbaltimeter.h
index 4744a3ff4f0a4958c3bb7b9ee5b99ad22c561760..b369c6cb008ac8536d76a163988989ae8395b229 100644
--- a/src/plugins/sensors/blackberry/bbaltimeter.h
+++ b/src/plugins/sensors/blackberry/bbaltimeter.h
@@ -42,20 +42,9 @@
 #define BBALTIMETER_H
 
 #include "bbsensorbackend.h"
+#include <qaltimeter.h>
 
-class BbAltimeterReadingPrivate;
-
-class BbAltimeterReading : public QSensorReading
-{
-    Q_OBJECT
-    Q_PROPERTY(qreal altitude READ altitude)
-    DECLARE_READING(BbAltimeterReading)
-public:
-    qreal altitude() const;
-    void setAltitude(qreal altitude);
-};
-
-class BbAltimeter : public BbSensorBackend<BbAltimeterReading>
+class BbAltimeter : public BbSensorBackend<QAltimeterReading>
 {
     Q_OBJECT
 
@@ -65,7 +54,7 @@ public:
     static QString devicePath();
 
 protected:
-    bool updateReadingFromEvent(const sensor_event_t &event, BbAltimeterReading *reading) Q_DECL_OVERRIDE;
+    bool updateReadingFromEvent(const sensor_event_t &event, QAltimeterReading *reading) Q_DECL_OVERRIDE;
 };
 
 #endif
diff --git a/src/plugins/sensors/blackberry/bbcompass.cpp b/src/plugins/sensors/blackberry/bbcompass.cpp
index 6e33d1a37bf6614be78453520c8535d1cdc1ec17..df8cc2e1826d532d75e37e8f5908c4ab1d1a7f3d 100644
--- a/src/plugins/sensors/blackberry/bbcompass.cpp
+++ b/src/plugins/sensors/blackberry/bbcompass.cpp
@@ -55,19 +55,28 @@ BbCompass::BbCompass(QSensor *sensor)
 
 bool BbCompass::updateReadingFromEvent(const sensor_event_t &event, QCompassReading *reading)
 {
+    float azimuth;
 #ifdef HAVE_COMPASS_SENSOR
-    reading->setAzimuth(event.compass_s.azimuth);
+    azimuth = event.compass_s.azimuth;
 #else
     float xRad, yRad, zRad;
     matrixToEulerZXY(event.rotation_matrix, xRad, yRad, zRad);
-    float azimuth = radiansToDegrees(zRad);
+    azimuth = radiansToDegrees(zRad);
     if (azimuth < 0)
         azimuth = -azimuth;
     else
         azimuth = 360.0f - azimuth;
-    reading->setAzimuth(azimuth);
 #endif
 
+    if (isAutoAxisRemappingEnabled()) {
+        azimuth += orientationForRemapping();
+        if (azimuth >= 360.0f)
+            azimuth -= 360.0f;
+    }
+
+    reading->setAzimuth(azimuth);
+
+
     switch (event.accuracy) {
     case SENSOR_ACCURACY_UNRELIABLE:
         reading->setCalibrationLevel(0.0f);
diff --git a/src/plugins/sensors/blackberry/bbholstersensor.cpp b/src/plugins/sensors/blackberry/bbholstersensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..53888f58ddbb66be580a4d5aec99ea77e18e1d2f
--- /dev/null
+++ b/src/plugins/sensors/blackberry/bbholstersensor.cpp
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "bbholstersensor.h"
+
+BbHolsterSensor::BbHolsterSensor(QSensor *sensor)
+    : BbSensorBackend<QHolsterReading>(devicePath(), SENSOR_TYPE_HOLSTER, sensor)
+{
+    setDescription(QLatin1String("Whether the device is holstered or not"));
+}
+
+bool BbHolsterSensor::updateReadingFromEvent(const sensor_event_t &event, QHolsterReading *reading)
+{
+    reading->setHolstered(event.holster_s.holstered == 1);
+    return true;
+}
+
+QString BbHolsterSensor::devicePath()
+{
+    return QLatin1String("/dev/sensor/holster");
+}
diff --git a/src/plugins/sensors/blackberry/bbholstersensor.h b/src/plugins/sensors/blackberry/bbholstersensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..b33b391d5ce6fd740bc4d78264cbaf8c3eaaa247
--- /dev/null
+++ b/src/plugins/sensors/blackberry/bbholstersensor.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef BBHOLSTERSENSOR_H
+#define BBHOLSTERSENSOR_H
+
+#include "bbsensorbackend.h"
+#include <qholstersensor.h>
+
+class BbHolsterSensor : public BbSensorBackend<QHolsterReading>
+{
+    Q_OBJECT
+
+public:
+    explicit BbHolsterSensor(QSensor *sensor);
+
+    static QString devicePath();
+
+protected:
+    bool updateReadingFromEvent(const sensor_event_t &event, QHolsterReading *reading) Q_DECL_OVERRIDE;
+};
+
+#endif
diff --git a/src/plugins/sensors/blackberry/bbmagnetometer.cpp b/src/plugins/sensors/blackberry/bbmagnetometer.cpp
index 489a0481ac25a1d5cd37b84e3fe574c419d05ca9..45fd49b307de64d755dfe33b84fb6ab32399f243 100644
--- a/src/plugins/sensors/blackberry/bbmagnetometer.cpp
+++ b/src/plugins/sensors/blackberry/bbmagnetometer.cpp
@@ -53,17 +53,11 @@ QString BbMagnetometer::devicePath()
 
 bool BbMagnetometer::updateReadingFromEvent(const sensor_event_t &event, QMagnetometerReading *reading)
 {
-    // TODO: In the future, support returnGeoValues here. Right now, /dev/sensors/mag has no
-    //       geomagnatic mode, but will gain it in the future.
-    float x = convertValue(event.motion.dsp.x);
-    float y = convertValue(event.motion.dsp.y);
-    float z = convertValue(event.motion.dsp.z);
-    remapAxes(&x, &y, &z);
-    reading->setX(x);
-    reading->setY(y);
-    reading->setZ(z);
+    float x, y, z;
 
-    const bool returnGeoValues = sensor()->property("returnGeoValues").toBool();
+    QMagnetometer * const magnetometer = qobject_cast<QMagnetometer *>(sensor());
+    Q_ASSERT(magnetometer);
+    const bool returnGeoValues = magnetometer->returnGeoValues();
     if (returnGeoValues) {
         switch (event.accuracy) {
         case SENSOR_ACCURACY_UNRELIABLE: reading->setCalibrationLevel(0.0f); break;
@@ -76,10 +70,30 @@ bool BbMagnetometer::updateReadingFromEvent(const sensor_event_t &event, QMagnet
         case SENSOR_ACCURACY_MEDIUM:     reading->setCalibrationLevel(1.0f); break;
         case SENSOR_ACCURACY_HIGH:       reading->setCalibrationLevel(1.0f); break;
         }
+
+        x = convertValue(event.motion.dsp.x);
+        y = convertValue(event.motion.dsp.y);
+        z = convertValue(event.motion.dsp.z);
+
     } else {
         reading->setCalibrationLevel(1.0f);
+
+#ifndef Q_OS_BLACKBERRY_TABLET
+        x = convertValue(event.motion.raw.x);
+        y = convertValue(event.motion.raw.y);
+        z = convertValue(event.motion.raw.z);
+#else
+        // Blackberry Tablet OS does not support raw reading values
+        x = convertValue(event.motion.dsp.x);
+        y = convertValue(event.motion.dsp.y);
+        z = convertValue(event.motion.dsp.z);
+#endif
     }
 
+    remapAxes(&x, &y, &z);
+    reading->setX(x);
+    reading->setY(y);
+    reading->setZ(z);
     return true;
 }
 
diff --git a/src/plugins/sensors/blackberry/bborientationsensor.cpp b/src/plugins/sensors/blackberry/bborientationsensor.cpp
index 68ed735bcf6e4d15144a269bb06d43e499113464..3d9d120c6f7d91a66f8556c5e9ae1e9d42775b3b 100644
--- a/src/plugins/sensors/blackberry/bborientationsensor.cpp
+++ b/src/plugins/sensors/blackberry/bborientationsensor.cpp
@@ -44,6 +44,9 @@ BbOrientationSensor::BbOrientationSensor(QSensor *sensor)
     : BbSensorBackend<QOrientationReading>(devicePath(), SENSOR_TYPE_ORIENTATION, sensor)
 {
     setDescription(QLatin1String("Device orientation"));
+
+    // Orientation rarely changes, so enable skipping of duplicates by default
+    sensor->setSkipDuplicates(true);
 }
 
 QString BbOrientationSensor::devicePath()
@@ -51,19 +54,6 @@ QString BbOrientationSensor::devicePath()
     return QLatin1String("/dev/sensor/orientation");
 }
 
-void BbOrientationSensor::start()
-{
-    BbSensorBackend<QOrientationReading>::start();
-
-    // Orientation rarely changes, so enable skiping of duplicates
-    sensor_devctl_skipdupevent_u deviceSkip;
-    deviceSkip.tx.enable = 1;
-    const int result = devctl(deviceFile().handle(), DCMD_SENSOR_SKIPDUPEVENT, &deviceSkip,
-                              sizeof(deviceSkip), NULL);
-    if (result != EOK)
-        perror("Enabling duplicate skipping for orientation sensor failed");
-}
-
 void BbOrientationSensor::additionalDeviceInit()
 {
     // When querying the OS service for the range, it gives us the angles, which we don't need.
diff --git a/src/plugins/sensors/blackberry/bborientationsensor.h b/src/plugins/sensors/blackberry/bborientationsensor.h
index 07dc3d0fb919e04796fa1086bacc2abe9dddb31c..85c7bd67b7defea48c65b8cb2c136ec9b583145e 100644
--- a/src/plugins/sensors/blackberry/bborientationsensor.h
+++ b/src/plugins/sensors/blackberry/bborientationsensor.h
@@ -53,7 +53,6 @@ public:
 
     static QString devicePath();
 
-    void start() Q_DECL_OVERRIDE;
     void additionalDeviceInit() Q_DECL_OVERRIDE;
     bool addDefaultRange() Q_DECL_OVERRIDE;
 
diff --git a/src/plugins/sensors/blackberry/bbpressuresensor.cpp b/src/plugins/sensors/blackberry/bbpressuresensor.cpp
index 01a2493b3d1d2c6b11264486867f0bdd6cab5b23..8cb9b1ea55703c789d3dcf0fb69aff3153ccb19c 100644
--- a/src/plugins/sensors/blackberry/bbpressuresensor.cpp
+++ b/src/plugins/sensors/blackberry/bbpressuresensor.cpp
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2012 Research In Motion
+** Copyright (C) 2013 Research In Motion
 ** Contact: http://www.qt-project.org/legal
 **
 ** This file is part of the QtSensors module of the Qt Toolkit.
@@ -40,31 +40,8 @@
 ****************************************************************************/
 #include "bbpressuresensor.h"
 
-class BbPressureReadingPrivate
-{
-public:
-    BbPressureReadingPrivate()
-        : pressure(0)
-    {
-    }
-
-    qreal pressure;
-};
-
-IMPLEMENT_READING(BbPressureReading)
-
-qreal BbPressureReading::pressure() const
-{
-    return d->pressure;
-}
-
-void BbPressureReading::setPressure(qreal pressure)
-{
-    d->pressure = pressure;
-}
-
 BbPressureSensor::BbPressureSensor(QSensor *sensor)
-    : BbSensorBackend<BbPressureReading>(devicePath(), SENSOR_TYPE_PRESSURE, sensor)
+    : BbSensorBackend<QPressureReading>(devicePath(), SENSOR_TYPE_PRESSURE, sensor)
 {
     setDescription(QLatin1String("Pressure in Pascals"));
 }
@@ -74,7 +51,7 @@ QString BbPressureSensor::devicePath()
     return QLatin1String("/dev/sensor/pressure");
 }
 
-bool BbPressureSensor::updateReadingFromEvent(const sensor_event_t &event, BbPressureReading *reading)
+bool BbPressureSensor::updateReadingFromEvent(const sensor_event_t &event, QPressureReading *reading)
 {
     // TODO: I was unable to test this since the device I was testing this with did not have
     //       a pressure sensor. Verify that this works and check that the units are correct.
diff --git a/src/plugins/sensors/blackberry/bbpressuresensor.h b/src/plugins/sensors/blackberry/bbpressuresensor.h
index 833832c467afdb4464065eedf159b9912906c521..7531bd68320e372d6a9afef3f8017d4d0cdbb331 100644
--- a/src/plugins/sensors/blackberry/bbpressuresensor.h
+++ b/src/plugins/sensors/blackberry/bbpressuresensor.h
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2012 Research In Motion
+** Copyright (C) 2013 Research In Motion
 ** Contact: http://www.qt-project.org/legal
 **
 ** This file is part of the QtSensors module of the Qt Toolkit.
@@ -42,20 +42,9 @@
 #define BBPRESSURESENSOR_H
 
 #include "bbsensorbackend.h"
+#include <qpressuresensor.h>
 
-class BbPressureReadingPrivate;
-
-class BbPressureReading : public QSensorReading
-{
-    Q_OBJECT
-    Q_PROPERTY(qreal pressure READ pressure)
-    DECLARE_READING(BbPressureReading)
-public:
-    qreal pressure() const;
-    void setPressure(qreal pressure);
-};
-
-class BbPressureSensor : public BbSensorBackend<BbPressureReading>
+class BbPressureSensor : public BbSensorBackend<QPressureReading>
 {
     Q_OBJECT
 
@@ -65,7 +54,7 @@ public:
     static QString devicePath();
 
 protected:
-    bool updateReadingFromEvent(const sensor_event_t &event, BbPressureReading *reading) Q_DECL_OVERRIDE;
+    bool updateReadingFromEvent(const sensor_event_t &event, QPressureReading *reading) Q_DECL_OVERRIDE;
 };
 
 #endif
diff --git a/src/plugins/sensors/blackberry/bbproximitysensor.cpp b/src/plugins/sensors/blackberry/bbproximitysensor.cpp
index 79f3834a07a090ab1f4600c750e6747a8f092483..1177f7440596539ef352ef69192888977bfa1ecd 100644
--- a/src/plugins/sensors/blackberry/bbproximitysensor.cpp
+++ b/src/plugins/sensors/blackberry/bbproximitysensor.cpp
@@ -53,9 +53,6 @@ QString BbProximitySensor::devicePath()
 
 bool BbProximitySensor::updateReadingFromEvent(const sensor_event_t &event, QProximityReading *reading)
 {
-    // TODO: I was unable to test this since the device I was testing this with did not have
-    //       a proximity sensor. Verify that this works, check that the units are correct
-    //       and that the threshold makes sense.
     const qreal minProximity = sensor()->outputRanges().first().minimum;
     reading->setClose(event.proximity_s.distance <= minProximity);
     return true;
diff --git a/src/plugins/sensors/blackberry/bbsensorbackend.cpp b/src/plugins/sensors/blackberry/bbsensorbackend.cpp
index fa8c89be1c9b9a5150295beae01ecdc0ab7d7d71..6b614a8acfc5de028e36b8ff147f949d0e752c63 100644
--- a/src/plugins/sensors/blackberry/bbsensorbackend.cpp
+++ b/src/plugins/sensors/blackberry/bbsensorbackend.cpp
@@ -81,15 +81,17 @@ static void remapMatrix(const float inputMatrix[3*3],
 BbSensorBackendBase::BbSensorBackendBase(const QString &devicePath, sensor_type_e sensorType,
                                          QSensor *sensor)
     : QSensorBackend(sensor), m_deviceFile(devicePath), m_sensorType(sensorType), m_guiHelper(0),
-      m_started(false)
+      m_started(false), m_applyingBufferSize(false)
 {
     m_mappingMatrix[0] = m_mappingMatrix[3] = 1;
     m_mappingMatrix[1] = m_mappingMatrix[2] = 0;
     connect(sensor, SIGNAL(alwaysOnChanged()), this, SLOT(applyAlwaysOnProperty()));
+    connect(sensor, SIGNAL(bufferSizeChanged(int)), this, SLOT(applyBuffering()));
+    connect(sensor, SIGNAL(userOrientationChanged(int)), this, SLOT(updateOrientation()));
 
     // Set some sensible default values
-    sensor->setProperty("efficientBufferSize", defaultBufferSize);
-    sensor->setProperty("maxBufferSize", defaultBufferSize);
+    sensor->setEfficientBufferSize(defaultBufferSize);
+    sensor->setMaxBufferSize(defaultBufferSize);
 }
 
 BbGuiHelper *BbSensorBackendBase::guiHelper() const
@@ -107,12 +109,40 @@ sensor_type_e BbSensorBackendBase::sensorType() const
     return m_sensorType;
 }
 
+void BbSensorBackendBase::setDevice(const QString &deviceFile, sensor_type_e sensorType)
+{
+    if (deviceFile != m_deviceFile.fileName()) {
+        setPaused(true);
+        delete m_socketNotifier.take();
+        m_deviceFile.close();
+
+        m_sensorType = sensorType;
+        m_deviceFile.setFileName(deviceFile);
+        initSensorInfo();
+        if (m_started)
+            start();    // restart with new device file
+    }
+}
+
 void BbSensorBackendBase::initSensorInfo()
 {
     if (!m_deviceFile.open(QFile::ReadOnly | QFile::Unbuffered)) {
         qDebug() << "Failed to open sensor" << m_deviceFile.fileName()
                  << ":" << m_deviceFile.errorString();
     } else {
+
+        // Explicitly switch to non-blocking mode, otherwise read() will wait until new sensor
+        // data is available, and we have no way to check if there is more data or not (bytesAvailable()
+        // does not work for unbuffered mode)
+        const int oldFlags = fcntl(m_deviceFile.handle(), F_GETFL);
+        if (fcntl(m_deviceFile.handle(), F_SETFL, oldFlags | O_NONBLOCK) == -1) {
+            perror(QString::fromLatin1("Starting sensor %1 failed, fcntl() returned -1")
+                        .arg(m_deviceFile.fileName()).toLocal8Bit());
+            sensorError(errno);
+            stop();
+            return;
+        }
+
         sensor_devctl_info_u deviceInfo;
         const int result = devctl(m_deviceFile.handle(), DCMD_SENSOR_INFO, &deviceInfo,
                                   sizeof(deviceInfo), NULL);
@@ -139,6 +169,7 @@ void BbSensorBackendBase::initSensorInfo()
         setPaused(true);
 
         m_socketNotifier.reset(new QSocketNotifier(m_deviceFile.handle(), QSocketNotifier::Read));
+        m_socketNotifier->setEnabled(false);
         connect(m_socketNotifier.data(), SIGNAL(activated(int)), this, SLOT(dataAvailable()));
     }
 }
@@ -168,12 +199,13 @@ qreal BbSensorBackendBase::convertValue(float bbValue)
 
 bool BbSensorBackendBase::isAutoAxisRemappingEnabled() const
 {
-    return sensor()->property("automaticAxisRemapping").toBool();
+    return sensor()->isFeatureSupported(QSensor::AxesOrientation) &&
+           sensor()->axesOrientationMode() != QSensor::FixedOrientation;
 }
 
 void BbSensorBackendBase::remapMatrix(const float inputMatrix[], float outputMatrix[])
 {
-    if (!isAutoAxisRemappingEnabled() || m_guiHelper->currentOrientation() == 0) {
+    if (!isAutoAxisRemappingEnabled() || orientationForRemapping() == 0) {
         memcpy(outputMatrix, inputMatrix, sizeof(float) * 9);
         return;
     }
@@ -184,10 +216,10 @@ void BbSensorBackendBase::remapMatrix(const float inputMatrix[], float outputMat
 void BbSensorBackendBase::remapAxes(float *x, float *y, float *z)
 {
     Q_ASSERT(x && y && z);
-    if (!isAutoAxisRemappingEnabled() || m_guiHelper->currentOrientation() == 0)
+    if (!isAutoAxisRemappingEnabled() || orientationForRemapping() == 0)
         return;
 
-    const int angle = m_guiHelper->currentOrientation();
+    const int angle = orientationForRemapping();
 
     const float oldX = *x;
     const float oldY = *y;
@@ -239,36 +271,17 @@ void BbSensorBackendBase::start()
         }
     }
 
-    // Explicitly switch to non-blocking mode, otherwise read() will wait until new sensor
-    // data is available, and we have no way to check if there is more data or not (bytesAvailable()
-    // does not work for unbuffered mode)
-    const int oldFlags = fcntl(m_deviceFile.handle(), F_GETFL);
-    if (fcntl(m_deviceFile.handle(), F_SETFL, oldFlags | O_NONBLOCK) == -1) {
-        perror(QString::fromLatin1("Starting sensor %1 failed, fcntl() returned -1")
-                    .arg(m_deviceFile.fileName()).toLocal8Bit());
-        sensorError(errno);
-        stop();
-        return;
-    }
-
-    // Activate event queuing if needed
-    bool ok = false;
-    const int requestedBufferSize = sensor()->property("bufferSize").toInt(&ok);
-    if (ok && requestedBufferSize > 1) {
-        sensor_devctl_queue_u queueControl;
-        queueControl.tx.enable = 1;
-        const int result = devctl(m_deviceFile.handle(), DCMD_SENSOR_QUEUE, &queueControl, sizeof(queueControl), NULL);
-        if (result != EOK) {
-            perror(QString::fromLatin1("Enabling sensor queuing for %1 failed")
-                   .arg(m_deviceFile.fileName()).toLocal8Bit());
-        }
-
-        const int actualBufferSize = queueControl.rx.size;
-        sensor()->setProperty("bufferSize", actualBufferSize);
-        sensor()->setProperty("efficientBufferSize", actualBufferSize);
-        sensor()->setProperty("maxBufferSize", actualBufferSize);
+    // Enable/disable duplicate skipping
+    sensor_devctl_skipdupevent_u deviceSkip;
+    deviceSkip.tx.enable = sensor()->skipDuplicates();
+    const int result = devctl(deviceFile().handle(), DCMD_SENSOR_SKIPDUPEVENT, &deviceSkip,
+                              sizeof(deviceSkip), NULL);
+    if (result != EOK) {
+        perror(QString::fromLatin1("Setting duplicate skipping for %1 failed")
+               .arg(m_deviceFile.fileName()).toLocal8Bit());
     }
 
+    applyBuffering();
     applyAlwaysOnProperty();
 }
 
@@ -281,11 +294,23 @@ void BbSensorBackendBase::stop()
 bool BbSensorBackendBase::isFeatureSupported(QSensor::Feature feature) const
 {
     switch (feature) {
+    case QSensor::AxesOrientation:
+        return (sensorType() == SENSOR_TYPE_ACCELEROMETER || sensorType() == SENSOR_TYPE_MAGNETOMETER ||
+                sensorType() == SENSOR_TYPE_GYROSCOPE || sensorType() == SENSOR_TYPE_GRAVITY ||
+                sensorType() == SENSOR_TYPE_LINEAR_ACCEL || sensorType() ==  SENSOR_TYPE_ROTATION_VECTOR ||
+                sensorType() == SENSOR_TYPE_ROTATION_MATRIX || sensorType() == SENSOR_TYPE_AZIMUTH_PITCH_ROLL);
     case QSensor::AlwaysOn:
     case QSensor::Buffering:
+    case QSensor::AccelerationMode:
+    case QSensor::SkipDuplicates:
         return true;
-    case QSensor::Reserved:
     case QSensor::GeoValues:
+#ifndef Q_OS_BLACKBERRY_TABLET
+        return (sensorType() == SENSOR_TYPE_MAGNETOMETER);
+#else
+        return false;
+#endif
+    case QSensor::Reserved:
     case QSensor::FieldOfView:
         break;
     }
@@ -295,8 +320,12 @@ bool BbSensorBackendBase::isFeatureSupported(QSensor::Feature feature) const
 
 void BbSensorBackendBase::dataAvailable()
 {
-    if (!m_started)
+    if (!m_started) {
+        // Spurious dataAvailable() call, drain the device file of data. We also disable
+        // the socket notifier for this, so this is just added safety here.
+        m_deviceFile.readAll();
         return;
+    }
 
     Q_FOREVER {
         sensor_event_t event;
@@ -331,6 +360,46 @@ void BbSensorBackendBase::applyAlwaysOnProperty()
     updatePauseState();
 }
 
+void BbSensorBackendBase::applyBuffering()
+{
+    if (!m_deviceFile.isOpen() || !m_started || m_applyingBufferSize)
+        return;
+
+    // Flag to prevent recursion. We call setBufferSize() below, and because of the changed signal,
+    // we might end up in this slot again.
+    // The call to setBufferSize() is needed since the requested buffer size is most likely different
+    // from the actual buffer size that will be used.
+    m_applyingBufferSize = true;
+
+    const bool enableBuffering = sensor()->bufferSize() > 1;
+    sensor_devctl_queue_u queueControl;
+    queueControl.tx.enable = enableBuffering ? 1 : 0;
+    const int result = devctl(m_deviceFile.handle(), DCMD_SENSOR_QUEUE, &queueControl, sizeof(queueControl), NULL);
+    if (result != EOK) {
+        perror(QString::fromLatin1("Enabling sensor queuing for %1 failed")
+               .arg(m_deviceFile.fileName()).toLocal8Bit());
+    } else {
+        if (enableBuffering) {
+            int actualBufferSize = queueControl.rx.size;
+
+            // Some firmware versions don't report the buffer size correctly. Simply pretend the
+            // buffer size is the same as the requested buffer size, as setting the buffer size to
+            // 1 here would seem as if buffering were disabled.
+            if (actualBufferSize == 1)
+                actualBufferSize = sensor()->bufferSize();
+
+            sensor()->setBufferSize(actualBufferSize);
+            sensor()->setEfficientBufferSize(actualBufferSize);
+            sensor()->setMaxBufferSize(actualBufferSize);
+        } else {
+            sensor()->setBufferSize(1);
+            sensor()->setEfficientBufferSize(defaultBufferSize);
+            sensor()->setMaxBufferSize(defaultBufferSize);
+        }
+    }
+    m_applyingBufferSize = false;
+}
+
 bool BbSensorBackendBase::setPaused(bool paused)
 {
     if (!m_deviceFile.isOpen())
@@ -339,6 +408,9 @@ bool BbSensorBackendBase::setPaused(bool paused)
     sensor_devctl_enable_u enableState;
     enableState.tx.enable = paused ? 0 : 1;
 
+    if (m_socketNotifier)
+        m_socketNotifier->setEnabled(!paused);
+
     const int result = devctl(m_deviceFile.handle(), DCMD_SENSOR_ENABLE, &enableState, sizeof(enableState), NULL);
     if (result != EOK) {
         perror(QString::fromLatin1("Setting sensor enabled (%1) for %2 failed")
@@ -360,12 +432,26 @@ void BbSensorBackendBase::updatePauseState()
 
 void BbSensorBackendBase::updateOrientation()
 {
-    // ### I can't really test this, the rotation matrix has too many glitches and drifts over time,
-    // making any measurement quite hard
-    const int rotationAngle = guiHelper()->currentOrientation();
+    const int rotationAngle = orientationForRemapping();
 
     m_mappingMatrix[0] = cos(rotationAngle*M_PI/180);
     m_mappingMatrix[1] = sin(rotationAngle*M_PI/180);
     m_mappingMatrix[2] = -sin(rotationAngle*M_PI/180);
     m_mappingMatrix[3] = cos(rotationAngle*M_PI/180);
+
+    if (sensor()->isFeatureSupported(QSensor::AxesOrientation))
+        sensor()->setCurrentOrientation(rotationAngle);
+}
+
+int BbSensorBackendBase::orientationForRemapping() const
+{
+    if (!sensor()->isFeatureSupported(QSensor::AxesOrientation))
+        return 0;
+
+    switch (sensor()->axesOrientationMode()) {
+    default:
+    case QSensor::FixedOrientation: return 0;
+    case QSensor::AutomaticOrientation: return guiHelper()->currentOrientation();
+    case QSensor::UserOrientation: return sensor()->userOrientation();
+    }
 }
diff --git a/src/plugins/sensors/blackberry/bbsensorbackend.h b/src/plugins/sensors/blackberry/bbsensorbackend.h
index 7e2ad0ec9f6f120e874b1b918953207c4e9fa2b9..4e7b8101720493592a33db64392c76f21d07db82 100644
--- a/src/plugins/sensors/blackberry/bbsensorbackend.h
+++ b/src/plugins/sensors/blackberry/bbsensorbackend.h
@@ -76,6 +76,9 @@ protected:
     BbGuiHelper *guiHelper() const;
     QFile& deviceFile();
     sensor_type_e sensorType() const;
+    int orientationForRemapping() const;
+
+    void setDevice(const QString &deviceFile, sensor_type_e sensorType);
 
     // This is called while the device file is open during initalization and gives a subclass
     // an opportunity to do additional initalization.
@@ -104,6 +107,7 @@ protected:
 private slots:
     void dataAvailable();
     void applyAlwaysOnProperty();
+    void applyBuffering();
     bool setPaused(bool paused);
     void updatePauseState();
     void updateOrientation();
@@ -115,6 +119,7 @@ private:
     BbGuiHelper *m_guiHelper;
     float m_mappingMatrix[4];
     bool m_started;
+    bool m_applyingBufferSize;
 };
 
 template<class SensorReading>
diff --git a/src/plugins/sensors/blackberry/bbtemperaturesensor.cpp b/src/plugins/sensors/blackberry/bbtemperaturesensor.cpp
index f3ec6342d5f6f222d12de7e7fb1bdb7886565568..b38fba4df3f40345dc712837a51f796fa62ac8a3 100644
--- a/src/plugins/sensors/blackberry/bbtemperaturesensor.cpp
+++ b/src/plugins/sensors/blackberry/bbtemperaturesensor.cpp
@@ -40,31 +40,8 @@
 ****************************************************************************/
 #include "bbtemperaturesensor.h"
 
-class BbTemperatureReadingPrivate
-{
-public:
-    BbTemperatureReadingPrivate()
-        : temperature(0)
-    {
-    }
-
-    qreal temperature;
-};
-
-IMPLEMENT_READING(BbTemperatureReading)
-
-qreal BbTemperatureReading::temperature() const
-{
-    return d->temperature;
-}
-
-void BbTemperatureReading::setTemperature(qreal temperature)
-{
-    d->temperature = temperature;
-}
-
 BbTemperatureSensor::BbTemperatureSensor(QSensor *sensor)
-    : BbSensorBackend<BbTemperatureReading>(devicePath(), SENSOR_TYPE_TEMPERATURE, sensor)
+    : BbSensorBackend<QAmbientTemperatureReading>(devicePath(), SENSOR_TYPE_TEMPERATURE, sensor)
 {
     setDescription(QLatin1String("Temperature in degrees Celsius"));
 }
@@ -74,7 +51,7 @@ QString BbTemperatureSensor::devicePath()
     return QLatin1String("/dev/sensor/temp");
 }
 
-bool BbTemperatureSensor::updateReadingFromEvent(const sensor_event_t &event, BbTemperatureReading *reading)
+bool BbTemperatureSensor::updateReadingFromEvent(const sensor_event_t &event, QAmbientTemperatureReading *reading)
 {
     // TODO: I was unable to test this since the device I was testing this with did not have
     //       a temperature sensor. Verify that this works and check that the units are correct.
diff --git a/src/plugins/sensors/blackberry/bbtemperaturesensor.h b/src/plugins/sensors/blackberry/bbtemperaturesensor.h
index 1b9ea1bf777d1e64f49ddb1823d8f64f3f95b383..a24c67e79231952f0cbd85ff162c9b02fd4bfb67 100644
--- a/src/plugins/sensors/blackberry/bbtemperaturesensor.h
+++ b/src/plugins/sensors/blackberry/bbtemperaturesensor.h
@@ -42,20 +42,9 @@
 #define BBTEMPERATURESENSOR_H
 
 #include "bbsensorbackend.h"
+#include <qambienttemperaturesensor.h>
 
-class BbTemperatureReadingPrivate;
-
-class BbTemperatureReading : public QSensorReading
-{
-    Q_OBJECT
-    Q_PROPERTY(qreal temperature READ temperature)
-    DECLARE_READING(BbTemperatureReading)
-public:
-    qreal temperature() const;
-    void setTemperature(qreal temperature);
-};
-
-class BbTemperatureSensor : public BbSensorBackend<BbTemperatureReading>
+class BbTemperatureSensor : public BbSensorBackend<QAmbientTemperatureReading>
 {
     Q_OBJECT
 
@@ -65,7 +54,7 @@ public:
     static QString devicePath();
 
 protected:
-    bool updateReadingFromEvent(const sensor_event_t &event, BbTemperatureReading *reading);
+    bool updateReadingFromEvent(const sensor_event_t &event, QAmbientTemperatureReading *reading);
 };
 
 #endif
diff --git a/src/plugins/sensors/blackberry/blackberry.pro b/src/plugins/sensors/blackberry/blackberry.pro
index 73027c20b80bbaa66fa7e1bf623b121d5a09c568..902239c484c604759f99c856aab733915da10a06 100644
--- a/src/plugins/sensors/blackberry/blackberry.pro
+++ b/src/plugins/sensors/blackberry/blackberry.pro
@@ -12,6 +12,10 @@ config_bbsensor_compass {
     DEFINES += HAVE_COMPASS_SENSOR
 }
 
+config_bbsensor_holster {
+    DEFINES += HAVE_HOLSTER_SENSOR
+}
+
 HEADERS += bbsensorbackend.h \
     bbaccelerometer.h \
     bbaltimeter.h \
@@ -47,4 +51,9 @@ SOURCES += bbsensorbackend.cpp \
     bbutil.cpp \
     main.cpp
 
+config_bbsensor_holster {
+    HEADERS += bbholstersensor.h
+    SOURCES += bbholstersensor.cpp
+}
+
 OTHER_FILES = plugin.json
diff --git a/src/plugins/sensors/blackberry/main.cpp b/src/plugins/sensors/blackberry/main.cpp
index 7c2d5dbc254ebb3d12b757f5d645ce596d5cf08c..61f9aa0853a7ea499773ea82341c66f159717acb 100644
--- a/src/plugins/sensors/blackberry/main.cpp
+++ b/src/plugins/sensors/blackberry/main.cpp
@@ -43,6 +43,9 @@
 #include "bbambientlightsensor.h"
 #include "bbcompass.h"
 #include "bbgyroscope.h"
+#ifdef HAVE_HOLSTER_SENSOR
+#include "bbholstersensor.h"
+#endif
 #include "bbirproximitysensor.h"
 #include "bblightsensor.h"
 #include "bbmagnetometer.h"
@@ -61,6 +64,9 @@ static const char *bbAltitmeterId = "bbAltimeter";
 static const char *bbAmbientLightSensorId = "bbAmbientLightSensor";
 static const char *bbCompassId = "bbCompass";
 static const char *bbGyroscopeId = "bbGyroscope";
+#ifdef HAVE_HOLSTER_SENSOR
+static const char *bbHolsterSensorId = "bbHolsterSensor";
+#endif
 static const char *bbIRProximitySensorId = "bbIRProximitySensor";
 static const char *bbLightSensorId = "bbLightSensor";
 static const char *bbMagnetometerId = "bbMagnetometer";
@@ -82,13 +88,17 @@ public:
         if (sensorSupported(BbAccelerometer::devicePath()))
             QSensorManager::registerBackend(QAccelerometer::type, bbAccelerometerId, this);
         if (sensorSupported(BbAltimeter::devicePath()))
-            QSensorManager::registerBackend("BbAltimeter", bbAltitmeterId, this);
+            QSensorManager::registerBackend(QAltimeter::type, bbAltitmeterId, this);
         if (sensorSupported(BbAmbientLightSensor::devicePath()))
             QSensorManager::registerBackend(QAmbientLightSensor::type, bbAmbientLightSensorId, this);
         if (sensorSupported(BbCompass::devicePath()))
             QSensorManager::registerBackend(QCompass::type, bbCompassId, this);
         if (sensorSupported(BbGyroscope::devicePath()))
             QSensorManager::registerBackend(QGyroscope::type, bbGyroscopeId, this);
+#ifdef HAVE_HOLSTER_SENSOR
+        if (sensorSupported(BbHolsterSensor::devicePath()))
+            QSensorManager::registerBackend(QHolsterSensor::type, bbHolsterSensorId, this);
+#endif
         if (sensorSupported(BbIRProximitySensor::devicePath()))
             QSensorManager::registerBackend(QIRProximitySensor::type, bbIRProximitySensorId, this);
         if (sensorSupported(BbLightSensor::devicePath()))
@@ -98,13 +108,13 @@ public:
         if (sensorSupported(BbOrientationSensor::devicePath()))
             QSensorManager::registerBackend(QOrientationSensor::type, bbOrientationSensorId, this);
         if (sensorSupported(BbPressureSensor::devicePath()))
-            QSensorManager::registerBackend("BbPressureSensor", bbPressureSensorId, this);
+            QSensorManager::registerBackend(QPressureSensor::type, bbPressureSensorId, this);
         if (sensorSupported(BbProximitySensor::devicePath()))
             QSensorManager::registerBackend(QProximitySensor::type, bbProximitySensorId, this);
         if (sensorSupported(BbRotationSensor::devicePath()))
             QSensorManager::registerBackend(QRotationSensor::type, bbRotationSensorId, this);
         if (sensorSupported(BbTemperatureSensor::devicePath()))
-            QSensorManager::registerBackend("BbTemperatureSensor", bbTemperatureSensorId, this);
+            QSensorManager::registerBackend(QAmbientTemperatureSensor::type, bbTemperatureSensorId, this);
     }
 
     QSensorBackend *createBackend(QSensor *sensor) Q_DECL_OVERRIDE
@@ -120,6 +130,10 @@ public:
             backend = new BbCompass(sensor);
         if (sensor->identifier() == bbGyroscopeId)
             backend = new BbGyroscope(sensor);
+#ifdef HAVE_HOLSTER_SENSOR
+        if (sensor->identifier() == bbHolsterSensorId)
+            backend = new BbHolsterSensor(sensor);
+#endif
         if (sensor->identifier() == bbIRProximitySensorId)
             backend = new BbIRProximitySensor(sensor);
         if (sensor->identifier() == bbLightSensorId)
diff --git a/src/plugins/sensors/dummy/dummy.pro b/src/plugins/sensors/dummy/dummy.pro
index b97bd9ce3b12ad626ed52efef7fb2586449641b8..f54588af146f85e5c69fef5821f9495dbdca4f99 100644
--- a/src/plugins/sensors/dummy/dummy.pro
+++ b/src/plugins/sensors/dummy/dummy.pro
@@ -15,4 +15,4 @@ SOURCES += dummycommon.cpp\
 
 OTHER_FILES = plugin.json
 
-unix:!mac:!qnx:LIBS+=-lrt
+unix:!mac:!qnx:!android:LIBS+=-lrt
diff --git a/src/plugins/sensors/generic/generic.pro b/src/plugins/sensors/generic/generic.pro
index 2d4f9f9f924a1cd495d44dcdf9b5549b9593f770..fcc1bfcdbda2c840f33bf4614ac8b284105b0ad7 100644
--- a/src/plugins/sensors/generic/generic.pro
+++ b/src/plugins/sensors/generic/generic.pro
@@ -4,15 +4,27 @@ QT = core sensors
 PLUGIN_TYPE = sensors
 load(qt_plugin)
 
-HEADERS += genericorientationsensor.h\
-           genericrotationsensor.h\
-           genericalssensor.h\
-           generictiltsensor.h
-
-SOURCES += genericorientationsensor.cpp\
-           main.cpp\
-           genericrotationsensor.cpp\
-           genericalssensor.cpp\
+HEADERS += generictiltsensor.h
+
+SOURCES += main.cpp\
            generictiltsensor.cpp
+DEFINES += QTSENSORS_GENERICTILTSENSOR
+
+!blackberry {
+    HEADERS += genericorientationsensor.h\
+               genericalssensor.h
+
+    SOURCES += genericorientationsensor.cpp\
+               genericalssensor.cpp
+    DEFINES += QTSENSORS_GENERICORIENTATIONSENSOR QTSENSORS_GENERICALSSENSOR
+}
+
+!blackberry:!android {
+    HEADERS += genericrotationsensor.h
+
+    SOURCES += genericrotationsensor.cpp
+
+    DEFINES += QTSENSORS_GENERICROTATIONSENSOR
+}
 
 OTHER_FILES = plugin.json
diff --git a/src/plugins/sensors/generic/genericrotationsensor.cpp b/src/plugins/sensors/generic/genericrotationsensor.cpp
index b5f80cb3fdb6ef3b9c93148842404afe95e7f8de..0548adc0974969578d24ec137a51c07a0c23f4eb 100644
--- a/src/plugins/sensors/generic/genericrotationsensor.cpp
+++ b/src/plugins/sensors/generic/genericrotationsensor.cpp
@@ -57,7 +57,9 @@ genericrotationsensor::genericrotationsensor(QSensor *sensor)
     setReading<QRotationReading>(&m_reading);
     setDataRates(accelerometer);
 
-    sensor->setProperty("hasZ", false);
+    QRotationSensor * const rotationSensor = qobject_cast<QRotationSensor *>(sensor);
+    if (rotationSensor)
+        rotationSensor->setHasZ(false);
 }
 
 void genericrotationsensor::start()
diff --git a/src/plugins/sensors/generic/genericrotationsensor.h b/src/plugins/sensors/generic/genericrotationsensor.h
index 3475cafe4dcbcf9a55ac5494ae27d5d3792544b4..ffa48ea315d719a86725aa774ce38caaa5505125 100644
--- a/src/plugins/sensors/generic/genericrotationsensor.h
+++ b/src/plugins/sensors/generic/genericrotationsensor.h
@@ -62,7 +62,6 @@ public:
 private:
     QRotationReading m_reading;
     QAccelerometer *accelerometer;
-    QMagnetometer *magnetometer;
 };
 
 #endif
diff --git a/src/plugins/sensors/generic/generictiltsensor.cpp b/src/plugins/sensors/generic/generictiltsensor.cpp
index 6aefb576c9d75c76f9c79e36ffb06f15250e2729..95c8525b2165f7f19b60c405a5060de7d2a2ed79 100644
--- a/src/plugins/sensors/generic/generictiltsensor.cpp
+++ b/src/plugins/sensors/generic/generictiltsensor.cpp
@@ -53,6 +53,8 @@ GenericTiltSensor::GenericTiltSensor(QSensor *sensor)
     , roll(0)
     , calibratedPitch(0)
     , calibratedRoll(0)
+    , xRotation(0)
+    , yRotation(0)
 {
     accelerometer = new QAccelerometer(this);
     accelerometer->addFilter(this);
@@ -106,6 +108,11 @@ void GenericTiltSensor::calibrate()
     calibratedRoll = roll;
 }
 
+static qreal rad2deg(qreal rad)
+{
+    return rad / (2 * M_PI) * 360;
+}
+
 bool GenericTiltSensor::filter(QAccelerometerReading *reading)
 {
     /*
@@ -119,16 +126,16 @@ bool GenericTiltSensor::filter(QAccelerometerReading *reading)
     qreal az = reading->z();
 #ifdef LOGCALIBRATION
     qDebug() << "------------ new value -----------";
-    qDebug() << "old _pitch: " << _pitch;
-    qDebug() << "old _roll: " << _roll;
-    qDebug() << "_calibratedPitch: " << _calibratedPitch;
-    qDebug() << "_calibratedRoll: " << _calibratedRoll;
+    qDebug() << "old _pitch: " << pitch;
+    qDebug() << "old _roll: " << roll;
+    qDebug() << "_calibratedPitch: " << calibratedPitch;
+    qDebug() << "_calibratedRoll: " << calibratedRoll;
 #endif
     pitch = calcPitch(ax, ay, az);
     roll  = calcRoll (ax, ay, az);
 #ifdef LOGCALIBRATION
-    qDebug() << "_pitch: " << _pitch;
-    qDebug() << "_roll: " << _roll;
+    qDebug() << "_pitch: " << pitch;
+    qDebug() << "_roll: " << roll;
 #endif
     qreal xrot = roll - calibratedRoll;
     qreal yrot = pitch - calibratedPitch;
@@ -154,23 +161,22 @@ bool GenericTiltSensor::filter(QAccelerometerReading *reading)
     qDebug() << "new yrot: " << yrot;
     qDebug() << "----------------------------------";
 #endif
-    qreal dxrot = xrot - xRotation;
-    qreal dyrot = yrot - yRotation;
+    qreal dxrot = rad2deg(xrot) - xRotation;
+    qreal dyrot = rad2deg(yrot) - yRotation;
     if (dxrot < 0) dxrot = -dxrot;
     if (dyrot < 0) dyrot = -dyrot;
 
-    bool change = false;
-    if (dxrot >= radAccuracy) {
-        xRotation = xrot;
-        change = true;
+    bool setNewReading = false;
+    if (dxrot >= rad2deg(radAccuracy) || !sensor()->skipDuplicates()) {
+        xRotation = rad2deg(xrot);
+        setNewReading = true;
     }
-    if (dyrot >= radAccuracy) {
-        yRotation = yrot;
-        change = true;
+    if (dyrot >= rad2deg(radAccuracy) || !sensor()->skipDuplicates()) {
+        yRotation = rad2deg(yrot);
+        setNewReading = true;
     }
-    if (xRotation != m_reading.xRotation()
-            || yRotation != m_reading.yRotation()
-            || m_reading.timestamp() == 0) {
+
+    if (setNewReading || m_reading.timestamp() == 0) {
         m_reading.setTimestamp(reading->timestamp());
         m_reading.setXRotation(xRotation);
         m_reading.setYRotation(yRotation);
@@ -179,3 +185,8 @@ bool GenericTiltSensor::filter(QAccelerometerReading *reading)
 
     return false;
 }
+
+bool GenericTiltSensor::isFeatureSupported(QSensor::Feature feature) const
+{
+    return (feature == QSensor::SkipDuplicates);
+}
diff --git a/src/plugins/sensors/generic/generictiltsensor.h b/src/plugins/sensors/generic/generictiltsensor.h
index 0633662c96ddcb91591a5f3cdaabbed83efa54c1..0f84ca6f3316dfc82bf6f2f20706c8af15e04226 100644
--- a/src/plugins/sensors/generic/generictiltsensor.h
+++ b/src/plugins/sensors/generic/generictiltsensor.h
@@ -46,7 +46,6 @@
 #include <qtiltsensor.h>
 #include <qaccelerometer.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class GenericTiltSensor : public QSensorBackend, public QAccelerometerFilter
@@ -64,6 +63,8 @@ public:
 
     bool filter(QAccelerometerReading *reading);
 
+    bool isFeatureSupported(QSensor::Feature feature) const Q_DECL_OVERRIDE;
+
 private:
     QTiltReading m_reading;
     QAccelerometer *accelerometer;
@@ -77,7 +78,6 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/plugins/sensors/generic/main.cpp b/src/plugins/sensors/generic/main.cpp
index 15507b6382ec9d6b4e09080a1452118f1ea637c0..aa9f58c2dbb0fef5610c8e2b272f37ef3201e1b7 100644
--- a/src/plugins/sensors/generic/main.cpp
+++ b/src/plugins/sensors/generic/main.cpp
@@ -39,9 +39,18 @@
 **
 ****************************************************************************/
 
+#ifdef QTSENSORS_GENERICORIENTATIONSENSOR
 #include "genericorientationsensor.h"
+#endif
+#ifdef QTSENSORS_GENERICROTATIONSENSOR
 #include "genericrotationsensor.h"
+#endif
+#ifdef QTSENSORS_GENERICALSSENSOR
 #include "genericalssensor.h"
+#endif
+#ifdef QTSENSORS_GENERICTILTSENSOR
+#include "generictiltsensor.h"
+#endif
 #include <qsensorplugin.h>
 #include <qsensorbackend.h>
 #include <qsensormanager.h>
@@ -56,7 +65,6 @@ class genericSensorPlugin : public QObject, public QSensorPluginInterface, publi
 public:
     void registerSensors()
     {
-        qDebug() << "loaded the Generic plugin";
         // Nothing to register here
     }
 
@@ -64,34 +72,60 @@ public:
     {
         if (!QSensor::defaultSensorForType(QAccelerometer::type).isEmpty()) {
             // There is an accelerometer available. Register the backends
+#ifdef QTSENSORS_GENERICORIENTATIONSENSOR
             if (!QSensorManager::isBackendRegistered(QOrientationSensor::type, genericorientationsensor::id))
                 QSensorManager::registerBackend(QOrientationSensor::type, genericorientationsensor::id, this);
+#endif
+#ifdef QTSENSORS_GENERICROTATIONSENSOR
             if (!QSensorManager::isBackendRegistered(QRotationSensor::type, genericrotationsensor::id))
                 QSensorManager::registerBackend(QRotationSensor::type, genericrotationsensor::id, this);
+#endif
+#ifdef QTSENSORS_GENERICALSSENSOR
             if (!QSensorManager::isBackendRegistered(QAmbientLightSensor::type, genericalssensor::id))
                 QSensorManager::registerBackend(QAmbientLightSensor::type, genericalssensor::id, this);
-            if (!QSensorManager::isBackendRegistered(QAmbientLightSensor::type, genericalssensor::id))
-                QSensorManager::registerBackend(QAmbientLightSensor::type, genericalssensor::id, this);
+#endif
+#ifdef QTSENSORS_GENERICTILTSENSOR
+            if (!QSensorManager::isBackendRegistered(QTiltSensor::type, GenericTiltSensor::id))
+                QSensorManager::registerBackend(QTiltSensor::type, GenericTiltSensor::id, this);
+#endif
         } else {
+#ifdef QTSENSORS_GENERICORIENTATIONSENSOR
             if (QSensorManager::isBackendRegistered(QOrientationSensor::type, genericorientationsensor::id))
                 QSensorManager::unregisterBackend(QOrientationSensor::type, genericorientationsensor::id);
+#endif
+#ifdef QTSENSORS_GENERICROTATIONSENSOR
             if (QSensorManager::isBackendRegistered(QRotationSensor::type, genericrotationsensor::id))
                 QSensorManager::unregisterBackend(QRotationSensor::type, genericrotationsensor::id);
+#endif
+#ifdef QTSENSORS_GENERICALSSENSOR
             if (QSensorManager::isBackendRegistered(QAmbientLightSensor::type, genericalssensor::id))
                 QSensorManager::unregisterBackend(QAmbientLightSensor::type, genericalssensor::id);
+#endif
+#ifdef QTSENSORS_GENERICTILTSENSOR
+            if (QSensorManager::isBackendRegistered(QTiltSensor::type, GenericTiltSensor::id))
+                QSensorManager::unregisterBackend(QTiltSensor::type, GenericTiltSensor::id);
+#endif
         }
     }
 
     QSensorBackend *createBackend(QSensor *sensor)
     {
+#ifdef QTSENSORS_GENERICORIENTATIONSENSOR
         if (sensor->identifier() == genericorientationsensor::id)
             return new genericorientationsensor(sensor);
-
+#endif
+#ifdef QTSENSORS_GENERICROTATIONSENSOR
         if (sensor->identifier() == genericrotationsensor::id)
             return new genericrotationsensor(sensor);
-
+#endif
+#ifdef QTSENSORS_GENERICALSSENSOR
         if (sensor->identifier() == genericalssensor::id)
             return new genericalssensor(sensor);
+#endif
+#ifdef QTSENSORS_GENERICTILTSENSOR
+        if (sensor->identifier() == GenericTiltSensor::id)
+            return new GenericTiltSensor(sensor);
+#endif
 
         return 0;
     }
diff --git a/src/plugins/sensors/ios/ios.pro b/src/plugins/sensors/ios/ios.pro
new file mode 100644
index 0000000000000000000000000000000000000000..4242cfcaa3b387b711afd5c5b0efdf2080e47c77
--- /dev/null
+++ b/src/plugins/sensors/ios/ios.pro
@@ -0,0 +1,17 @@
+TARGET = qtsensors_ios
+QT = core sensors
+
+PLUGIN_TYPE = sensors
+PLUGIN_CLASS_NAME = IOSSensorPlugin
+load(qt_plugin)
+
+OTHER_FILES = plugin.json
+
+HEADERS += iosaccelerometer.h \
+        iosmotionmanager.h
+
+OBJECTIVE_SOURCES += main.mm \
+    iosaccelerometer.mm \
+    iosmotionmanager.mm
+
+LIBS += -framework UIKit -framework CoreMotion
diff --git a/src/plugins/sensors/ios/iosaccelerometer.h b/src/plugins/sensors/ios/iosaccelerometer.h
new file mode 100644
index 0000000000000000000000000000000000000000..34cc3ebdb48ca9cd03b276fccc1fab2347968335
--- /dev/null
+++ b/src/plugins/sensors/ios/iosaccelerometer.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Lorn Potter
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef IOSACCELEROMETER_H
+#define IOSACCELEROMETER_H
+
+#include <qsensorbackend.h>
+#include <qaccelerometer.h>
+
+QT_BEGIN_NAMESPACE
+
+@class QtIoAccelListener;
+
+class IOSAccelerometer : public QSensorBackend
+{
+public:
+    static char const * const id;
+
+    explicit IOSAccelerometer(QSensor *sensor);
+    ~IOSAccelerometer();
+
+    void start();
+    void stop();
+    void readingsChanged(quint64,qreal,qreal,qreal);
+
+private:
+    QtIoAccelListener *m_listener;
+    QAccelerometerReading m_reading;
+};
+QT_END_NAMESPACE
+
+#endif // IOSACCELEROMETER_H
+
diff --git a/src/plugins/sensors/ios/iosaccelerometer.mm b/src/plugins/sensors/ios/iosaccelerometer.mm
new file mode 100644
index 0000000000000000000000000000000000000000..ef7d2a6dd25bd1d187502f9d395602c673e6bf5e
--- /dev/null
+++ b/src/plugins/sensors/ios/iosaccelerometer.mm
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Lorn Potter
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "iosaccelerometer.h"
+#include "iosmotionmanager.h"
+
+#include <UIKit/UIAccelerometer.h>
+#include <CoreMotion/CMMotionManager.h>
+
+char const * const IOSAccelerometer::id("ios.accelerometer");
+
+@interface QtIoAccelListener : NSObject
+{
+    IOSAccelerometer *m_qiosAccelerometer;
+    NSOperationQueue *m_updateQueue;
+}
+@end
+
+@implementation QtIoAccelListener
+
+-(id)initWithQIOSAccelerometer:(IOSAccelerometer *) qiosAccelerometer
+{
+    self = [super init];
+    if (self) {
+        m_qiosAccelerometer = qiosAccelerometer;
+        m_updateQueue = [[NSOperationQueue alloc] init];
+    }
+    return self;
+}
+
+-(void)dealloc
+{
+    [m_updateQueue release];
+    [super dealloc];
+}
+
+-(void)startAccelerometer
+{
+    CMMotionManager *motionManager = [QIOSMotionManager sharedManager];
+
+    if (motionManager.deviceMotionAvailable) {
+        [motionManager startAccelerometerUpdatesToQueue:m_updateQueue withHandler:^(CMAccelerometerData *data, NSError *error) {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                Q_UNUSED(error);
+                CMAcceleration acc = data.acceleration;
+                // Convert from G to m/s2, and flip axes:
+                const qreal G = 9.8066;
+                qreal x = qreal(acc.x) * G * -1;
+                qreal y = qreal(acc.y) * G * -1;
+                qreal z = qreal(acc.z) * G * -1;
+                m_qiosAccelerometer->readingsChanged(quint64(data.timestamp), x, y, z);
+            });
+        }];
+    }
+}
+
+-(void)stopAccelerometer
+{
+    [[QIOSMotionManager sharedManager] stopAccelerometerUpdates];
+}
+
+-(void)setInterval:(NSTimeInterval) interval
+{
+    [QIOSMotionManager sharedManager].accelerometerUpdateInterval = interval;
+}
+
+@end
+
+QT_BEGIN_NAMESPACE
+
+IOSAccelerometer::IOSAccelerometer(QSensor *sensor)
+    : QSensorBackend(sensor)
+    , m_listener([[QtIoAccelListener alloc] initWithQIOSAccelerometer:this])
+{
+    setReading<QAccelerometerReading>(&m_reading);
+    addDataRate(1, 100); // 100Hz
+    addOutputRange(-22.418, 22.418, 0.17651); // 2G
+}
+
+IOSAccelerometer::~IOSAccelerometer()
+{
+    [m_listener dealloc];
+}
+
+void IOSAccelerometer::start()
+{
+    [m_listener startAccelerometer];
+}
+
+void IOSAccelerometer::stop()
+{
+    [m_listener stopAccelerometer];
+}
+
+void IOSAccelerometer::readingsChanged(quint64 ts, qreal x, qreal y, qreal z)
+{
+    m_reading.setTimestamp(ts);
+    m_reading.setX(x);
+    m_reading.setY(y);
+    m_reading.setZ(z);
+
+    newReadingAvailable();
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sensors/ios/iosmotionmanager.h b/src/plugins/sensors/ios/iosmotionmanager.h
new file mode 100644
index 0000000000000000000000000000000000000000..7babfc364c7394bd1463c5a55509d1834ee0fc1e
--- /dev/null
+++ b/src/plugins/sensors/ios/iosmotionmanager.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Lorn Potter
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef IOSMOTIONMANAGER_H
+#define IOSMOTIONMANAGER_H
+
+#import <UIKit/UIKit.h>
+#import <CoreMotion/CoreMotion.h>
+
+@interface QIOSMotionManager : NSObject {
+}
+
++ (CMMotionManager *)sharedManager;
+@end
+
+#endif //IOSMOTIONMANAGER_H
+
diff --git a/src/plugins/sensors/ios/iosmotionmanager.mm b/src/plugins/sensors/ios/iosmotionmanager.mm
new file mode 100644
index 0000000000000000000000000000000000000000..a367c49bbe9f6429d9007728b9ec044c9c961673
--- /dev/null
+++ b/src/plugins/sensors/ios/iosmotionmanager.mm
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Lorn Potter
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "iosmotionmanager.h"
+
+static CMMotionManager *sharedManager = nil;
+
+@implementation QIOSMotionManager
+
++ (CMMotionManager *)sharedManager
+{
+    static dispatch_once_t staticToken;
+    dispatch_once(&staticToken, ^{
+        sharedManager = [[CMMotionManager alloc] init];
+    });
+    return sharedManager;
+}
+
+@end
diff --git a/src/plugins/sensors/ios/main.mm b/src/plugins/sensors/ios/main.mm
new file mode 100644
index 0000000000000000000000000000000000000000..3c7393933dc225945ca9b94a7d14634c7973df47
--- /dev/null
+++ b/src/plugins/sensors/ios/main.mm
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qsensorplugin.h>
+#include <qsensorbackend.h>
+#include <qsensormanager.h>
+
+#include "iosaccelerometer.h"
+
+class IOSSensorPlugin : public QObject, public QSensorPluginInterface, public QSensorBackendFactory
+{
+    Q_OBJECT
+    Q_PLUGIN_METADATA(IID "com.qt-project.Qt.QSensorPluginInterface/1.0" FILE "plugin.json")
+    Q_INTERFACES(QSensorPluginInterface)
+public:
+    void registerSensors()
+    {
+        if (!QSensorManager::isBackendRegistered(QAccelerometer::type, IOSAccelerometer::id))
+            QSensorManager::registerBackend(QAccelerometer::type, IOSAccelerometer::id, this);
+    }
+
+    QSensorBackend *createBackend(QSensor *sensor)
+    {
+        if (sensor->identifier() == IOSAccelerometer::id)
+            return new IOSAccelerometer(sensor);
+
+        return 0;
+    }
+};
+
+#include "main.moc"
+
diff --git a/src/plugins/sensors/ios/plugin.json b/src/plugins/sensors/ios/plugin.json
new file mode 100644
index 0000000000000000000000000000000000000000..8a55b3ae4d279006a2877dbe80a28834c4ffb5f5
--- /dev/null
+++ b/src/plugins/sensors/ios/plugin.json
@@ -0,0 +1 @@
+{ "Keys": [ "notused" ] }
diff --git a/src/plugins/sensors/linux/linux.pro b/src/plugins/sensors/linux/linux.pro
index 7546728f6d8bd8916efbfdf9f9c2f48410a41d63..25c4f2d9f2abc53a69e09ae0ea31d9463d9d6da4 100644
--- a/src/plugins/sensors/linux/linux.pro
+++ b/src/plugins/sensors/linux/linux.pro
@@ -6,7 +6,7 @@ load(qt_plugin)
 
 OTHER_FILES = plugin.json
 
-LIBS += -lrt
+!android:LIBS += -lrt
 HEADERS += linuxsysaccelerometer.h
 SOURCES += linuxsysaccelerometer.cpp \
 main.cpp
diff --git a/src/plugins/sensors/sensorfw/Sensors.conf b/src/plugins/sensors/sensorfw/Sensors.conf
new file mode 100644
index 0000000000000000000000000000000000000000..a003f12c982e75d5d186813bf07beed14bed6dbe
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/Sensors.conf
@@ -0,0 +1,11 @@
+[Default]
+QAccelerometer=sensorfw.accelerometer
+QAmbientLightSensor=sensorfw.als
+QCompass=sensorfw.compass
+QMagnetometer=sensorfw.magnetometer
+QOrientationSensor=sensorfw.orientationsensor
+QProximitySensor=sensorfw.proximitysensor
+QRotationSensor=sensorfw.rotationsensor
+QTapSensor=sensorfw.tapsensor
+QLightSensor=sensorfw.lightsensor
+QIRProximitySensor=sensorfw.irproximitysensor
diff --git a/src/plugins/sensors/sensorfw/main.cpp b/src/plugins/sensors/sensorfw/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f12a193e8d5c50e119b40765bdf798f624f6d7bd
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/main.cpp
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfwaccelerometer.h"
+#include "sensorfwals.h"
+#include "sensorfwcompass.h"
+#include "sensorfwmagnetometer.h"
+#include "sensorfworientationsensor.h"
+#include "sensorfwproximitysensor.h"
+#include "sensorfwirproximitysensor.h"
+#include "sensorfwrotationsensor.h"
+#include "sensorfwtapsensor.h"
+#include "sensorfwgyroscope.h"
+#include "sensorfwlightsensor.h"
+
+#include <qsensorplugin.h>
+#include <qsensorbackend.h>
+#include <qsensormanager.h>
+#include <QDebug>
+#include <QSettings>
+
+class sensorfwSensorPlugin : public QObject, public QSensorPluginInterface, public QSensorBackendFactory
+{
+    Q_OBJECT
+    Q_PLUGIN_METADATA(IID "com.qt-project.Qt.QSensorPluginInterface/1.0" FILE "plugin.json")
+    Q_INTERFACES(QSensorPluginInterface)
+
+public:
+
+    void registerSensors()
+    {
+        // if no default - no support either, uses Sensors.conf
+        QSettings settings(QSettings::SystemScope, QLatin1String("QtProject"), QLatin1String("Sensors"));
+        settings.beginGroup(QLatin1String("Default"));
+        QStringList keys = settings.allKeys();
+        for (int i=0,l=keys.size(); i<l; i++) {
+            QString type = keys.at(i);
+            QSensorManager::registerBackend(type.toLocal8Bit(), settings.value(type).toByteArray(), this);
+        }
+    }
+
+
+    QSensorBackend *createBackend(QSensor *sensor)
+    {
+        if (sensor->identifier() == sensorfwaccelerometer::id)
+            return new sensorfwaccelerometer(sensor);
+        if (sensor->identifier() == Sensorfwals::id)
+            return new Sensorfwals(sensor);
+        if (sensor->identifier() == SensorfwCompass::id)
+            return new SensorfwCompass(sensor);
+        if (sensor->identifier() == SensorfwMagnetometer::id)
+            return new SensorfwMagnetometer(sensor);
+        if (sensor->identifier() == SensorfwOrientationSensor::id)
+            return new SensorfwOrientationSensor(sensor);
+        if (sensor->identifier() == SensorfwProximitySensor::id)
+            return new SensorfwProximitySensor(sensor);
+        if (sensor->identifier() == SensorfwRotationSensor::id)
+            return new SensorfwRotationSensor(sensor);
+        if (sensor->identifier() == SensorfwTapSensor::id)
+            return new SensorfwTapSensor(sensor);
+        if (sensor->identifier() == SensorfwGyroscope::id)
+            return new SensorfwGyroscope(sensor);
+        if (sensor->identifier() == SensorfwLightSensor::id)
+            return new SensorfwLightSensor(sensor);
+        if (sensor->identifier() == SensorfwIrProximitySensor::id)
+            return new SensorfwIrProximitySensor(sensor);
+        return 0;
+    }
+};
+
+#include "main.moc"
diff --git a/src/plugins/sensors/sensorfw/plugin.json b/src/plugins/sensors/sensorfw/plugin.json
new file mode 100644
index 0000000000000000000000000000000000000000..8a55b3ae4d279006a2877dbe80a28834c4ffb5f5
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/plugin.json
@@ -0,0 +1 @@
+{ "Keys": [ "notused" ] }
diff --git a/src/plugins/sensors/sensorfw/sensorfw.pri b/src/plugins/sensors/sensorfw/sensorfw.pri
new file mode 100644
index 0000000000000000000000000000000000000000..31d7254c33202cccc90578e34300ead5eac6756f
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfw.pri
@@ -0,0 +1,26 @@
+HEADERS += sensorfwsensorbase.h \
+    sensorfwaccelerometer.h \
+    sensorfwals.h \
+    sensorfwcompass.h \
+    sensorfwgyroscope.h \
+    sensorfwmagnetometer.h \
+    sensorfworientationsensor.h \
+    sensorfwproximitysensor.h \
+    sensorfwrotationsensor.h \
+    sensorfwtapsensor.h    \
+    sensorfwlightsensor.h  \
+    sensorfwirproximitysensor.h
+
+SOURCES += sensorfwsensorbase.cpp \
+    sensorfwaccelerometer.cpp \
+    sensorfwals.cpp \
+    sensorfwcompass.cpp \
+    sensorfwgyroscope.cpp \
+    sensorfwmagnetometer.cpp \
+    sensorfworientationsensor.cpp \
+    sensorfwproximitysensor.cpp \
+    sensorfwirproximitysensor.cpp \
+    sensorfwrotationsensor.cpp \
+    sensorfwtapsensor.cpp \
+    sensorfwlightsensor.cpp \
+    main.cpp
diff --git a/src/plugins/sensors/sensorfw/sensorfw.pro b/src/plugins/sensors/sensorfw/sensorfw.pro
new file mode 100644
index 0000000000000000000000000000000000000000..8d67c81f0ab9ad7216761018e8d093b1a31933ec
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfw.pro
@@ -0,0 +1,17 @@
+TARGET = qtsensors_sensorfw
+QT = core sensors network
+
+PLUGIN_TYPE = sensors
+load(qt_plugin)
+
+include(sensorfw.pri)
+
+
+CONFIG += link_pkgconfig
+PKGCONFIG += sensord
+
+CONFIGFILES.files = Sensors.conf
+CONFIGFILES.path = /etc/xdg/QtProject/
+INSTALLS += CONFIGFILES
+
+OTHER_FILES = plugin.json
diff --git a/src/plugins/sensors/sensorfw/sensorfwaccelerometer.cpp b/src/plugins/sensors/sensorfw/sensorfwaccelerometer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ddbaa9c67fa6e96ae7971e71302122aa1e57967c
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwaccelerometer.cpp
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfwaccelerometer.h"
+
+char const * const sensorfwaccelerometer::id("sensorfw.accelerometer");
+bool sensorfwaccelerometer::m_initDone = false;
+
+sensorfwaccelerometer::sensorfwaccelerometer(QSensor *sensor)
+    : SensorfwSensorBase(sensor)
+{
+    initSensor<AccelerometerSensorChannelInterface>(m_initDone);
+    setDescription(QLatin1String("x, y, and z axes accelerations in m/s^2"));
+    setRanges(GRAVITY_EARTH_THOUSANDTH);
+    setReading<QAccelerometerReading>(&m_reading);
+}
+
+void sensorfwaccelerometer::slotDataAvailable(const XYZ& data)
+{
+    // Convert from milli-Gs to meters per second per second
+    // Using 1 G = 9.80665 m/s^2
+    m_reading.setX(-data.x() * GRAVITY_EARTH_THOUSANDTH);
+    m_reading.setY(-data.y() * GRAVITY_EARTH_THOUSANDTH);
+    m_reading.setZ(-data.z() * GRAVITY_EARTH_THOUSANDTH);
+    m_reading.setTimestamp(data.XYZData().timestamp_);
+    newReadingAvailable();
+}
+
+void sensorfwaccelerometer::slotFrameAvailable(const QVector<XYZ>&  frame)
+{
+    for (int i=0, l=frame.size(); i<l; i++) {
+        slotDataAvailable(frame.at(i));
+    }
+}
+
+bool sensorfwaccelerometer::doConnect()
+{
+    if (m_bufferSize==1)
+        return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(const XYZ&)), this, SLOT(slotDataAvailable(const XYZ&)));
+    return QObject::connect(m_sensorInterface, SIGNAL(frameAvailable(const QVector<XYZ>& )),this, SLOT(slotFrameAvailable(const QVector<XYZ>& )));
+}
+
+
+QString sensorfwaccelerometer::sensorName() const
+{
+    return "accelerometersensor";
+}
+
+
+qreal sensorfwaccelerometer::correctionFactor() const
+{
+    return GRAVITY_EARTH_THOUSANDTH;
+}
diff --git a/src/plugins/sensors/sensorfw/sensorfwaccelerometer.h b/src/plugins/sensors/sensorfw/sensorfwaccelerometer.h
new file mode 100644
index 0000000000000000000000000000000000000000..1c94aae36120132d4336a3795e2ade5f82fdd234
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwaccelerometer.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef SENSORFWACCELEROMETER_H
+#define SENSORFWACCELEROMETER_H
+
+#include "sensorfwsensorbase.h"
+#include <qaccelerometer.h>
+
+#include <accelerometersensor_i.h>
+#include <datatypes/xyz.h>
+
+
+
+class sensorfwaccelerometer : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+    sensorfwaccelerometer(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual QString sensorName() const;
+    virtual qreal correctionFactor() const;
+
+
+private:
+    QAccelerometerReading m_reading;
+    static bool m_initDone;
+
+private slots:
+    void slotDataAvailable(const XYZ& data);
+    void slotFrameAvailable(const QVector<XYZ>&);
+};
+
+#endif
diff --git a/src/plugins/sensors/sensorfw/sensorfwals.cpp b/src/plugins/sensors/sensorfw/sensorfwals.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..811da77f4bd73e379c049d64a97b957e40334954
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwals.cpp
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "sensorfwals.h"
+
+char const * const Sensorfwals::id("sensorfw.als");
+bool Sensorfwals::m_initDone = false;
+
+Sensorfwals::Sensorfwals(QSensor *sensor)
+    : SensorfwSensorBase(sensor)
+{
+    initSensor<ALSSensorChannelInterface>(m_initDone);
+    setReading<QAmbientLightReading>(&m_reading);
+    // metadata
+    setDescription(QLatin1String("ambient light intensity given as 5 pre-defined levels"));
+    addOutputRange(0, 5, 1);
+    addDataRate(10,10);
+}
+
+void Sensorfwals::start()
+{
+    if (m_sensorInterface) {
+        Unsigned data(((ALSSensorChannelInterface*)m_sensorInterface)->lux());
+        m_reading.setLightLevel(getLightLevel(data.x()));
+        m_reading.setTimestamp(data.UnsignedData().timestamp_);
+        newReadingAvailable();
+    }
+    SensorfwSensorBase::start();
+}
+
+
+void Sensorfwals::slotDataAvailable(const Unsigned& data)
+{
+    QAmbientLightReading::LightLevel level = getLightLevel(data.x());
+    if (level != m_reading.lightLevel()) {
+        m_reading.setLightLevel(level);
+        m_reading.setTimestamp(data.UnsignedData().timestamp_);
+        newReadingAvailable();
+    }
+}
+
+bool Sensorfwals::doConnect()
+{
+    return QObject::connect(m_sensorInterface, SIGNAL(ALSChanged(const Unsigned&)),
+                            this, SLOT(slotDataAvailable(const Unsigned&)));
+}
+
+
+QString Sensorfwals::sensorName() const
+{
+    return "alssensor";
+}
+
+
+QAmbientLightReading::LightLevel Sensorfwals::getLightLevel(int lux)
+{
+    // Convert from integer to fixed levels
+    if (lux < 0) {
+        return QAmbientLightReading::Undefined;
+    } else if (lux < 10) {
+        return QAmbientLightReading::Dark;
+    } else if (lux < 50) {
+        return QAmbientLightReading::Twilight;
+    } else if (lux < 100) {
+        return QAmbientLightReading::Light;
+    } else if (lux < 150) {
+        return QAmbientLightReading::Bright;
+    } else {
+        return QAmbientLightReading::Sunny;
+    }
+
+}
diff --git a/src/plugins/sensors/sensorfw/sensorfwals.h b/src/plugins/sensors/sensorfw/sensorfwals.h
new file mode 100644
index 0000000000000000000000000000000000000000..ba7c9af14e5ca5e93e7f8ae4cfed3f50a958a262
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwals.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SENSORFWALS_H
+#define SENSORFWALS_H
+
+#include "sensorfwsensorbase.h"
+#include <qambientlightsensor.h>
+
+#include <alssensor_i.h>
+#include <unsigned.h>
+
+
+
+class Sensorfwals : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+    Sensorfwals(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual QString sensorName() const;
+    virtual void start();
+
+
+private:
+    QAmbientLightReading m_reading;
+    static bool m_initDone;
+private slots:
+    void slotDataAvailable(const Unsigned& data);
+    static QAmbientLightReading::LightLevel getLightLevel(int lux);
+
+};
+
+#endif
diff --git a/src/plugins/sensors/sensorfw/sensorfwcompass.cpp b/src/plugins/sensors/sensorfw/sensorfwcompass.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..00741a1f419e0246162b405733c3893ae6333ded
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwcompass.cpp
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "sensorfwcompass.h"
+
+char const * const SensorfwCompass::id("sensorfw.compass");
+bool SensorfwCompass::m_initDone = false;
+
+SensorfwCompass::SensorfwCompass(QSensor *sensor)
+    : SensorfwSensorBase(sensor)
+{
+    initSensor<CompassSensorChannelInterface>(m_initDone);
+    setReading<QCompassReading>(&m_reading);
+}
+
+void SensorfwCompass::slotDataAvailable(const Compass& data)
+{
+    // The scale for level is [0,3], where 3 is the best
+    // Qt: Measured as a value from 0 to 1 with higher values being better.
+    m_reading.setCalibrationLevel(((float) data.level()) / 3.0);
+
+    // The scale for degrees from sensord is [0,359]
+    // Value can be directly used as azimuth
+    m_reading.setAzimuth(data.degrees());
+
+    m_reading.setTimestamp(data.data().timestamp_);
+    newReadingAvailable();
+}
+
+
+bool SensorfwCompass::doConnect()
+{
+    return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(const Compass&)),
+                            this, SLOT(slotDataAvailable(const Compass&)));
+}
+
+QString SensorfwCompass::sensorName() const
+{
+    return "compasssensor";
+}
+
diff --git a/src/plugins/sensors/sensorfw/sensorfwcompass.h b/src/plugins/sensors/sensorfw/sensorfwcompass.h
new file mode 100644
index 0000000000000000000000000000000000000000..e54c348ee34b5024746597db297b510a10c2e310
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwcompass.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef SENSORFWCOMPASS_H
+#define SENSORFWCOMPASS_H
+
+#include "sensorfwsensorbase.h"
+#include <qcompass.h>
+
+#include <compasssensor_i.h>
+#include <compass.h>
+
+
+
+class SensorfwCompass : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+    SensorfwCompass(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual QString sensorName() const;
+
+private:
+    QCompassReading m_reading;
+    static bool m_initDone;
+private slots:
+    void slotDataAvailable(const Compass& data);
+};
+
+#endif
diff --git a/src/plugins/sensors/sensorfw/sensorfwgyroscope.cpp b/src/plugins/sensors/sensorfw/sensorfwgyroscope.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..238993ac6b9941a089890c284a138de85d83027c
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwgyroscope.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfwgyroscope.h"
+
+char const * const SensorfwGyroscope::id("sensorfw.gyroscope");
+const float SensorfwGyroscope::MILLI = 0.001;
+bool SensorfwGyroscope::m_initDone = false;
+
+SensorfwGyroscope::SensorfwGyroscope(QSensor *sensor)
+    : SensorfwSensorBase(sensor)
+{
+    initSensor<GyroscopeSensorChannelInterface>(m_initDone);
+    setDescription(QLatin1String("angular velocities around x, y, and z axis in degrees per second"));
+    setRanges(MILLI);
+    setReading<QGyroscopeReading>(&m_reading);
+    addDataRate(10, 10);
+    addDataRate(50, 50);
+}
+
+void SensorfwGyroscope::slotDataAvailable(const XYZ& data)
+{
+    m_reading.setX((qreal)(data.x()*MILLI));
+    m_reading.setY((qreal)(data.y()*MILLI));
+    m_reading.setZ((qreal)(data.z()*MILLI));
+    m_reading.setTimestamp(data.XYZData().timestamp_);
+    newReadingAvailable();
+}
+
+void SensorfwGyroscope::slotFrameAvailable(const QVector<XYZ>&  frame)
+{
+    for (int i=0, l=frame.size(); i<l; i++) {
+        slotDataAvailable(frame.at(i));
+    }
+}
+
+bool SensorfwGyroscope::doConnect()
+{
+    if (m_bufferSize==1)
+        return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(const XYZ&)), this, SLOT(slotDataAvailable(const XYZ&)));
+    return QObject::connect(m_sensorInterface, SIGNAL(frameAvailable(const QVector<XYZ>& )),this, SLOT(slotFrameAvailable(const QVector<XYZ>& )));
+}
+
+QString SensorfwGyroscope::sensorName() const
+{
+    return "gyroscopesensor";
+}
+
+qreal SensorfwGyroscope::correctionFactor() const
+{
+    return MILLI;
+}
diff --git a/src/plugins/sensors/sensorfw/sensorfwgyroscope.h b/src/plugins/sensors/sensorfw/sensorfwgyroscope.h
new file mode 100644
index 0000000000000000000000000000000000000000..e982c8092b63aabc59ef0dd88db7a5bdb851f31c
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwgyroscope.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef SENSORFWGYROSCOPE_H
+#define SENSORFWGYROSCOPE_H
+
+#include "sensorfwsensorbase.h"
+#include <qgyroscope.h>
+#include <datatypes/xyz.h>
+#include <gyroscopesensor_i.h>
+
+
+
+
+class SensorfwGyroscope : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+    SensorfwGyroscope(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual QString sensorName() const;
+    virtual qreal correctionFactor() const;
+
+
+private:
+    QGyroscopeReading m_reading;
+    static bool m_initDone;
+    static const float MILLI;
+private slots:
+    void slotDataAvailable(const XYZ& data);
+    void slotFrameAvailable(const QVector<XYZ>&);
+
+};
+
+
+#endif // sensorfwGYROSCOPE_H
diff --git a/src/plugins/sensors/sensorfw/sensorfwirproximitysensor.cpp b/src/plugins/sensors/sensorfw/sensorfwirproximitysensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..865d376095eee518f98fe2599a1145c12f88a23f
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwirproximitysensor.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfwirproximitysensor.h"
+#define RM680_PS "/dev/bh1770glc_ps"
+
+char const * const SensorfwIrProximitySensor::id("sensorfw.irproximitysensor");
+bool SensorfwIrProximitySensor::m_initDone = false;
+
+
+
+SensorfwIrProximitySensor::SensorfwIrProximitySensor(QSensor *sensor)
+    : SensorfwSensorBase(sensor)
+{
+    initSensor<ProximitySensorChannelInterface>(m_initDone);
+    setReading<QIRProximityReading>(&m_reading);
+    setDescription(QLatin1String("reflectance as percentage (%) of maximum"));
+    addOutputRange(0, 100, 1);
+    addDataRate(10,10);
+    rangeMax = QFile::exists(RM680_PS)?255:1023;
+}
+
+void SensorfwIrProximitySensor::slotDataAvailable(const Proximity& proximity)
+{
+    m_reading.setReflectance((float)proximity.reflectance()*100 / rangeMax);
+    m_reading.setTimestamp(proximity.UnsignedData().timestamp_);
+    newReadingAvailable();
+}
+
+
+bool SensorfwIrProximitySensor::doConnect()
+{
+    return QObject::connect(m_sensorInterface, SIGNAL(reflectanceDataAvailable(const Proximity&)),
+                            this, SLOT(slotDataAvailable(const Proximity&)));
+}
+
+
+QString SensorfwIrProximitySensor::sensorName() const
+{
+    return "proximitysensor";
+}
+
+
diff --git a/src/plugins/sensors/sensorfw/sensorfwirproximitysensor.h b/src/plugins/sensors/sensorfw/sensorfwirproximitysensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..c729f595ac784137eb137e48b3e3463ef492a93f
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwirproximitysensor.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SENSORFWIRPROXIMITYSENSOR_H
+#define SENSORFWIRPROXIMITYSENSOR_H
+
+#include "sensorfwsensorbase.h"
+#include <qirproximitysensor.h>
+#include <proximitysensor_i.h>
+
+
+class SensorfwIrProximitySensor : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+
+    SensorfwIrProximitySensor(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual QString sensorName() const;
+
+private:
+    QIRProximityReading m_reading;
+    static bool m_initDone;
+    int rangeMax;
+
+private slots:
+    void slotDataAvailable(const Proximity& proximity);
+};
+
+#endif
diff --git a/src/plugins/sensors/sensorfw/sensorfwlightsensor.cpp b/src/plugins/sensors/sensorfw/sensorfwlightsensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b49e7b2d8481c76e09ba3a5c49dc0d63ae3096ca
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwlightsensor.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfwlightsensor.h"
+
+char const * const SensorfwLightSensor::id("sensorfw.lightsensor");
+bool SensorfwLightSensor::m_initDone = false;
+
+SensorfwLightSensor::SensorfwLightSensor(QSensor *sensor)
+    : SensorfwSensorBase(sensor)
+{
+    initSensor<ALSSensorChannelInterface>(m_initDone);
+    setReading<QLightReading>(&m_reading);
+}
+
+void SensorfwLightSensor::slotDataAvailable(const Unsigned& data)
+{
+    m_reading.setLux(data.x());
+    m_reading.setTimestamp(data.UnsignedData().timestamp_);
+    newReadingAvailable();
+}
+
+bool SensorfwLightSensor::doConnect()
+{
+    return QObject::connect(m_sensorInterface, SIGNAL(ALSChanged(const Unsigned&)),
+                            this, SLOT(slotDataAvailable(const Unsigned&)));
+}
+
+
+QString SensorfwLightSensor::sensorName() const
+{
+    return "alssensor";
+}
diff --git a/src/plugins/sensors/sensorfw/sensorfwlightsensor.h b/src/plugins/sensors/sensorfw/sensorfwlightsensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..83591faea9bd9225f2ed17a7d80d4376d0b5eccb
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwlightsensor.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef SENSORFWLIGHTSENSOR_H
+#define SENSORFWLIGHTSENSOR_H
+
+#include "sensorfwsensorbase.h"
+#include <qlightsensor.h>
+
+#include <alssensor_i.h>
+#include <unsigned.h>
+
+
+
+class SensorfwLightSensor : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+    SensorfwLightSensor(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual QString sensorName() const;
+
+private:
+    QLightReading m_reading;
+    static bool m_initDone;
+private slots:
+    void slotDataAvailable(const Unsigned& data);
+};
+
+#endif
diff --git a/src/plugins/sensors/sensorfw/sensorfwmagnetometer.cpp b/src/plugins/sensors/sensorfw/sensorfwmagnetometer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9778b95c2dae4cfdd3482593b0c4491871a516ea
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwmagnetometer.cpp
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfwmagnetometer.h"
+
+char const * const SensorfwMagnetometer::id("sensorfw.magnetometer");
+bool SensorfwMagnetometer::m_initDone = false;
+const float SensorfwMagnetometer::NANO = 0.000000001;
+
+
+SensorfwMagnetometer::SensorfwMagnetometer(QSensor *sensor)
+    : SensorfwSensorBase(sensor)
+{
+    initSensor<MagnetometerSensorChannelInterface>(m_initDone);
+    setDescription(QLatin1String("magnetic flux density in teslas (T)"));
+    setRanges(NANO);
+    setReading<QMagnetometerReading>(&m_reading);
+}
+
+void SensorfwMagnetometer::start()
+{
+    m_isGeoMagnetometer = sensor()->returnGeoValues();
+    SensorfwSensorBase::start();
+}
+
+void SensorfwMagnetometer::slotDataAvailable(const MagneticField& data)
+{
+    //nanoTeslas given, divide with 10^9 to get Teslas
+    m_reading.setX( NANO * (m_isGeoMagnetometer?data.x():data.rx()));
+    m_reading.setY( NANO * (m_isGeoMagnetometer?data.y():data.ry()));
+    m_reading.setZ( NANO * (m_isGeoMagnetometer?data.z():data.rz()));
+    m_reading.setCalibrationLevel( m_isGeoMagnetometer?((float) data.level()) / 3.0 :1);
+    m_reading.setTimestamp(data.timestamp());
+    newReadingAvailable();
+}
+
+
+void SensorfwMagnetometer::slotFrameAvailable(const QVector<MagneticField>&   frame)
+{
+    for (int i=0, l=frame.size(); i<l; i++) {
+        slotDataAvailable(frame.at(i));
+    }
+}
+
+bool SensorfwMagnetometer::doConnect()
+{
+    if (m_bufferSize==1)
+        return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(const MagneticField&)), this, SLOT(slotDataAvailable(const MagneticField&)));
+     return QObject::connect(m_sensorInterface, SIGNAL(frameAvailable(const QVector<MagneticField>& )),this, SLOT(slotFrameAvailable(const QVector<MagneticField>& )));
+}
+
+QString SensorfwMagnetometer::sensorName() const
+{
+    return "magnetometersensor";
+}
+
+qreal SensorfwMagnetometer::correctionFactor() const
+{
+    return SensorfwMagnetometer::NANO;
+}
diff --git a/src/plugins/sensors/sensorfw/sensorfwmagnetometer.h b/src/plugins/sensors/sensorfw/sensorfwmagnetometer.h
new file mode 100644
index 0000000000000000000000000000000000000000..dff70c099c3be6f813796aae6986a74ad8a2fe00
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwmagnetometer.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SENSORFWMAGNETOMETER_H
+#define SENSORFWMAGNETOMETER_H
+
+#include "sensorfwsensorbase.h"
+#include <qmagnetometer.h>
+
+#include <magnetometersensor_i.h>
+#include <magneticfield.h>
+
+
+
+class SensorfwMagnetometer : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+    SensorfwMagnetometer(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual void start();
+    virtual QString sensorName() const;
+    virtual qreal correctionFactor() const;
+
+
+private:
+    static const float NANO;
+    QMagnetometerReading m_reading;
+    static bool m_initDone;
+    bool m_isGeoMagnetometer;
+
+private slots:
+    void slotDataAvailable(const MagneticField& data);
+    void slotFrameAvailable(const QVector<MagneticField>&);
+
+};
+
+#endif
diff --git a/src/plugins/sensors/sensorfw/sensorfworientationsensor.cpp b/src/plugins/sensors/sensorfw/sensorfworientationsensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..09dfb0eb3bc5cd2dfa10b7c9dbf4811130ff0a45
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfworientationsensor.cpp
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfworientationsensor.h"
+
+#include <posedata.h>
+
+char const * const SensorfwOrientationSensor::id("sensorfw.orientationsensor");
+bool SensorfwOrientationSensor::m_initDone = false;
+
+SensorfwOrientationSensor::SensorfwOrientationSensor(QSensor *sensor)
+    : SensorfwSensorBase(sensor)
+{
+    initSensor<OrientationSensorChannelInterface>(m_initDone);
+    setReading<QOrientationReading>(&m_reading);
+}
+
+
+void SensorfwOrientationSensor::start()
+{
+    if (m_sensorInterface) {
+        Unsigned data(((OrientationSensorChannelInterface*)m_sensorInterface)->orientation());
+        m_reading.setOrientation(SensorfwOrientationSensor::getOrientation(data.x()));
+        m_reading.setTimestamp(data.UnsignedData().timestamp_);
+        newReadingAvailable();
+    }
+    SensorfwSensorBase::start();
+}
+
+
+void SensorfwOrientationSensor::slotDataAvailable(const Unsigned& data)
+{
+    m_reading.setOrientation(SensorfwOrientationSensor::getOrientation(data.x()));
+    m_reading.setTimestamp(data.UnsignedData().timestamp_);
+    newReadingAvailable();
+}
+
+bool SensorfwOrientationSensor::doConnect()
+{
+    return QObject::connect(m_sensorInterface, SIGNAL(orientationChanged(const Unsigned&)),
+                            this, SLOT(slotDataAvailable(const Unsigned&)));
+}
+
+QString SensorfwOrientationSensor::sensorName() const
+{
+    return "orientationsensor";
+}
+
+QOrientationReading::Orientation SensorfwOrientationSensor::getOrientation(int orientation)
+{
+    switch (orientation) {
+    case PoseData::BottomDown: return QOrientationReading::TopUp;
+    case PoseData::BottomUp:   return QOrientationReading::TopDown;
+    case PoseData::LeftUp:     return QOrientationReading::LeftUp;
+    case PoseData::RightUp:    return QOrientationReading::RightUp;
+    case PoseData::FaceUp:     return QOrientationReading::FaceUp;
+    case PoseData::FaceDown:   return QOrientationReading::FaceDown;
+    }
+    return QOrientationReading::Undefined;
+}
diff --git a/src/plugins/sensors/sensorfw/sensorfworientationsensor.h b/src/plugins/sensors/sensorfw/sensorfworientationsensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..496939ce5f37d0eeca1ec632e89e6bbe33abb220
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfworientationsensor.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SENSORFWORIENTATIONSENSOR_H
+#define SENSORFWORIENTATIONSENSOR_H
+
+#include "sensorfwsensorbase.h"
+#include <qorientationsensor.h>
+
+#include <orientationsensor_i.h>
+#include <unsigned.h>
+
+
+
+class SensorfwOrientationSensor : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+    SensorfwOrientationSensor(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual QString sensorName() const;
+    virtual void start();
+
+private:
+    QOrientationReading m_reading;
+    static QOrientationReading::Orientation getOrientation(int orientation);
+    static bool m_initDone;
+
+private slots:
+    void slotDataAvailable(const Unsigned& orientation);
+};
+
+#endif
diff --git a/src/plugins/sensors/sensorfw/sensorfwproximitysensor.cpp b/src/plugins/sensors/sensorfw/sensorfwproximitysensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4602a9a1aac1f604c7bc554f9dd078d4bcea9c89
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwproximitysensor.cpp
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfwproximitysensor.h"
+
+char const * const SensorfwProximitySensor::id("sensorfw.proximitysensor");
+bool SensorfwProximitySensor::m_initDone = false;
+
+SensorfwProximitySensor::SensorfwProximitySensor(QSensor *sensor)
+    : SensorfwSensorBase(sensor), m_exClose(false)
+{
+    initSensor<ProximitySensorChannelInterface>(m_initDone);
+    setReading<QProximityReading>(&m_reading);
+    addDataRate(10,10); //TODO: fix this when we know better
+}
+
+void SensorfwProximitySensor::start()
+{
+    if (m_sensorInterface) {
+        Unsigned data(((ProximitySensorChannelInterface*)m_sensorInterface)->proximity());
+        m_reading.setClose(data.x()? true: false);
+        m_reading.setTimestamp(data.UnsignedData().timestamp_);
+        newReadingAvailable();
+    }
+    SensorfwSensorBase::start();
+}
+
+
+void SensorfwProximitySensor::slotDataAvailable(const Unsigned& data)
+{
+    bool close = data.x()? true: false;
+    if (close == m_exClose) return;
+    m_reading.setClose(close);
+    m_reading.setTimestamp(data.UnsignedData().timestamp_);
+    newReadingAvailable();
+    m_exClose = close;
+}
+
+bool SensorfwProximitySensor::doConnect()
+{
+    return (QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(const Unsigned&)),
+                             this, SLOT(slotDataAvailable(const Unsigned&))));
+}
+
+
+QString SensorfwProximitySensor::sensorName() const
+{
+    return "proximitysensor";
+}
diff --git a/src/plugins/sensors/sensorfw/sensorfwproximitysensor.h b/src/plugins/sensors/sensorfw/sensorfwproximitysensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..91800c2ee45728acedaa9b4d4ee7d63031e4e6ed
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwproximitysensor.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SENSORFWPROXIMITYSENSOR_H
+#define SENSORFWPROXIMITYSENSOR_H
+
+#include "sensorfwsensorbase.h"
+#include <qproximitysensor.h>
+
+#include <proximitysensor_i.h>
+#include <unsigned.h>
+
+
+
+class SensorfwProximitySensor : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+    SensorfwProximitySensor(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual QString sensorName() const;
+    virtual void start();
+
+
+private:
+    QProximityReading m_reading;
+    static bool m_initDone;
+    bool m_exClose;
+
+private slots:
+    void slotDataAvailable(const Unsigned& data);
+};
+
+#endif
diff --git a/src/plugins/sensors/sensorfw/sensorfwrotationsensor.cpp b/src/plugins/sensors/sensorfw/sensorfwrotationsensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d577402207677f259d3b3d3d559263d2ccbf6927
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwrotationsensor.cpp
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfwrotationsensor.h"
+
+char const * const SensorfwRotationSensor::id("sensorfw.rotationsensor");
+bool SensorfwRotationSensor::m_initDone = false;
+
+SensorfwRotationSensor::SensorfwRotationSensor(QSensor *sensor)
+    : SensorfwSensorBase(sensor)
+{
+    initSensor<RotationSensorChannelInterface>(m_initDone);
+    setReading<QRotationReading>(&m_reading);
+    sensor()->setHasZ(true);
+}
+
+void SensorfwRotationSensor::slotDataAvailable(const XYZ& data)
+{
+    m_reading.setFromEuler(data.x(),data.y(),data.z());
+    m_reading.setTimestamp(data.XYZData().timestamp_);
+    newReadingAvailable();
+}
+
+void SensorfwRotationSensor::slotFrameAvailable(const QVector<XYZ>&  frame)
+{
+    for (int i=0, l=frame.size(); i<l; i++) {
+        slotDataAvailable(frame.at(i));
+    }
+}
+
+bool SensorfwRotationSensor::doConnect()
+{
+    if (m_bufferSize==1)
+       return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(const XYZ&)), this, SLOT(slotDataAvailable(const XYZ&)));
+    return QObject::connect(m_sensorInterface, SIGNAL(frameAvailable(const QVector<XYZ>& )),this, SLOT(slotFrameAvailable(const QVector<XYZ>& )));
+}
+
+QString SensorfwRotationSensor::sensorName() const
+{
+    return "rotationsensor";
+}
diff --git a/src/plugins/sensors/sensorfw/sensorfwrotationsensor.h b/src/plugins/sensors/sensorfw/sensorfwrotationsensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..5b5556df11c67595699f833706c0fcdd85956dbe
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwrotationsensor.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef SENSORFWROTATION_H
+#define SENSORFWROTATION_H
+
+#include "sensorfwsensorbase.h"
+#include <qrotationsensor.h>
+
+#include <rotationsensor_i.h>
+#include <xyz.h>
+
+
+
+class SensorfwRotationSensor : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+    SensorfwRotationSensor(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual QString sensorName() const;
+
+private:
+    QRotationReading m_reading;
+    static bool m_initDone;
+
+private slots:
+    void slotDataAvailable(const XYZ& data);
+    void slotFrameAvailable(const QVector<XYZ>&);
+
+};
+
+#endif
diff --git a/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp b/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..85968e22d2b07c4c4a2fc8794c8ce63b2121e26d
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp
@@ -0,0 +1,189 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfwsensorbase.h"
+
+
+SensorManagerInterface* SensorfwSensorBase::m_remoteSensorManager = 0;
+
+//According to wikipedia link http://en.wikipedia.org/wiki/Standard_gravity
+//const float sensorfwsensorbase::GRAVITY_EARTH = 9.812865328;
+const float SensorfwSensorBase::GRAVITY_EARTH_THOUSANDTH = 0.009812865328;
+const int SensorfwSensorBase::KErrNotFound=-1;
+const int SensorfwSensorBase::KErrInUse=-14;
+QStringList SensorfwSensorBase::m_bufferingSensors = QStringList()
+        <<"sensorfw.accelerometer"<<"sensorfw.magnetometer"
+       <<"sensorfw.gyroscope"<<"sensorfw.rotationsensor";
+
+SensorfwSensorBase::SensorfwSensorBase(QSensor *sensor)
+    : QSensorBackend(sensor), m_sensorInterface(0), m_bufferSize(-1), m_prevOutputRange(0), m_efficientBufferSize(1), m_maxBufferSize(1)
+{
+    if (!m_remoteSensorManager)
+        m_remoteSensorManager = &SensorManagerInterface::instance();
+}
+
+SensorfwSensorBase::~SensorfwSensorBase()
+{
+    if (m_sensorInterface) {
+        stop();
+        delete m_sensorInterface, m_sensorInterface = 0;
+    }
+}
+
+void SensorfwSensorBase::start()
+{
+    if (m_sensorInterface) {
+        // dataRate
+        QByteArray type = sensor()->type();
+        if (type != QTapSensor::type() && type != QProximitySensor::type()) {
+            int dataRate = sensor()->dataRate();
+            int interval = dataRate > 0 ? 1000 / dataRate : 0;
+            // for testing maximum speed
+            //interval = 1;
+            //dataRate = 1000;
+            m_sensorInterface->setInterval(interval);
+        }
+
+        // outputRange
+        int currentRange = sensor()->outputRange();
+        int l = sensor()->outputRanges().size();
+        if (l > 1) {
+            if (currentRange != m_prevOutputRange) {
+//#ifdef Q_WS_MAEMO_6
+                bool isOk = m_sensorInterface->setDataRangeIndex(currentRange); //NOTE THAT THE CHANGE MIGHT NOT SUCCEED, FIRST COME FIRST SERVED
+                if (!isOk) sensorError(KErrInUse);
+                else m_prevOutputRange = currentRange;
+//#else
+//                // TODO: remove when sensord integrated, in sensorfw env there is a delay
+//                qoutputrange range = sensor()->outputRanges().at(currentRange);
+//                qreal correction = 1/correctionFactor();
+//                DataRange range1(range.minimum*correction, range.maximum*correction, range.accuracy*correction);
+//                m_sensorInterface->requestDataRange(range1);
+//                m_prevOutputRange = currentRange;
+//#endif
+            }
+        }
+
+        // always on
+        bool alwaysOn = sensor()->isAlwaysOn();
+        m_sensorInterface->setStandbyOverride(alwaysOn);
+
+        // connects after buffering checks
+        doConnectAfterCheck();
+
+        int returnCode = m_sensorInterface->start().error().type();
+        if (returnCode == 0) return;
+        qWarning() << "m_sensorInterface did not start, error code:" << returnCode;
+    }
+    sensorStopped();
+}
+
+void SensorfwSensorBase::stop()
+{
+    if (m_sensorInterface) m_sensorInterface->stop();
+}
+
+void SensorfwSensorBase::setRanges(qreal correctionFactor)
+{
+    if (!m_sensorInterface) return;
+
+    QList<DataRange> ranges = m_sensorInterface->getAvailableDataRanges();
+
+    for (int i = 0, l = ranges.size(); i < l; i++) {
+        DataRange range = ranges.at(i);
+        qreal rangeMin = range.min * correctionFactor;
+        qreal rangeMax = range.max * correctionFactor;
+        qreal resolution = range.resolution * correctionFactor;
+        addOutputRange(rangeMin, rangeMax, resolution);
+    }
+}
+
+
+bool SensorfwSensorBase::doConnectAfterCheck()
+{
+    if (!m_sensorInterface) return false;
+
+    // buffer size
+    int size = bufferSize();
+    if (size == m_bufferSize) return true;
+
+    if (m_bufferingSensors.contains(sensor()->identifier()))
+        m_sensorInterface->setBufferSize(size);
+    else
+        size = 1;
+
+    // if multiple->single or single->multiple or if uninitialized
+    if ((m_bufferSize > 1 && size == 1) || (m_bufferSize == 1 && size > 1) || m_bufferSize == -1) {
+        m_bufferSize = size;
+        disconnect(this);
+        if (!doConnect()) {
+            qWarning() << "Unable to connect "<< sensorName();
+            return false;
+        }
+        return true;
+    }
+    m_bufferSize = size;
+    return true;
+}
+
+int SensorfwSensorBase::bufferSize() const
+{
+    int bufferSize = sensor()->bufferSize();
+    if (bufferSize == 1)
+        return 1;
+
+    // otherwise check validit
+    if (bufferSize < 1) {
+        qWarning() << "bufferSize cannot be " << bufferSize << ", must be a positive number >= 1";
+        return 1;
+    }
+    if (bufferSize > m_maxBufferSize) {
+        qWarning() << "bufferSize cannot be " << bufferSize << ", MAX value is " << m_maxBufferSize;
+        return m_maxBufferSize;
+    }
+    return bufferSize;
+}
+
+qreal SensorfwSensorBase::correctionFactor() const
+{
+    return 1;
+}
+
diff --git a/src/plugins/sensors/sensorfw/sensorfwsensorbase.h b/src/plugins/sensors/sensorfw/sensorfwsensorbase.h
new file mode 100644
index 0000000000000000000000000000000000000000..78a6c14fc90fb84d924b999aa943a2688dd5e7b8
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwsensorbase.h
@@ -0,0 +1,170 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef SENSORFWSENSORBASE_H
+#define SENSORFWSENSORBASE_H
+
+#include <qsensorbackend.h>
+#include <sensormanagerinterface.h>
+#include <abstractsensor_i.h>
+
+class SensorfwSensorBase : public QSensorBackend
+{
+public:
+    SensorfwSensorBase(QSensor *sensor);
+    virtual ~SensorfwSensorBase();
+
+
+protected:
+    virtual bool doConnect()=0;
+    virtual void start();
+    virtual void stop();
+
+    static const float GRAVITY_EARTH;
+    static const float GRAVITY_EARTH_THOUSANDTH;    //for speed
+    static const int KErrNotFound;
+    static const int KErrInUse;
+    static QStringList m_bufferingSensors;
+
+    void setRanges(qreal correctionFactor=1);
+    virtual QString sensorName() const=0;
+
+    template<typename T>
+    void initSensor(bool &initDone)
+    {
+
+        const QString name = sensorName();
+
+        if (!initDone) {
+            if (!m_remoteSensorManager->loadPlugin(name)) {
+                sensorError(KErrNotFound);
+                return;
+            }
+            m_remoteSensorManager->registerSensorInterface<T>(name);
+        }
+        m_sensorInterface = T::controlInterface(name);
+        if (!m_sensorInterface) {
+            m_sensorInterface = const_cast<T*>(T::listenInterface(name));
+        }
+        if (!m_sensorInterface) {
+            sensorError(KErrNotFound);
+            return;
+        }
+        if (!m_sensorInterface) {
+            sensorError(KErrNotFound);
+            return;
+        }
+
+        initDone = true;
+
+        //metadata
+        QList<DataRange> intervals = m_sensorInterface->getAvailableIntervals();
+
+        for (int i = 0, l = intervals.size(); i < l; i++) {
+            qreal intervalMax = ((DataRange)(intervals.at(i))).max;
+            qreal intervalMin =((DataRange)(intervals.at(i))).min;
+
+            if (intervalMin == 0 && intervalMax == 0) {
+                // 0 interval has different meanings in e.g. magge/acce
+                // magge -> best-effort
+                // acce -> lowest possible
+                // in Qt API setting 0 means default
+                continue;
+            }
+
+            qreal rateMin = intervalMax < 1 ? 1 : 1 / intervalMax * 1000;
+            rateMin = rateMin < 1 ? 1 : rateMin;
+
+            intervalMin = intervalMin < 1 ? 10: intervalMin;     // do not divide with 0
+            qreal rateMax = 1 / intervalMin * 1000;
+            addDataRate(rateMin, rateMax);
+        }
+
+        //bufferSizes
+        if (m_bufferingSensors.contains(sensor()->identifier())) {
+
+            IntegerRangeList sizes = m_sensorInterface->getAvailableBufferSizes();
+            int l = sizes.size();
+            for (int i = 0; i < l; i++) {
+                int second = sizes.at(i).second;
+                m_maxBufferSize = second > m_bufferSize ? second : m_maxBufferSize;
+            }
+            m_maxBufferSize = m_maxBufferSize < 0 ? 1 : m_maxBufferSize;
+            //SensorFW guarantees to provide the most efficient size first
+            //TODO: remove from comments
+            //m_efficientBufferSize  = m_sensorInterface->hwBuffering()? (l>0?sizes.at(0).first:1) : 1;
+        }
+        else
+            m_maxBufferSize = 1;
+
+        sensor()->setMaxBufferSize(m_maxBufferSize);
+        sensor()->efficientBufferSize(m_efficientBufferSize);
+
+        QByteArray type = sensor()->type();
+        if (type == QAmbientLightSensor::type()) return;   // SensorFW returns lux values, plugin enumerated values
+        if (type == QIRProximitySensor::type()) return;    // SensorFW returns raw reflectance values, plugin % of max reflectance
+        if (name == "accelerometersensor") return;      // SensorFW returns milliGs, plugin m/s^2
+        if (name == "magnetometersensor") return;       // SensorFW returns nanoTeslas, plugin Teslas
+        if (name == "gyroscopesensor") return;          // SensorFW returns DSPs, plugin milliDSPs
+
+        setDescription(m_sensorInterface->description());
+
+        if (name == "tapsensor") return;
+        setRanges();
+    };
+
+
+    AbstractSensorChannelInterface* m_sensorInterface;
+    int m_bufferSize;
+    int bufferSize() const;
+    virtual qreal correctionFactor() const;
+
+private:
+
+    static SensorManagerInterface* m_remoteSensorManager;
+    int m_prevOutputRange;
+    bool doConnectAfterCheck();
+    int m_efficientBufferSize, m_maxBufferSize;
+
+};
+
+#endif
diff --git a/src/plugins/sensors/sensorfw/sensorfwtapsensor.cpp b/src/plugins/sensors/sensorfw/sensorfwtapsensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c945ac11a91956f7bc562900eca03719a60e7d68
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwtapsensor.cpp
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sensorfwtapsensor.h"
+
+char const * const SensorfwTapSensor::id("sensorfw.tapsensor");
+bool SensorfwTapSensor::m_initDone = false;
+
+SensorfwTapSensor::SensorfwTapSensor(QSensor *sensor)
+    : SensorfwSensorBase(sensor), m_isOnceStarted(false)
+{
+    initSensor<TapSensorChannelInterface>(m_initDone);
+    setReading<QTapReading>(&m_reading);
+    addOutputRange(QTapReading::Undefined, QTapReading::Z_Both, 1);
+    addDataRate(10,10); //TODO: fix this when we know better
+}
+
+
+void SensorfwTapSensor::start()
+{
+    bool b = sensor()->returnDoubleTapEvents();
+    bool isDoubleTapSensor = m_isDoubleTapSensor;
+    if (!b) {
+        sensor()->setReturnDoubleTapEvents(true); //by default doubles
+        m_isDoubleTapSensor = true;
+    }
+    else m_isDoubleTapSensor = b;
+
+    if (!m_isOnceStarted || (m_isOnceStarted && isDoubleTapSensor != m_isDoubleTapSensor))
+        ((TapSensorChannelInterface*)m_sensorInterface)->
+                setTapType(m_isDoubleTapSensor?TapSensorChannelInterface::Double:TapSensorChannelInterface::Single);
+
+    SensorfwSensorBase::start();
+    // Set tap type (single/double)
+    m_reading.setDoubleTap(m_isDoubleTapSensor);
+    m_isOnceStarted = true;
+}
+
+
+void SensorfwTapSensor::slotDataAvailable(const Tap& data)
+{
+    // Set tap direction
+    QTapReading::TapDirection o;
+    switch (data.direction()) {
+    case TapData::X:         o = QTapReading::X_Both;    break;
+    case TapData::Y:         o = QTapReading::Y_Both;    break;
+    case TapData::Z:         o = QTapReading::Z_Both;    break;
+    case TapData::LeftRight: o = QTapReading::X_Pos;     break;
+    case TapData::RightLeft: o = QTapReading::X_Neg;     break;
+    case TapData::TopBottom: o = QTapReading::Z_Neg;     break;
+    case TapData::BottomTop: o = QTapReading::Z_Pos;     break;
+    case TapData::FaceBack:  o = QTapReading::Y_Pos;     break;
+    case TapData::BackFace:  o = QTapReading::Y_Neg;     break;
+    default:                 o = QTapReading::Undefined;
+    }
+    m_reading.setTapDirection(o);
+    m_reading.setTimestamp(data.tapData().timestamp_);
+    newReadingAvailable();
+}
+
+
+bool SensorfwTapSensor::doConnect()
+{
+    return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(const Tap&)),
+                            this, SLOT(slotDataAvailable(const Tap&)));
+}
+
+
+QString SensorfwTapSensor::sensorName() const
+{
+    return "tapsensor";
+}
diff --git a/src/plugins/sensors/sensorfw/sensorfwtapsensor.h b/src/plugins/sensors/sensorfw/sensorfwtapsensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..6df3bcfb51b12accd7a25e53271e85757c1c74f9
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwtapsensor.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef SENSORFWTAPSENSOR_H
+#define SENSORFWTAPSENSOR_H
+
+#include "sensorfwsensorbase.h"
+#include <qtapsensor.h>
+
+#include <tapsensor_i.h>
+#include <tap.h>
+
+
+
+class SensorfwTapSensor : public SensorfwSensorBase
+{
+    Q_OBJECT
+
+public:
+    static char const * const id;
+    SensorfwTapSensor(QSensor *sensor);
+protected:
+    virtual bool doConnect();
+    virtual void start();
+    virtual QString sensorName() const;
+
+private:
+    QTapReading m_reading;
+    static bool m_initDone;
+    bool m_isDoubleTapSensor;
+    bool m_isOnceStarted;
+private slots:
+    void slotDataAvailable(const Tap&);
+};
+
+#endif
diff --git a/src/plugins/sensors/sensors.pro b/src/plugins/sensors/sensors.pro
index df63f36d5901e18f99f3b0728513586d04a8db8f..73f4267266f684d64835947abe76d5926f8a5a54 100644
--- a/src/plugins/sensors/sensors.pro
+++ b/src/plugins/sensors/sensors.pro
@@ -1,12 +1,24 @@
 TEMPLATE = subdirs
 
-# Don't build dummy and generic plugins by default, the Blackberry backend has real implementations
+# Don't build dummy plugins, the Blackberry backend has real implementations
 # of these. This reduces compile time and plugin loading time.
 blackberry {
-    isEmpty(SENSORS_PLUGINS): SENSORS_PLUGINS = blackberry
+    isEmpty(SENSORS_PLUGINS): SENSORS_PLUGINS = blackberry generic
 }
+
+android {
+    isEmpty(SENSORS_PLUGINS): SENSORS_PLUGINS = android generic
+}
+
+sensorfw {
+    isEmpty(SENSORS_PLUGINS): SENSORS_PLUGINS = sensorfw generic
+}
+
 isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, dummy):SUBDIRS += dummy
 isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, generic):SUBDIRS += generic
 isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, simulator):simulator:SUBDIRS += simulator
 isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, blackberry):blackberry:SUBDIRS += blackberry
 isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, linux):linux:SUBDIRS += linux
+isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, android):android:SUBDIRS += android
+isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, sensorfw):sensorfw:SUBDIRS += sensorfw
+isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, ios):ios:SUBDIRS += ios
diff --git a/src/sensors/doc/qtsensors.qdocconf b/src/sensors/doc/qtsensors.qdocconf
index 7c53c02beba64aa2c314278735cf97f07ccf5a57..2ede8cf4f6aa9a48d145d639d1d489f4c4d540da 100644
--- a/src/sensors/doc/qtsensors.qdocconf
+++ b/src/sensors/doc/qtsensors.qdocconf
@@ -3,33 +3,36 @@ include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf)
 
 project                 = QtSensors
 description             = Qt Sensors Reference Documentation
-url                     = http://qt-project.org/doc/qt-5.0/qtsensors-index.html
-version                 = 5.0.0
+url                     = http://qt-project.org/doc/qt-$QT_VER/qtsensors
+version                 = $QT_VERSION
 
 qhp.projects            = QtSensors
 
 qhp.QtSensors.file                = qtsensors.qhp
-qhp.QtSensors.namespace           = org.qt-project.qtsensors.500
-qhp.QtSensors.virtualFolder       = qdoc
-qhp.QtSensors.indexTitle          = Qt Sensors Reference Documentation
+qhp.QtSensors.namespace           = org.qt-project.qtsensors.$QT_VERSION_TAG
+qhp.QtSensors.virtualFolder       = qtsensors
+qhp.QtSensors.indexTitle          = Qt Sensors
 qhp.QtSensors.indexRoot           =
 
-qhp.QtSensors.filterAttributes    = qtsensors 5.0.0 qtrefdoc
-qhp.QtSensors.customFilters.Qt.name = QtSensors 5.0.0
-qhp.QtSensors.customFilters.Qt.filterAttributes = qtsensors 5.0.0
-qhp.QtSensors.subprojects         = classes overviews examples
-qhp.QtSensors.subprojects.classes.title = Classes
-qhp.QtSensors.subprojects.classes.indexTitle = Qt Sensors's Classes
+qhp.QtSensors.filterAttributes    = qtsensors $QT_VERSION qtrefdoc
+qhp.QtSensors.customFilters.Qt.name = QtSensors $QT_VERSION
+qhp.QtSensors.customFilters.Qt.filterAttributes = qtsensors $QT_VERSION
+qhp.QtSensors.subprojects         = overviews classes qmltypes examples
+qhp.QtSensors.subprojects.overviews.title = Overview
+qhp.QtSensors.subprojects.overviews.indexTitle = Qt Sensors
+qhp.QtSensors.subprojects.overviews.selectors = fake:page,group,module
+qhp.QtSensors.subprojects.classes.title = C++ Classes
+qhp.QtSensors.subprojects.classes.indexTitle = Qt Sensors C++ Classes
 qhp.QtSensors.subprojects.classes.selectors = class fake:headerfile
 qhp.QtSensors.subprojects.classes.sortPages = true
-qhp.QtSensors.subprojects.overviews.title = Overviews
-qhp.QtSensors.subprojects.overviews.indexTitle = All Overviews and HOWTOs
-qhp.QtSensors.subprojects.overviews.selectors = fake:page,group,module
-qhp.QtSensors.subprojects.examples.title = Qt Sensors Examples
+qhp.QtSensors.subprojects.qmltypes.title = QML Types
+qhp.QtSensors.subprojects.qmltypes.indexTitle = Qt Sensors QML Types
+qhp.QtSensors.subprojects.qmltypes.selectors = fake:qmlclass
+qhp.QtSensors.subprojects.qmltypes.sortPages = true
+qhp.QtSensors.subprojects.examples.title = Examples
 qhp.QtSensors.subprojects.examples.indexTitle = Qt Sensors Examples
 qhp.QtSensors.subprojects.examples.selectors = fake:example
 
-outputdir               = ../../../doc/qtsensors
 tagfile                 = ../../../doc/qtsensors/qtsensors.tags
 
 headerdirs  += .. \
@@ -45,3 +48,5 @@ exampledirs += ../../../examples/sensors \
 
 
 imagedirs   += images
+
+depends += qtcore qtdoc qtgui
diff --git a/src/sensors/doc/src/compatmap.qdoc b/src/sensors/doc/src/compatmap.qdoc
index 0fd4951c7b07a59cd4565f4954cad897d27ddecb..62f94de0ced0c747d0bab6f900469c46ebbb12b8 100644
--- a/src/sensors/doc/src/compatmap.qdoc
+++ b/src/sensors/doc/src/compatmap.qdoc
@@ -54,30 +54,72 @@
     <tr>
     <td><b>Feature</b></td>
     <td><b>Blackberry</b></td>
+    <td><b>Android</b></td>
     <td><b>Linux</b></td>
+    <td><b>iOS</b></td>
     <td><b>Generic</b></td>
+    <td><b>Sensorfw</b></td>
     </tr>
     <tr>
     <td nowrap="nowrap">Accelerometer</td>
     <td bgcolor="green"></td>
     <td bgcolor="green"></td>
+    <td bgcolor="green"></td>
+    <td bgcolor="green"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="green"></td>
+    </tr>
+    <tr>
+    <td nowrap="nowrap">Altimeter</td>
+    <td bgcolor="green"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
     </tr>
     <tr>
     <td nowrap="nowrap">Ambient Light Sensor</td>
     <td bgcolor="green"></td>
     <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
     <td bgcolor="green"></td>
     </tr>
     <tr>
+    <td nowrap="nowrap">Ambient Temperature Sensor</td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    </tr>
+    <tr>
     <td nowrap="nowrap">Compass</td>
     <td bgcolor="green"></td>
     <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="green"></td>
     </tr>
     <tr>
     <td nowrap="nowrap">Gyroscope</td>
     <td bgcolor="green"></td>
+    <td bgcolor="green"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="green"></td>
+    </tr>
+    <tr>
+    <td nowrap="nowrap">Holster Sensor</td>
+    <td bgcolor="green"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
     </tr>
@@ -86,48 +128,90 @@
     <td bgcolor="green"></td>
     <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="green"></td>
     </tr>
     <tr>
     <td nowrap="nowrap">Light Sensor</td>
     <td bgcolor="green"></td>
+    <td bgcolor="green"></td>
+    <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
+    <td bgcolor="green"></td>
     </tr>
     <tr>
     <td nowrap="nowrap">Magnetometer</td>
     <td bgcolor="green"></td>
+    <td bgcolor="green"></td>
+    <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
+    <td bgcolor="green"></td>
     </tr>
     <tr>
     <td nowrap="nowrap">Orientation Sensor</td>
     <td bgcolor="green"></td>
     <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="green"></td>
+    <td bgcolor="green"></td>
+    </tr>
+    <tr>
+    <td nowrap="nowrap">Pressure Sensor</td>
     <td bgcolor="green"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
     </tr>
     <tr>
     <td nowrap="nowrap">Proximity Sensor</td>
     <td bgcolor="green"></td>
     <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="green"></td>
     </tr>
     <tr>
     <td nowrap="nowrap">Rotation Sensor</td>
     <td bgcolor="green"></td>
+    <td bgcolor="green"></td>
+    <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
     <td bgcolor="green"></td>
+    <td bgcolor="green"></td>
     </tr>
     <tr>
     <td nowrap="nowrap">Tap Sensor</td>
     <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    </tr>
+    <tr>
+    <td nowrap="nowrap">Tilt Sensor</td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="green"></td>
+    <td bgcolor="gray"></td>
     </tr>
     <tr>
     <td nowrap="nowrap">Sensor Gestures</td>
     <td bgcolor="gray"></td>
     <td bgcolor="gray"></td>
-    <td bgcolor="green">1)</td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="gray"></td>
+    <td bgcolor="green"></td>
     </tr>
     </table>
 
@@ -138,5 +222,8 @@
     In addition to the table above, each sensor type might support specific features. For example
     a magnetometer might support returning geo values. See QSensor::isFeatureSupported() for
     additional details.
+
+    Sensor Gestures are mostly platform independent, and will run if the platform has the needed sensors.
+    Whether they are supported and work well or not depends on the platform.
 */
 
diff --git a/src/sensors/doc/src/genericbackend.qdoc b/src/sensors/doc/src/genericbackend.qdoc
index 689b412448f90ea350e1165009c0fc8449b0a489..a273352bb24824a4754fc8f3aef6bd634b6a31b9 100644
--- a/src/sensors/doc/src/genericbackend.qdoc
+++ b/src/sensors/doc/src/genericbackend.qdoc
@@ -49,6 +49,9 @@
     \row
         \li Rotation Sensor
         \li Accelerometer
+    \row
+        \li Tilt Sensor
+        \li Accelerometer
     \endtable
     If a platform doesn't support the source sensor, then the sensor can not be emulated.
 */
diff --git a/src/sensors/doc/src/porting.qdoc b/src/sensors/doc/src/porting.qdoc
index fa2b3fb24b876074bef0b5361d5bdb92d6cf4ff9..0d5b57237559deb98be52803c3df7c7cd2981bf2 100644
--- a/src/sensors/doc/src/porting.qdoc
+++ b/src/sensors/doc/src/porting.qdoc
@@ -39,21 +39,26 @@
 
     \section1 QML
 
-    Compatibility for QML applications is provided by shipping the legacy \c QtMobility.sensors
-    QML import. QML applications should not require any changes to continue operating.
+    In QtMobility, the C++ classes like QAccelerometer were directly used as QML types.
+    In Qt Sensors, there are now separate classes for the QML types, which have no public
+    C++ API.
 
-    Applications using the legacy QML import may not be able to trivially port over
-    to the new QML import because the new QML import does not provide types for
-    every sensor like the legacy QML import does.
+    The new QML types in Qt Sensors fix some issues the former QtMobility QML types had,
+    for example:
+    \list
+    \li The reading types now have proper change notifications
+    \li \c availableDataRates and \c outputRanges of the \c Sensor type are now proper list types
+    \li The \c identifier and \c type properties of \c Sensor can now be used
+    \li The \c lux property of \c LightSensorReading has been renamed to \c illuminance
+    \li The \c QmlSensors singleton now allows to query for sensor types
+    \endlist
 
-    \table
-        \row
-            \li \l {Qt Sensors QML Types}{QML API}
-            \li Information about the Qt Sensors QML API
-    \endtable
+    For more information, see the \l {Qt Sensors QML Types}{QML API} documentation.
 
     \section1 C++
 
+    The C++ API mainly remained the same as in QtMobility.
+
     \section2 Includes
 
     QtMobility Sensors installed headers into a \c Qt Sensors directory. This is
diff --git a/src/sensors/doc/src/qtsensors.qdoc b/src/sensors/doc/src/qtsensors.qdoc
index 6128673388ad4eb3ea5eb833489d5040dd07dddc..9213371d22f7f294337280352d0635c84a78480e 100644
--- a/src/sensors/doc/src/qtsensors.qdoc
+++ b/src/sensors/doc/src/qtsensors.qdoc
@@ -112,6 +112,9 @@
         \row
             \li \l {Generic Backend}{Generic Backend}
             \li Information about the generic sensor backend.
+        \row
+            \li \l {Sensorfw Backend}{Sensorfw Backend}
+            \li Information about the Sensorfw sensor backend.
     \endtable
 */
 
diff --git a/src/sensors/doc/src/sensorfwbackend.qdoc b/src/sensors/doc/src/sensorfwbackend.qdoc
new file mode 100644
index 0000000000000000000000000000000000000000..fcfbb5d83072e84be1d664cb5e0318f2fb4a721a
--- /dev/null
+++ b/src/sensors/doc/src/sensorfwbackend.qdoc
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Jolla Mobile
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file.  Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: http://www.gnu.org/copyleft/fdl.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+    \page senorfwbackend.html
+    \title Sensorfw Backend
+    \brief Information about the Sensorfw sensor backend
+
+    The Sensorfw sensor backend requires the Sensorfw and sensor daemon. Sensorfw was originally used in MeeGo, and is available
+    from http://meego.gitorious.org/meego-middleware/sensorfw
+
+    To compile the sensorfw backend, you need sensorfw installed and run qmake with CONFIG+=sensorfw
+
+*/
+
diff --git a/src/sensors/gestures/qsensorgesture.h b/src/sensors/gestures/qsensorgesture.h
index 2d7e901855fb0e10f51ad3d132b77632554cc8ca..5ae7bb229e64aa20604c8d8a6781e6109da6c11b 100644
--- a/src/sensors/gestures/qsensorgesture.h
+++ b/src/sensors/gestures/qsensorgesture.h
@@ -52,11 +52,8 @@
 
 #include <QtCore/qmetatype.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QSensorGesturePrivate;
 
 class Q_SENSORS_EXPORT QSensorGesture : public QObject
@@ -93,7 +90,6 @@ Q_SIGNALS:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 
 #endif // QSENSORGESTURE_H
diff --git a/src/sensors/gestures/qsensorgesture_p.h b/src/sensors/gestures/qsensorgesture_p.h
index 5bad75b5bd8bb2e884731172ee83b716aee98da9..4ee19b9c90588b9eae4d33680c207273023bf9cc 100644
--- a/src/sensors/gestures/qsensorgesture_p.h
+++ b/src/sensors/gestures/qsensorgesture_p.h
@@ -61,7 +61,6 @@
 #include "qsensorgesturemanager.h"
 #include <QtCore/private/qmetaobjectbuilder_p.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QSensorGesturePrivate : public QObject
@@ -84,6 +83,5 @@ public:
 
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif // QSENSORGESTURE_P_H
diff --git a/src/sensors/gestures/qsensorgesturemanager.h b/src/sensors/gestures/qsensorgesturemanager.h
index da5048a078bc738ecb9bc36b8c70f179d8509197..96ea9718f41d32efc17670da3fc709bcd8c0ff13 100644
--- a/src/sensors/gestures/qsensorgesturemanager.h
+++ b/src/sensors/gestures/qsensorgesturemanager.h
@@ -48,11 +48,8 @@
 #include <QtSensors/qsensorgesture.h>
 #include <QtSensors/qsensorgesturerecognizer.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QSensorGestureManagerPrivate;
 class Q_SENSORS_EXPORT QSensorGestureManager : public QObject
 {
@@ -78,6 +75,5 @@ Q_SIGNALS:
 
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif // QSENSORGESTUREMANAGER_P_H
diff --git a/src/sensors/gestures/qsensorgesturemanagerprivate_p.h b/src/sensors/gestures/qsensorgesturemanagerprivate_p.h
index 50770c77171172f55c8eec9361a4abd98b3f2900..0994b2ab41001a78e40e2f54ee09c665cb001b13 100644
--- a/src/sensors/gestures/qsensorgesturemanagerprivate_p.h
+++ b/src/sensors/gestures/qsensorgesturemanagerprivate_p.h
@@ -52,7 +52,6 @@
 #include "qsensorgesture.h"
 #include "qsensorgesturerecognizer.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QFactoryLoader;
@@ -99,6 +98,5 @@ private slots:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif // QSENSORGESTUREMANAGERPRIVATE_P_H
diff --git a/src/sensors/gestures/qsensorgestureplugininterface.cpp b/src/sensors/gestures/qsensorgestureplugininterface.cpp
index add34c0e25cad73c47dc2f5ba687b87557f30ce4..de02f890400bac92784c9e6b5d12c4637b81c186 100644
--- a/src/sensors/gestures/qsensorgestureplugininterface.cpp
+++ b/src/sensors/gestures/qsensorgestureplugininterface.cpp
@@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE
     \brief The QSensorGesturePluginInterface class is the pure virtual interface to sensor gesture
     plugins.
 
-    \since QtSensors 5.0
+    \since 5.0
 
     The QSensorGesturePluginInterface class is implemented in sensor gesture plugins to register
     sensor gesture recognizers with QSensorGestureManager.
diff --git a/src/sensors/gestures/qsensorgestureplugininterface.h b/src/sensors/gestures/qsensorgestureplugininterface.h
index da933c927c7d64aaa5daa62e398d52ea7a9928ea..330d880cbe0e467271cb06abab288ab819b7cb7a 100644
--- a/src/sensors/gestures/qsensorgestureplugininterface.h
+++ b/src/sensors/gestures/qsensorgestureplugininterface.h
@@ -48,11 +48,8 @@
 #include <QtSensors/qsensorgesture.h>
 #include <QtSensors/qsensorgesturerecognizer.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QSensorGestureRecognizer;
 
 class Q_SENSORS_EXPORT QSensorGesturePluginInterface
@@ -68,6 +65,5 @@ public:
 Q_DECLARE_INTERFACE(QSensorGesturePluginInterface, "org.qt-project.QSensorGesturePluginInterface")
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif // QSENSORGESTUREPLUGININTERFACE_H
diff --git a/src/sensors/gestures/qsensorgesturerecognizer.h b/src/sensors/gestures/qsensorgesturerecognizer.h
index bebc5ce64f3bacf3e2c4f6990b789c34d330f6df..c35c25be67c01cc474989314b07c26cac3733364 100644
--- a/src/sensors/gestures/qsensorgesturerecognizer.h
+++ b/src/sensors/gestures/qsensorgesturerecognizer.h
@@ -48,11 +48,8 @@
 
 #include <QtSensors/qsensorgesture.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QSensorGestureRecognizerPrivate;
 class Q_SENSORS_EXPORT QSensorGestureRecognizer : public QObject
 {
@@ -84,6 +81,5 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif // QSENSORGESTURERECOGNIZER_H
diff --git a/src/sensors/make_sensor.pl b/src/sensors/make_sensor.pl
index 4d78a3122a2ab7b942daf34a5e102ffc8d5631d0..27322517315459dee4b5cab45f0a9e15bd5372af 100755
--- a/src/sensors/make_sensor.pl
+++ b/src/sensors/make_sensor.pl
@@ -52,6 +52,15 @@ $sensorbase =~ s/Sensor$//;
 my $reading = $sensorbase.'Reading';
 my $reading_private = $reading.'Private';
 my $filter = $sensorbase.'Filter';
+my $no_q_sensor = $sensor;
+$no_q_sensor =~ s/^.//;
+my $qmlsensor = "Qml".$no_q_sensor;
+my $qmlsensorbase = $qmlsensor;
+$qmlsensorbase =~ s/Sensor$//;
+my $qmlreading = $qmlsensorbase."Reading";
+my $no_q_reading = $no_q_sensor;
+$no_q_reading =~ s/Sensor$//;
+$no_q_reading = $no_q_reading."Reading";
 
 my $filebase;
 eval {
@@ -61,9 +70,15 @@ if ($@) {
     $filebase = lc($sensor);
 }
 
+my $qmlfilebase = $filebase;
+$qmlfilebase =~ s/^.//;
+$qmlfilebase = "qml".$qmlfilebase;
+
 my $pheader = $filebase."_p.h";
 my $header = $filebase.".h";
 my $source = $filebase.".cpp";
+my $qmlsource = "../imports/sensors/".$qmlfilebase.".cpp";
+my $qmlheader = "../imports/sensors/".$qmlfilebase.".h";
 
 my $pguard = uc($pheader);
 $pguard =~ s/\./_/g;
@@ -71,6 +86,163 @@ $pguard =~ s/\./_/g;
 my $guard = uc($header);
 $guard =~ s/\./_/g;
 
+my $qmlguard = "QML".uc($no_q_sensor)."_H";
+
+if (! -e $qmlheader) {
+    print "Creating $qmlheader\n";
+    open OUT, ">$qmlheader" or die $!;
+    print OUT '
+#ifndef '.$qmlguard.'
+#define '.$qmlguard.'
+
+#include "qmlsensor.h"
+
+QT_BEGIN_NAMESPACE
+
+class '.$sensor.';
+
+class '.$qmlsensor.' : public QmlSensor
+{
+    Q_OBJECT
+public:
+    explicit '.$qmlsensor.'(QObject *parent = 0);
+    ~'.$qmlsensor.'();
+
+private:
+    QSensor *sensor() const Q_DECL_OVERRIDE;
+    QmlSensorReading *createReading() const Q_DECL_OVERRIDE;
+
+    '.$sensor.' *m_sensor;
+};
+
+class '.$qmlreading.' : public QmlSensorReading
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal prop1 READ prop1 NOTIFY prop1Changed)
+public:
+    explicit '.$qmlreading.'('.$sensor.' *sensor);
+    ~'.$qmlreading.'();
+
+    qreal prop1() const;
+
+Q_SIGNALS:
+    void prop1Changed();
+
+private:
+    QSensorReading *reading() const Q_DECL_OVERRIDE;
+    void readingUpdate() Q_DECL_OVERRIDE;
+
+    '.$sensor.' *m_sensor;
+    qreal m_prop1;
+};
+
+QT_END_NAMESPACE
+#endif
+';
+    close OUT;
+}
+
+if (! -e $qmlsource) {
+    print "Creating $qmlsource\n";
+    open OUT, ">$qmlsource" or die $!;
+    print OUT '
+#include "qml'.lc($no_q_sensor).'.h"
+#include <'.$sensor.'>
+
+/*!
+    \qmltype '.$no_q_sensor.'
+    \instantiates '.$qmlsensor.'
+    \ingroup qml-sensors_type
+    \inqmlmodule QtSensors 5.0
+    \since QtSensors 5.[INSERT VERSION HERE]
+    \inherits Sensor
+    \brief The '.$no_q_sensor.' element reports on fubbleness.
+
+    The '.$no_q_sensor.' element reports on fubbleness.
+
+    This element wraps the '.$sensor.' class. Please see the documentation for
+    '.$sensor.' for details.
+
+    \sa '.$no_q_reading.'
+*/
+
+'.$qmlsensor.'::'.$qmlsensor.'(QObject *parent)
+    : QmlSensor(parent)
+    , m_sensor(new '.$sensor.'(this))
+{
+}
+
+'.$qmlsensor.'::~'.$qmlsensor.'()
+{
+}
+
+QmlSensorReading *'.$qmlsensor.'::createReading() const
+{
+    return new '.$qmlreading.'(m_sensor);
+}
+
+QSensor *'.$qmlsensor.'::sensor() const
+{
+    return m_sensor;
+}
+
+/*!
+    \qmltype '.$no_q_reading.'
+    \instantiates '.$qmlreading.'
+    \ingroup qml-sensors_reading
+    \inqmlmodule QtSensors 5.0
+    \since QtSensors 5.[INSERT VERSION HERE]
+    \inherits SensorReading
+    \brief The '.$no_q_reading.' element holds the most recent '.$no_q_sensor.' reading.
+
+    The '.$no_q_reading.' element holds the most recent '.$no_q_sensor.' reading.
+
+    This element wraps the '.$reading.' class. Please see the documentation for
+    '.$reading.' for details.
+
+    This element cannot be directly created.
+*/
+
+'.$qmlreading.'::'.$qmlreading.'('.$sensor.' *sensor)
+    : QmlSensorReading(sensor)
+    , m_sensor(sensor)
+    , m_prop1(0)
+{
+}
+
+'.$qmlreading.'::~'.$qmlreading.'()
+{
+}
+
+/*!
+    \qmlproperty qreal '.$no_q_reading.'::prop1
+    This property holds the fubble of the device.
+
+    Please see '.$reading.'::prop1 for information about this property.
+*/
+
+qreal '.$qmlreading.'::prop1() const
+{
+    return m_prop1;
+}
+
+QSensorReading *'.$qmlreading.'::reading() const
+{
+    return m_sensor->reading();
+}
+
+void '.$qmlreading.'::readingUpdate()
+{
+    qreal prop1 = m_sensor->reading()->prop1();
+    if (m_prop1 != prop1) {
+        m_prop1 = prop1;
+        Q_EMIT prop1Changed();
+    }
+}
+';
+    close OUT;
+}
+
 if (! -e $pheader) {
     print "Creating $pheader\n";
     open OUT, ">$pheader" or die $!;
@@ -89,7 +261,6 @@ if (! -e $pheader) {
 // We mean it.
 //
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class '.$reading_private.'
@@ -110,7 +281,6 @@ public:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 ';
@@ -126,11 +296,8 @@ if (! -e $header) {
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class '.$reading_private.';
 
 class Q_SENSORS_EXPORT '.$reading.' : public QSensorReading
@@ -166,7 +333,6 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 ';
@@ -188,7 +354,7 @@ IMPLEMENT_READING('.$reading.')
     \class '.$reading.'
     \ingroup sensors_reading
     \inmodule QtSensors
-    \since QtSensors 5.[INSERT VERSION HERE]
+    \since 5.[INSERT VERSION HERE]
 
     \brief The '.$reading.' class holds readings from the [X] sensor.
 
@@ -226,7 +392,7 @@ void '.$reading.'::setMyprop(qreal myprop)
     \class '.$filter.'
     \ingroup sensors_filter
     \inmodule QtSensors
-    \since QtSensors 5.[INSERT VERSION HERE]
+    \since 5.[INSERT VERSION HERE]
 
     \brief The '.$filter.' class is a convenience wrapper around QSensorFilter.
 
@@ -248,7 +414,7 @@ char const * const '.$sensor.'::type("'.$sensor.'");
     \class '.$sensor.'
     \ingroup sensors_type
     \inmodule QtSensors
-    \since QtSensors 5.[INSERT VERSION HERE]
+    \since 5.[INSERT VERSION HERE]
 
     \brief The '.$sensor.' class is a convenience wrapper around QSensor.
 
diff --git a/src/sensors/qaccelerometer.cpp b/src/sensors/qaccelerometer.cpp
index 4aeedf42c9f4db8ab7ec4944043aa98debe7beb3..9b9bd346cf5207545fb4170b60eff04789cf6568 100644
--- a/src/sensors/qaccelerometer.cpp
+++ b/src/sensors/qaccelerometer.cpp
@@ -152,6 +152,29 @@ void QAccelerometerReading::setZ(qreal z)
 
 char const * const QAccelerometer::type("QAccelerometer");
 
+/*!
+    \enum QAccelerometer::AccelerationMode
+
+    \brief This enum represents the acceleration mode of an acceleration sensor.
+
+    The acceleration mode controls how the sensor reports acceleration. QAccelerometer::Combined
+    is the only mode in which the values can be directly physically measured, the others are an
+    approximation.
+
+    \value Combined Both the acceleration caused by gravity and the acceleration caused by the
+                    user moving the device is reported combined.
+    \value Gravity  Only the acceleration caused by gravity is reported. Movements of the device
+                    caused by the user have no effect other than changing the direction when the
+                    device is rotated.
+    \value User     Only the acceleration caused by the user moving the device is reported, the
+                    effect of gravity is canceled out. A device at rest therefore should report
+                    values of, or close to, zero.
+                    In other APIs, this mode might be known as \e {linear acceleration}.
+
+    \sa QAccelerometer::accelerationMode
+    \since 5.1
+*/
+
 /*!
     \class QAccelerometer
     \ingroup sensors_type
@@ -161,7 +184,11 @@ char const * const QAccelerometer::type("QAccelerometer");
 
     The only behavioural difference is that this class sets the type properly.
 
-    This class also features a reading() function that returns a QAccelerometerReading instead of a QSensorReading.
+    It also supports changing the acceleration mode, which controls whether the force of gravity
+    is included in the accelerometer values or not.
+
+    Furthermore, this class features a reading() function that returns a QAccelerometerReading
+    instead of a QSensorReading.
 
     For details about how the sensor works, see \l QAccelerometerReading.
 
@@ -172,7 +199,7 @@ char const * const QAccelerometer::type("QAccelerometer");
     Construct the sensor as a child of \a parent.
 */
 QAccelerometer::QAccelerometer(QObject *parent)
-    : QSensor(QAccelerometer::type, parent)
+    : QSensor(QAccelerometer::type, *new QAccelerometerPrivate, parent)
 {
 }
 
@@ -183,6 +210,45 @@ QAccelerometer::~QAccelerometer()
 {
 }
 
+/*!
+    \property QAccelerometer::accelerationMode
+    \brief The acceleration mode controls how acceleration values are reported.
+    \since 5.1
+
+    The acceleration mode controls how the acceleration sensor reports its values.
+    The default mode is QAccelerometer::Combined, which means the acceleration caused
+    by gravity is included in the reported values.
+
+    Acceleration caused by gravity and acceleration caused by the user moving the device
+    are physically impossible to distinguish because of general relativity. Most devices use
+    sensor fusion to figure out which parts of the acceleration is caused by gravity, for example
+    by using a rotation sensor to calculate the gravity direction and assuming a fixed magnitude
+    for gravity. Therefore the result is only an approximation and may be inaccurate.
+    The QAccelerometer::Combined mode is the most accurate one, as it does not involve approximating
+    the gravity.
+
+    Not all backends and devices might support setting the acceleration mode. For those cases, the
+    default mode QAccelerometer::Combined is used, changing it has no effect.
+*/
+QAccelerometer::AccelerationMode QAccelerometer::accelerationMode() const
+{
+    Q_D(const QAccelerometer);
+    return d->accelerationMode;
+}
+
+/*!
+    Sets the acceleration mode to \a accelerationMode.
+    \since 5.1
+*/
+void QAccelerometer::setAccelerationMode(QAccelerometer::AccelerationMode accelerationMode)
+{
+    Q_D(QAccelerometer);
+    if (d->accelerationMode != accelerationMode) {
+        d->accelerationMode = accelerationMode;
+        emit accelerationModeChanged(d->accelerationMode);
+    }
+}
+
 /*!
     \fn QAccelerometer::reading() const
 
@@ -191,6 +257,14 @@ QAccelerometer::~QAccelerometer()
     \sa QSensor::reading()
 */
 
+/*!
+    \fn QAccelerometer::accelerationModeChanged(AccelerationMode accelerationMode)
+
+    Emitted when the acceleration mode was changed.
+
+    \since 5.1
+*/
+
 #include "moc_qaccelerometer.cpp"
 QT_END_NAMESPACE
 
diff --git a/src/sensors/qaccelerometer.h b/src/sensors/qaccelerometer.h
index 734ce97eb738f2de63faa44460c48de6603f87fd..4478235ccd6623e95e0c44a1844f387e3b4be868 100644
--- a/src/sensors/qaccelerometer.h
+++ b/src/sensors/qaccelerometer.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QAccelerometerReadingPrivate;
 
 class Q_SENSORS_EXPORT QAccelerometerReading : public QSensorReading
@@ -77,21 +74,40 @@ private:
     bool filter(QSensorReading *reading) { return filter(static_cast<QAccelerometerReading*>(reading)); }
 };
 
+class QAccelerometerPrivate;
+
 class Q_SENSORS_EXPORT QAccelerometer : public QSensor
 {
     Q_OBJECT
+    Q_ENUMS(AccelerationMode)
+    Q_PROPERTY(AccelerationMode accelerationMode READ accelerationMode WRITE setAccelerationMode
+               NOTIFY accelerationModeChanged)
 public:
     explicit QAccelerometer(QObject *parent = 0);
     virtual ~QAccelerometer();
+
+    // Keep this enum in sync with QmlAccelerometer::AccelerationMode
+    enum AccelerationMode {
+        Combined,
+        Gravity,
+        User
+    };
+
+    AccelerationMode accelerationMode() const;
+    void setAccelerationMode(AccelerationMode accelerationMode);
+
     QAccelerometerReading *reading() const { return static_cast<QAccelerometerReading*>(QSensor::reading()); }
     static char const * const type;
 
+Q_SIGNALS:
+    void accelerationModeChanged(AccelerationMode accelerationMode);
+
 private:
+    Q_DECLARE_PRIVATE(QAccelerometer)
     Q_DISABLE_COPY(QAccelerometer)
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qaccelerometer_p.h b/src/sensors/qaccelerometer_p.h
index dd60fd19fe992880af657d5e4bd0e151b3e2416b..e8023db2ada86ad0dde5ac0f1136f6fb03113cbc 100644
--- a/src/sensors/qaccelerometer_p.h
+++ b/src/sensors/qaccelerometer_p.h
@@ -53,7 +53,8 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
+#include "qsensor_p.h"
+
 QT_BEGIN_NAMESPACE
 
 class QAccelerometerReadingPrivate
@@ -71,8 +72,18 @@ public:
     qreal z;
 };
 
+class QAccelerometerPrivate : public QSensorPrivate
+{
+public:
+    QAccelerometerPrivate()
+        : accelerationMode(QAccelerometer::Combined)
+    {
+    }
+
+    QAccelerometer::AccelerationMode accelerationMode;
+};
+
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qaltimeter.cpp b/src/sensors/qaltimeter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6a7caa7b92e04dc4c0e77abc66297d99cec10a9f
--- /dev/null
+++ b/src/sensors/qaltimeter.cpp
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qaltimeter.h>
+#include "qaltimeter_p.h"
+
+QT_BEGIN_NAMESPACE
+
+IMPLEMENT_READING(QAltimeterReading)
+
+/*!
+    \class QAltimeterReading
+    \ingroup sensors_reading
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QAltimeterReading class holds readings from the altimeter sensor.
+
+    The altitude is reported in meters relative to mean sea level.
+
+    On BlackBerry, the altimeter uses a combination of pressure and location to determine
+    the altitude, as using pressure alone would yield to inaccurate results due to changes
+    in air pressure caused by the weather. The location information is used to compensate for
+    the weather. This requires that the user has enabled location services in the global
+    settings.
+*/
+
+/*!
+    \property QAltimeterReading::altitude
+    \brief The altitude in meters relative to mean sea level.
+*/
+
+qreal QAltimeterReading::altitude() const
+{
+    return d->altitude;
+}
+
+/*!
+    Sets the altitude to \a altitude.
+*/
+void QAltimeterReading::setAltitude(qreal altitude)
+{
+    d->altitude = altitude;
+}
+
+// =====================================================================
+
+/*!
+    \class QAltimeterFilter
+    \ingroup sensors_filter
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QAltimeterFilter class is a convenience wrapper around QSensorFilter.
+
+    The only difference is that the filter() method features a pointer to QAltimeterReading
+    instead of QSensorReading.
+*/
+
+/*!
+    \fn QAltimeterFilter::filter(QAltimeterReading *reading)
+
+    Called when \a reading changes. Returns false to prevent the reading from propagating.
+
+    \sa QSensorFilter::filter()
+*/
+
+char const * const QAltimeter::type("QAltimeter");
+
+/*!
+    \class QAltimeter
+    \ingroup sensors_type
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QAltimeter class is a convenience wrapper around QSensor.
+
+    The only behavioural difference is that this class sets the type properly.
+
+    This class also features a reading() function that returns a QAltimeterReading instead of a QSensorReading.
+
+    For details about how the sensor works, see \l QAltimeterReading.
+
+    \sa QAltimeterReading
+*/
+
+/*!
+    Construct the sensor as a child of \a parent.
+*/
+QAltimeter::QAltimeter(QObject *parent)
+    : QSensor(QAltimeter::type, parent)
+{
+}
+
+/*!
+    Destroy the sensor. Stops the sensor if it has not already been stopped.
+*/
+QAltimeter::~QAltimeter()
+{
+}
+
+/*!
+    \fn QAltimeter::reading() const
+
+    Returns the reading class for this sensor.
+
+    \sa QSensor::reading()
+*/
+
+#include "moc_qaltimeter.cpp"
+QT_END_NAMESPACE
diff --git a/src/sensors/qaltimeter.h b/src/sensors/qaltimeter.h
new file mode 100644
index 0000000000000000000000000000000000000000..6b7d223279bb498d86ff13b4c0686277179fa4f1
--- /dev/null
+++ b/src/sensors/qaltimeter.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QALTIMETER_H
+#define QALTIMETER_H
+
+#include <QtSensors/qsensor.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAltimeterReadingPrivate;
+
+class Q_SENSORS_EXPORT QAltimeterReading : public QSensorReading
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal altitude READ altitude)
+    DECLARE_READING(QAltimeterReading)
+public:
+    qreal altitude() const;
+    void setAltitude(qreal altitude);
+};
+
+class Q_SENSORS_EXPORT QAltimeterFilter : public QSensorFilter
+{
+public:
+    virtual bool filter(QAltimeterReading *reading) = 0;
+private:
+    bool filter(QSensorReading *reading) Q_DECL_OVERRIDE
+        { return filter(static_cast<QAltimeterReading*>(reading)); }
+};
+
+class Q_SENSORS_EXPORT QAltimeter : public QSensor
+{
+    Q_OBJECT
+public:
+    explicit QAltimeter(QObject *parent = 0);
+    ~QAltimeter();
+    QAltimeterReading *reading() const { return static_cast<QAltimeterReading*>(QSensor::reading()); }
+    static char const * const type;
+
+private:
+    Q_DISABLE_COPY(QAltimeter)
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/sensors/qaltimeter_p.h b/src/sensors/qaltimeter_p.h
new file mode 100644
index 0000000000000000000000000000000000000000..dfc3ebd3879565c4a75113b4f880795ba32dbbd1
--- /dev/null
+++ b/src/sensors/qaltimeter_p.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QALTIMETER_P_H
+#define QALTIMETER_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+class QAltimeterReadingPrivate
+{
+public:
+    QAltimeterReadingPrivate()
+        : altitude(0)
+    {
+    }
+
+    qreal altitude;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/sensors/qambientlightsensor.h b/src/sensors/qambientlightsensor.h
index 8b69fc2cfa0fe572e8164c5cdee20d79bbf4e39a..3dae639c06713f8b272ddab5a547622cd8b548d7 100644
--- a/src/sensors/qambientlightsensor.h
+++ b/src/sensors/qambientlightsensor.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QAmbientLightReadingPrivate;
 
 class Q_SENSORS_EXPORT QAmbientLightReading : public QSensorReading
@@ -93,7 +90,6 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qambientlightsensor_p.h b/src/sensors/qambientlightsensor_p.h
index 5faf85304381bdf8e32dc357ac2df4a3a42d9e45..c921c6bf0b2a20662a7bf7c5a6b19da1031c2b00 100644
--- a/src/sensors/qambientlightsensor_p.h
+++ b/src/sensors/qambientlightsensor_p.h
@@ -53,7 +53,6 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QAmbientLightReadingPrivate
@@ -68,7 +67,6 @@ public:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qambienttemperaturesensor.cpp b/src/sensors/qambienttemperaturesensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9ecde6df47386c65d65cfc2e18ad3af77e974a93
--- /dev/null
+++ b/src/sensors/qambienttemperaturesensor.cpp
@@ -0,0 +1,144 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qambienttemperaturesensor.h>
+#include "qambienttemperaturesensor_p.h"
+
+QT_BEGIN_NAMESPACE
+
+IMPLEMENT_READING(QAmbientTemperatureReading)
+
+/*!
+    \class QAmbientTemperatureReading
+    \ingroup sensors_reading
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QAmbientTemperatureReading class holds readings of the ambient temperature.
+
+    The ambient (room) temperature is the temperature in degree Celsius.
+*/
+
+/*!
+    \property QAmbientTemperatureReading::temperature
+    \brief The ambient temperature
+
+    Measured in degree Celsius.
+*/
+
+qreal QAmbientTemperatureReading::temperature() const
+{
+    return d->temperature;
+}
+
+/*!
+    Sets ambient temperature to \a temperature.
+*/
+void QAmbientTemperatureReading::setTemperature(qreal temperature)
+{
+    d->temperature = temperature;
+}
+
+// =====================================================================
+
+/*!
+    \class QAmbientTemperatureFilter
+    \ingroup sensors_filter
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QAmbientTemperatureFilter class is a convenience wrapper around QSensorFilter.
+
+    The only difference is that the filter() method features a pointer to QAmbientTemperatureReading
+    instead of QSensorReading.
+*/
+
+/*!
+    \fn QAmbientTemperatureFilter::filter(QAmbientTemperatureReading *reading)
+
+    Called when \a reading changes. Returns false to prevent the reading from propagating.
+
+    \sa QSensorFilter::filter()
+*/
+
+char const * const QAmbientTemperatureSensor::type("QAmbientTemperatureSensor");
+
+/*!
+    \class QAmbientTemperatureSensor
+    \ingroup sensors_type
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QAmbientTemperatureSensor class is a convenience wrapper around QSensor.
+
+    The only behavioural difference is that this class sets the type properly.
+
+    This class also features a reading() function that returns a QAmbientTemperatureReading instead of a QSensorReading.
+
+    For details about how the sensor works, see \l QAmbientTemperatureReading.
+
+    \sa QAmbientTemperatureReading
+*/
+
+/*!
+    Construct the sensor as a child of \a parent.
+*/
+QAmbientTemperatureSensor::QAmbientTemperatureSensor(QObject *parent)
+    : QSensor(QAmbientTemperatureSensor::type, parent)
+{
+}
+
+/*!
+    Destroy the sensor. Stops the sensor if it has not already been stopped.
+*/
+QAmbientTemperatureSensor::~QAmbientTemperatureSensor()
+{
+}
+
+/*!
+    \fn QAmbientTemperatureSensor::reading() const
+
+    Returns the reading class for this sensor.
+
+    \sa QSensor::reading()
+*/
+
+#include "moc_qambienttemperaturesensor.cpp"
+QT_END_NAMESPACE
diff --git a/src/sensors/qambienttemperaturesensor.h b/src/sensors/qambienttemperaturesensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..134e5a928c67c8050f093e4eee93683afbcb4776
--- /dev/null
+++ b/src/sensors/qambienttemperaturesensor.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QAMBIENTTEMPERATURESENSOR_H
+#define QAMBIENTTEMPERATURESENSOR_H
+
+#include <QtSensors/qsensor.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAmbientTemperatureReadingPrivate;
+
+class Q_SENSORS_EXPORT QAmbientTemperatureReading : public QSensorReading
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal temperature READ temperature)
+    DECLARE_READING(QAmbientTemperatureReading)
+public:
+    qreal temperature() const;
+    void setTemperature(qreal temperature);
+};
+
+class Q_SENSORS_EXPORT QAmbientTemperatureFilter : public QSensorFilter
+{
+public:
+    virtual bool filter(QAmbientTemperatureReading *reading) = 0;
+private:
+    bool filter(QSensorReading *reading) Q_DECL_OVERRIDE
+        { return filter(static_cast<QAmbientTemperatureReading*>(reading)); }
+};
+
+class Q_SENSORS_EXPORT QAmbientTemperatureSensor : public QSensor
+{
+    Q_OBJECT
+public:
+    explicit QAmbientTemperatureSensor(QObject *parent = 0);
+    ~QAmbientTemperatureSensor();
+    QAmbientTemperatureReading *reading() const { return static_cast<QAmbientTemperatureReading*>(QSensor::reading()); }
+    static char const * const type;
+
+private:
+    Q_DISABLE_COPY(QAmbientTemperatureSensor)
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/sensors/qambienttemperaturesensor_p.h b/src/sensors/qambienttemperaturesensor_p.h
new file mode 100644
index 0000000000000000000000000000000000000000..63fe14528b1a96117aa269c67c26c3915519fc31
--- /dev/null
+++ b/src/sensors/qambienttemperaturesensor_p.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QAMBIENTTEMPERATURESENSOR_P_H
+#define QAMBIENTTEMPERATURESENSOR_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+class QAmbientTemperatureReadingPrivate
+{
+public:
+    QAmbientTemperatureReadingPrivate()
+        : temperature(0)
+    {
+    }
+
+    qreal temperature;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/sensors/qcompass.h b/src/sensors/qcompass.h
index 17b06584eb943e5d61d09b7121fed4c6d6f66471..8b858ff7810574f689bba21f58f80edd3630995c 100644
--- a/src/sensors/qcompass.h
+++ b/src/sensors/qcompass.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QCompassReadingPrivate;
 
 class Q_SENSORS_EXPORT QCompassReading : public QSensorReading
@@ -87,7 +84,6 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qcompass_p.h b/src/sensors/qcompass_p.h
index 04a3b798a16d60c88291c1fded9b47bc197209b0..49da19b23b55e2c16dd476891ba9838d9dbf8a50 100644
--- a/src/sensors/qcompass_p.h
+++ b/src/sensors/qcompass_p.h
@@ -53,7 +53,6 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QCompassReadingPrivate
@@ -70,7 +69,6 @@ public:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qgyroscope.h b/src/sensors/qgyroscope.h
index 7589c6cea268570307acfbf87091eb5b9cc1cbe0..32c01da8e65cf33a094defd637600965c350503a 100644
--- a/src/sensors/qgyroscope.h
+++ b/src/sensors/qgyroscope.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QGyroscopeReadingPrivate;
 
 class Q_SENSORS_EXPORT QGyroscopeReading : public QSensorReading
@@ -91,7 +88,6 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qgyroscope_p.h b/src/sensors/qgyroscope_p.h
index 21bcde41674f9137b72faf90a17388a355f24757..a5e42766dcbf0e94207b6b1d5fc1e5d13358f833 100644
--- a/src/sensors/qgyroscope_p.h
+++ b/src/sensors/qgyroscope_p.h
@@ -53,7 +53,6 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QGyroscopeReadingPrivate
@@ -72,7 +71,6 @@ public:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qholstersensor.cpp b/src/sensors/qholstersensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..761910f296265f61dedcc80f0cab8713c2b0b998
--- /dev/null
+++ b/src/sensors/qholstersensor.cpp
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qholstersensor.h>
+#include "qholstersensor_p.h"
+
+QT_BEGIN_NAMESPACE
+
+IMPLEMENT_READING(QHolsterReading)
+
+/*!
+    \class QHolsterReading
+    \ingroup sensors_reading
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QHolsterReading class holds readings from the holster sensor.
+
+    \section2 QHolsterReading Units
+    The holster sensor can detect if a device is holstered or not. A holster is a pocket,
+    similar to a gun holster, specifically made for the device. If the device is inside of this
+    pocket, it is holstered. The holster supports the device in detecting whether the device is
+    holstered or not.
+*/
+
+/*!
+    \property QHolsterReading::holstered
+    \brief A value indicating whether the device is holstered.
+
+    \sa {QHolsterReading Units}
+*/
+
+bool QHolsterReading::holstered() const
+{
+    return d->holstered;
+}
+
+/*!
+    Sets the holstered value to \a holstered.
+*/
+void QHolsterReading::setHolstered(bool holstered)
+{
+    d->holstered = holstered;
+}
+
+// =====================================================================
+
+/*!
+    \class QHolsterFilter
+    \ingroup sensors_filter
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QHolsterFilter class is a convenience wrapper around QSensorFilter.
+
+    The only difference is that the filter() method features a pointer to QHolsterReading
+    instead of QSensorReading.
+*/
+
+/*!
+    \fn QHolsterFilter::filter(QHolsterReading *reading)
+
+    Called when \a reading changes. Returns false to prevent the reading from propagating.
+
+    \sa QSensorFilter::filter()
+*/
+
+char const * const QHolsterSensor::type("QHolsterSensor");
+
+/*!
+    \class QHolsterSensor
+    \ingroup sensors_type
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QHolsterSensor class is a convenience wrapper around QSensor.
+
+    The only behavioural difference is that this class sets the type properly.
+
+    This class also features a reading() function that returns a QHolsterReading instead of a QSensorReading.
+
+    For details about how the sensor works, see \l QHolsterReading.
+
+    \sa QHolsterReading
+*/
+
+/*!
+    Construct the sensor as a child of \a parent.
+*/
+QHolsterSensor::QHolsterSensor(QObject *parent)
+    : QSensor(QHolsterSensor::type, parent)
+{
+}
+
+/*!
+    Destroy the sensor. Stops the sensor if it has not already been stopped.
+*/
+QHolsterSensor::~QHolsterSensor()
+{
+}
+
+/*!
+    \fn QHolsterSensor::reading() const
+
+    Returns the reading class for this sensor.
+
+    \sa QSensor::reading()
+*/
+
+#include "moc_qholstersensor.cpp"
+QT_END_NAMESPACE
diff --git a/src/sensors/qholstersensor.h b/src/sensors/qholstersensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..f44b381e26bbd30601c0ea8cae4b73dbcdfc9ce6
--- /dev/null
+++ b/src/sensors/qholstersensor.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QHOLSTERSENSOR_H
+#define QHOLSTERSENSOR_H
+
+#include <QtSensors/qsensor.h>
+
+QT_BEGIN_NAMESPACE
+
+class QHolsterReadingPrivate;
+
+class Q_SENSORS_EXPORT QHolsterReading : public QSensorReading
+{
+    Q_OBJECT
+    Q_PROPERTY(bool holstered READ holstered)
+    DECLARE_READING(QHolsterReading)
+public:
+    bool holstered() const;
+    void setHolstered(bool holstered);
+};
+
+class Q_SENSORS_EXPORT QHolsterFilter : public QSensorFilter
+{
+public:
+    virtual bool filter(QHolsterReading *reading) = 0;
+private:
+    bool filter(QSensorReading *reading) Q_DECL_OVERRIDE
+        { return filter(static_cast<QHolsterReading*>(reading)); }
+};
+
+class Q_SENSORS_EXPORT QHolsterSensor : public QSensor
+{
+    Q_OBJECT
+public:
+    explicit QHolsterSensor(QObject *parent = 0);
+    ~QHolsterSensor();
+    QHolsterReading *reading() const { return static_cast<QHolsterReading*>(QSensor::reading()); }
+    static char const * const type;
+
+private:
+    Q_DISABLE_COPY(QHolsterSensor)
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/sensors/qholstersensor_p.h b/src/sensors/qholstersensor_p.h
new file mode 100644
index 0000000000000000000000000000000000000000..a90613f01c39940d49ff0a18d71b7b017e9a6414
--- /dev/null
+++ b/src/sensors/qholstersensor_p.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QHOLSTERSENSOR_P_H
+#define QHOLSTERSENSOR_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+class QHolsterReadingPrivate
+{
+public:
+    QHolsterReadingPrivate()
+        : holstered(false)
+    {
+    }
+
+    bool holstered;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/sensors/qirproximitysensor.cpp b/src/sensors/qirproximitysensor.cpp
index 4b7eeec3e3ba8afa4fc26747167b5d660cc6ba06..6197bb96eb452ffbf04caf0be714d5edda2e9d20 100644
--- a/src/sensors/qirproximitysensor.cpp
+++ b/src/sensors/qirproximitysensor.cpp
@@ -63,6 +63,12 @@ IMPLEMENT_READING(QIRProximityReading)
     The sensor reports reflectance as a decimal fraction in the range of 0 - 1. That is, 0 indicates
     nothing was detected within the range of the sensor and 1 indicates the infra-red signal
     returned at the full power level that it was sent at.
+
+    With some IR sensors, it is quite uncommon to reach the top and the bottom of the
+    value range, and some parts of the range ends might not be obtainable at all. This is due to the
+    behavior of the sensor hardware. With these sensors, the absolute value of reflectance should never
+    be used directly. Instead, applications should react to the relative change of the reading values. Use
+    QProximitySensor if it is only necessary to check if something is close to the device or not.
 */
 
 /*!
diff --git a/src/sensors/qirproximitysensor.h b/src/sensors/qirproximitysensor.h
index c6b8925b0cc0c86f144c900fa0e74a688533a073..29eb49cd6b9bd89af8e9d4e448df460df49017e1 100644
--- a/src/sensors/qirproximitysensor.h
+++ b/src/sensors/qirproximitysensor.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QIRProximityReadingPrivate;
 
 class Q_SENSORS_EXPORT QIRProximityReading : public QSensorReading
@@ -83,7 +80,6 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qirproximitysensor_p.h b/src/sensors/qirproximitysensor_p.h
index 6241b62967cc5755ebc9b145147407b357e6468b..9b16af568f68d3e407e66ba34357627cbd999765 100644
--- a/src/sensors/qirproximitysensor_p.h
+++ b/src/sensors/qirproximitysensor_p.h
@@ -53,7 +53,6 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QIRProximityReadingPrivate
@@ -68,6 +67,5 @@ public:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
diff --git a/src/sensors/qlightsensor.cpp b/src/sensors/qlightsensor.cpp
index b712bb6e04c6cf642d3f943f762cd1bbb3bf718b..1e80ef0923f782ff09aafb15dd5d121c4cfeddfb 100644
--- a/src/sensors/qlightsensor.cpp
+++ b/src/sensors/qlightsensor.cpp
@@ -84,6 +84,7 @@ void QLightReading::setLux(qreal lux)
 /*!
     \class QLightFilter
     \ingroup sensors_filter
+    \inmodule QtSensors
 
     \brief The QLightFilter class is a convenience wrapper around QSensorFilter.
 
@@ -104,6 +105,7 @@ char const * const QLightSensor::type("QLightSensor");
 /*!
     \class QLightSensor
     \ingroup sensors_type
+    \inmodule QtSensors
 
     \brief The QLightSensor class is a convenience wrapper around QSensor.
 
@@ -120,7 +122,7 @@ char const * const QLightSensor::type("QLightSensor");
     Construct the sensor as a child of \a parent.
 */
 QLightSensor::QLightSensor(QObject *parent)
-    : QSensor(QLightSensor::type, parent)
+    : QSensor(QLightSensor::type, *new QLightSensorPrivate, parent)
 {
 }
 
@@ -144,7 +146,33 @@ QLightSensor::~QLightSensor()
     \brief a value indicating the field of view.
 
     This is an angle that represents the field of view of the sensor.
+
+    Not all light sensor support retrieving their field of view. For sensors
+    that don't support this property, the value will be 0. Whether the field of
+    view is supported can be checked with QSensor::isFeatureSupported() and the
+    QSensor::FieldOfView flag.
+*/
+
+qreal QLightSensor::fieldOfView() const
+{
+    Q_D(const QLightSensor);
+    return d->fieldOfView;
+}
+
+/*!
+    \since 5.1
+
+    Sets the field of view to \a fieldOfView. This is to be called from the
+    backend.
 */
+void QLightSensor::setFieldOfView(qreal fieldOfView)
+{
+    Q_D(QLightSensor);
+    if (d->fieldOfView != fieldOfView) {
+        d->fieldOfView = fieldOfView;
+        emit fieldOfViewChanged(fieldOfView);
+    }
+}
 
 #include "moc_qlightsensor.cpp"
 QT_END_NAMESPACE
diff --git a/src/sensors/qlightsensor.h b/src/sensors/qlightsensor.h
index 096df931cd32edae169912381dc921e0c36eae6c..1da84498ef32ba1ada9736a69bfd0d59b57b3562 100644
--- a/src/sensors/qlightsensor.h
+++ b/src/sensors/qlightsensor.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QLightReadingPrivate;
 
 class Q_SENSORS_EXPORT QLightReading : public QSensorReading
@@ -69,24 +66,30 @@ private:
     bool filter(QSensorReading *reading) { return filter(static_cast<QLightReading*>(reading)); }
 };
 
+class QLightSensorPrivate;
+
 class Q_SENSORS_EXPORT QLightSensor : public QSensor
 {
     Q_OBJECT
-#ifdef Q_QDOC
-    Q_PROPERTY(qreal fieldOfView)
-#endif
+    Q_PROPERTY(qreal fieldOfView READ fieldOfView NOTIFY fieldOfViewChanged)
 public:
     explicit QLightSensor(QObject *parent = 0);
     virtual ~QLightSensor();
     QLightReading *reading() const { return static_cast<QLightReading*>(QSensor::reading()); }
     static char const * const type;
 
+    qreal fieldOfView() const;
+    void setFieldOfView(qreal fieldOfView);
+
+Q_SIGNALS:
+    void fieldOfViewChanged(qreal fieldOfView);
+
 private:
+    Q_DECLARE_PRIVATE(QLightSensor)
     Q_DISABLE_COPY(QLightSensor)
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qlightsensor_p.h b/src/sensors/qlightsensor_p.h
index da84463e4afb389407c4f6a47eb0c4b64c00122c..a9df63e4be48c08e2692d6e94f9f70caea2645f0 100644
--- a/src/sensors/qlightsensor_p.h
+++ b/src/sensors/qlightsensor_p.h
@@ -55,7 +55,6 @@
 
 #include "qsensor_p.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QLightReadingPrivate : public QSensorReadingPrivate
@@ -69,8 +68,18 @@ public:
     qreal lux;
 };
 
+class QLightSensorPrivate : public QSensorPrivate
+{
+public:
+    QLightSensorPrivate()
+        : fieldOfView(0)
+    {
+    }
+
+    qreal fieldOfView;
+};
+
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qmagnetometer.cpp b/src/sensors/qmagnetometer.cpp
index 60b2df830bddc43b9988c6edf08ec386c7d03730..7c5c9657261f3547ced58a83a245f85baf29293d 100644
--- a/src/sensors/qmagnetometer.cpp
+++ b/src/sensors/qmagnetometer.cpp
@@ -84,7 +84,7 @@ IMPLEMENT_READING(QMagnetometerReading)
     \property QMagnetometerReading::x
     \brief the raw magnetic flux density on the X axis.
 
-    Measured as telsas.
+    Measured as teslas.
     \sa {QMagnetometerReading Units}
 */
 
@@ -105,7 +105,7 @@ void QMagnetometerReading::setX(qreal x)
     \property QMagnetometerReading::y
     \brief the raw magnetic flux density on the Y axis.
 
-    Measured as telsas.
+    Measured as teslas.
     \sa {QMagnetometerReading Units}
 */
 
@@ -126,7 +126,7 @@ void QMagnetometerReading::setY(qreal y)
     \property QMagnetometerReading::z
     \brief the raw magnetic flux density on the Z axis.
 
-    Measured as telsas.
+    Measured as teslas.
     \sa {QMagnetometerReading Units}
 */
 
@@ -210,7 +210,7 @@ char const * const QMagnetometer::type("QMagnetometer");
     Construct the sensor as a child of \a parent.
 */
 QMagnetometer::QMagnetometer(QObject *parent)
-    : QSensor(QMagnetometer::type, parent)
+    : QSensor(QMagnetometer::type, *new QMagnetometerPrivate, parent)
 {
 }
 
@@ -236,10 +236,24 @@ QMagnetometer::~QMagnetometer()
     Set to true to return geomagnetic flux density.
     Set to false (the default) to return raw magnetic flux density.
 
-    Note that you must access this property via QObject::property() and QObject::setProperty().
     The property must be set before calling start().
 */
 
+bool QMagnetometer::returnGeoValues() const
+{
+    Q_D(const QMagnetometer);
+    return d->returnGeoValues;
+}
+
+void QMagnetometer::setReturnGeoValues(bool returnGeoValues)
+{
+    Q_D(QMagnetometer);
+    if (d->returnGeoValues != returnGeoValues) {
+        d->returnGeoValues = returnGeoValues;
+        emit returnGeoValuesChanged(returnGeoValues);
+    }
+}
+
 #include "moc_qmagnetometer.cpp"
 QT_END_NAMESPACE
 
diff --git a/src/sensors/qmagnetometer.h b/src/sensors/qmagnetometer.h
index 60e142d43d9456ff1d9cbfbac6933f2f3dc3cdce..93b6157f21d5266de969590dc068a4e201735536 100644
--- a/src/sensors/qmagnetometer.h
+++ b/src/sensors/qmagnetometer.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QMagnetometerReadingPrivate;
 
 class Q_SENSORS_EXPORT QMagnetometerReading : public QSensorReading
@@ -81,24 +78,30 @@ private:
     bool filter(QSensorReading *reading) { return filter(static_cast<QMagnetometerReading*>(reading)); }
 };
 
+class QMagnetometerPrivate;
+
 class Q_SENSORS_EXPORT QMagnetometer : public QSensor
 {
     Q_OBJECT
-#ifdef Q_QDOC
-    Q_PROPERTY(bool returnGeoValues)
-#endif
+    Q_PROPERTY(bool returnGeoValues READ returnGeoValues WRITE setReturnGeoValues NOTIFY returnGeoValuesChanged)
 public:
     explicit QMagnetometer(QObject *parent = 0);
     virtual ~QMagnetometer();
     QMagnetometerReading *reading() const { return static_cast<QMagnetometerReading*>(QSensor::reading()); }
     static char const * const type;
 
+    bool returnGeoValues() const;
+    void setReturnGeoValues(bool returnGeoValues);
+
+Q_SIGNALS:
+    void returnGeoValuesChanged(bool returnGeoValues);
+
 private:
+    Q_DECLARE_PRIVATE(QMagnetometer)
     Q_DISABLE_COPY(QMagnetometer)
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qmagnetometer_p.h b/src/sensors/qmagnetometer_p.h
index 2b42cfd7086827e4a2ff2c13d946e91dbc66b3e6..3c38e6c837bcc674afb5c25fabb9633b07d9ce22 100644
--- a/src/sensors/qmagnetometer_p.h
+++ b/src/sensors/qmagnetometer_p.h
@@ -53,9 +53,21 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
+#include "qsensor_p.h"
+
 QT_BEGIN_NAMESPACE
 
+class QMagnetometerPrivate : public QSensorPrivate
+{
+public:
+    QMagnetometerPrivate()
+        : returnGeoValues(false)
+    {
+    }
+
+    bool returnGeoValues;
+};
+
 class QMagnetometerReadingPrivate
 {
 public:
@@ -74,7 +86,6 @@ public:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qorientationsensor.h b/src/sensors/qorientationsensor.h
index f577df7abcb584732a258b8fadf921a626c2bebb..082598fb942ded2b84c442dd05c9dc11547bb7f3 100644
--- a/src/sensors/qorientationsensor.h
+++ b/src/sensors/qorientationsensor.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QOrientationReadingPrivate;
 
 class Q_SENSORS_EXPORT QOrientationReading : public QSensorReading
@@ -94,7 +91,6 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qorientationsensor_p.h b/src/sensors/qorientationsensor_p.h
index 09a65a7146c3f211ef3ed2a43996fcb5d6ef4622..433f3dd9777d199763823267c6ed26b5ee08a0e3 100644
--- a/src/sensors/qorientationsensor_p.h
+++ b/src/sensors/qorientationsensor_p.h
@@ -53,7 +53,6 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QOrientationReadingPrivate
@@ -68,7 +67,6 @@ public:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qpressuresensor.cpp b/src/sensors/qpressuresensor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ea8a79bb6ab8815238b271e8b04e7937d8b3779c
--- /dev/null
+++ b/src/sensors/qpressuresensor.cpp
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <qpressuresensor.h>
+#include "qpressuresensor_p.h"
+
+QT_BEGIN_NAMESPACE
+
+IMPLEMENT_READING(QPressureReading)
+
+/*!
+    \class QPressureReading
+    \ingroup sensors_reading
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QPressureReading class holds readings from the pressure sensor.
+
+    \section2 QPressureReading Units
+
+    The pressure sensor returns atmospheric pressure values in Pascals.
+*/
+
+/*!
+    \property QPressureReading::pressure
+    \brief The measured atmospheric pressure.
+
+    Returned as Pascals.
+    \sa {QPressureReading Units}
+*/
+
+qreal QPressureReading::pressure() const
+{
+    return d->pressure;
+}
+
+/*!
+    Sets the pressure to \a pressure.
+*/
+void QPressureReading::setPressure(qreal pressure)
+{
+    d->pressure = pressure;
+}
+
+// =====================================================================
+
+/*!
+    \class QPressureFilter
+    \ingroup sensors_filter
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QPressureFilter class is a convenience wrapper around QSensorFilter.
+
+    The only difference is that the filter() method features a pointer to QPressureReading
+    instead of QSensorReading.
+*/
+
+/*!
+    \fn QPressureFilter::filter(QPressureReading *reading)
+
+    Called when \a reading changes. Returns false to prevent the reading from propagating.
+
+    \sa QSensorFilter::filter()
+*/
+
+char const * const QPressureSensor::type("QPressureSensor");
+
+/*!
+    \class QPressureSensor
+    \ingroup sensors_type
+    \inmodule QtSensors
+    \since 5.1
+
+    \brief The QPressureSensor class is a convenience wrapper around QSensor.
+
+    The only behavioural difference is that this class sets the type properly.
+
+    This class also features a reading() function that returns a QPressureReading instead of a QSensorReading.
+
+    For details about how the sensor works, see \l QPressureReading.
+
+    \sa QPressureReading
+*/
+
+/*!
+    Construct the sensor as a child of \a parent.
+*/
+QPressureSensor::QPressureSensor(QObject *parent)
+    : QSensor(QPressureSensor::type, parent)
+{
+}
+
+/*!
+    Destroy the sensor. Stops the sensor if it has not already been stopped.
+*/
+QPressureSensor::~QPressureSensor()
+{
+}
+
+/*!
+    \fn QPressureSensor::reading() const
+
+    Returns the reading class for this sensor.
+
+    \sa QSensor::reading()
+*/
+
+#include "moc_qpressuresensor.cpp"
+QT_END_NAMESPACE
diff --git a/src/sensors/qpressuresensor.h b/src/sensors/qpressuresensor.h
new file mode 100644
index 0000000000000000000000000000000000000000..50379b528446669322458bc2e980afb0dc749534
--- /dev/null
+++ b/src/sensors/qpressuresensor.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QPRESSURESENSOR_H
+#define QPRESSURESENSOR_H
+
+#include <QtSensors/qsensor.h>
+
+QT_BEGIN_NAMESPACE
+
+class QPressureReadingPrivate;
+
+class Q_SENSORS_EXPORT QPressureReading : public QSensorReading
+{
+    Q_OBJECT
+    Q_PROPERTY(qreal pressure READ pressure)
+    DECLARE_READING(QPressureReading)
+public:
+    qreal pressure() const;
+    void setPressure(qreal pressure);
+};
+
+class Q_SENSORS_EXPORT QPressureFilter : public QSensorFilter
+{
+public:
+    virtual bool filter(QPressureReading *reading) = 0;
+private:
+    bool filter(QSensorReading *reading) Q_DECL_OVERRIDE
+        { return filter(static_cast<QPressureReading*>(reading)); }
+};
+
+class Q_SENSORS_EXPORT QPressureSensor : public QSensor
+{
+    Q_OBJECT
+public:
+    explicit QPressureSensor(QObject *parent = 0);
+    ~QPressureSensor();
+    QPressureReading *reading() const { return static_cast<QPressureReading*>(QSensor::reading()); }
+    static char const * const type;
+
+private:
+    Q_DISABLE_COPY(QPressureSensor)
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/sensors/qpressuresensor_p.h b/src/sensors/qpressuresensor_p.h
new file mode 100644
index 0000000000000000000000000000000000000000..1c74e7f1c8e216bd61effd3b577e3c750c8e5bd7
--- /dev/null
+++ b/src/sensors/qpressuresensor_p.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QPRESSURESENSOR_P_H
+#define QPRESSURESENSOR_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+class QPressureReadingPrivate
+{
+public:
+    QPressureReadingPrivate()
+        : pressure(0)
+    {
+    }
+
+    qreal pressure;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/sensors/qproximitysensor.h b/src/sensors/qproximitysensor.h
index efabead99536662e3606f8e9fb95b2f2ef3f5090..cc8eb78b149f5059ecbbea350f30dccd1bec01e2 100644
--- a/src/sensors/qproximitysensor.h
+++ b/src/sensors/qproximitysensor.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QProximityReadingPrivate;
 
 class Q_SENSORS_EXPORT QProximityReading : public QSensorReading
@@ -83,7 +80,6 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qproximitysensor_p.h b/src/sensors/qproximitysensor_p.h
index 57125d5093abdb4200c4c9ce3743a356ff4fdcfc..8f951e6a93338fa034a98a33993ebc0203ea5d41 100644
--- a/src/sensors/qproximitysensor_p.h
+++ b/src/sensors/qproximitysensor_p.h
@@ -53,7 +53,6 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QProximityReadingPrivate
@@ -68,7 +67,6 @@ public:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qrotationsensor.cpp b/src/sensors/qrotationsensor.cpp
index 9acc1cd8be3a8f04d49f76e310ebd7f8af1944e2..06ee40646750ac67974b85abe05e6efaf0e6b28d 100644
--- a/src/sensors/qrotationsensor.cpp
+++ b/src/sensors/qrotationsensor.cpp
@@ -201,7 +201,7 @@ char const * const QRotationSensor::type("QRotationSensor");
     Construct the sensor as a child of \a parent.
 */
 QRotationSensor::QRotationSensor(QObject *parent)
-    : QSensor(QRotationSensor::type, parent)
+    : QSensor(QRotationSensor::type, *new QRotationSensorPrivate, parent)
 {
 }
 
@@ -228,6 +228,28 @@ QRotationSensor::~QRotationSensor()
     Returns false if z is not available.
 */
 
+bool QRotationSensor::hasZ() const
+{
+    Q_D(const QRotationSensor);
+    return (d->hasZ);
+}
+
+/*!
+    \since 5.1
+
+    Sets whether the z angle is available to \a hasZ. This is to be called from the
+    backend. By default the hasZ property is true, so a backend only has to
+    call this if its rotation sensor can not report z angles.
+*/
+void QRotationSensor::setHasZ(bool hasZ)
+{
+    Q_D(QRotationSensor);
+    if (d->hasZ != hasZ) {
+        d->hasZ = hasZ;
+        emit hasZChanged(hasZ);
+    }
+}
+
 #include "moc_qrotationsensor.cpp"
 QT_END_NAMESPACE
 
diff --git a/src/sensors/qrotationsensor.h b/src/sensors/qrotationsensor.h
index c049238cd74d01b98c54d88a7e146244029ba216..68a0d1d3b6037790fca6ea999cf9b8dd12fe0f1c 100644
--- a/src/sensors/qrotationsensor.h
+++ b/src/sensors/qrotationsensor.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QRotationReadingPrivate;
 
 class Q_SENSORS_EXPORT QRotationReading : public QSensorReading
@@ -74,24 +71,30 @@ private:
     bool filter(QSensorReading *reading) { return filter(static_cast<QRotationReading*>(reading)); }
 };
 
+class QRotationSensorPrivate;
+
 class Q_SENSORS_EXPORT QRotationSensor : public QSensor
 {
     Q_OBJECT
-#ifdef Q_QDOC
-    Q_PROPERTY(bool hasZ)
-#endif
+    Q_PROPERTY(bool hasZ READ hasZ NOTIFY hasZChanged)
 public:
     explicit QRotationSensor(QObject *parent = 0);
     virtual ~QRotationSensor();
     QRotationReading *reading() const { return static_cast<QRotationReading*>(QSensor::reading()); }
     static char const * const type;
 
+    bool hasZ() const;
+    void setHasZ(bool hasZ);
+
+Q_SIGNALS:
+    void hasZChanged(bool hasZ);
+
 private:
+    Q_DECLARE_PRIVATE(QRotationSensor)
     Q_DISABLE_COPY(QRotationSensor)
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qrotationsensor_p.h b/src/sensors/qrotationsensor_p.h
index f6ce13ff8ce6c57b7e612b7df6f61d6a12b55c47..401c2143682ca286678b5cc04273c2f31699e303 100644
--- a/src/sensors/qrotationsensor_p.h
+++ b/src/sensors/qrotationsensor_p.h
@@ -53,7 +53,8 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
+#include "qsensor_p.h"
+
 QT_BEGIN_NAMESPACE
 
 class QRotationReadingPrivate
@@ -71,8 +72,18 @@ public:
     qreal z;
 };
 
+class QRotationSensorPrivate : public QSensorPrivate
+{
+public:
+    QRotationSensorPrivate()
+        : hasZ(true)
+    {
+    }
+
+    bool hasZ;
+};
+
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qsensor.cpp b/src/sensors/qsensor.cpp
index 81cb6530dee1834de80d93ac39cd129b275dc881..01a4f7b7db6b707486afdb3fca02844efb99bdf6 100644
--- a/src/sensors/qsensor.cpp
+++ b/src/sensors/qsensor.cpp
@@ -176,6 +176,40 @@ void QSensorPrivate::init(const QByteArray &sensorType)
 
     The sensor data is delivered via QSensorReading and its sub-classes.
 
+    \section1 Orientation
+
+    Some sensors react to screen orientation changes, such as QAccelerometer, QMagnetometer and
+    QRotationSensor. These are so called \e orientable sensors. For orientable sensors,
+    QSensor supports changing the reporting of the reading values based on the orientation of the
+    screen.
+
+    For orientable sensors, the axesOrientationMode property controls how the orientation affects
+    the reading values.
+
+    In the default mode, QSensor::FixedOrientation, the reading values remain
+    unaffected by the orientation. In the QSensor::AutomaticOrientation mode, the reading
+    values are automatically rotated by taking the current screen orientation into account. And
+    finally, in the QSensor::UserOrientation mode, the reading values are rotated
+    according to a user-specified orientation.
+
+    The functionality of this is only available if it is supported by the backend and if the sensor
+    is orientable, which can be checked by calling QSensor::isFeatureSupported()
+    with the QSensor::AxesOrientation flag.
+
+    The orientation values here are always of the screen orientation, not the device orientation.
+    The screen orientation is the orientation of the GUI. For example when rotating a device by 90
+    degrees counter-clockwise, the screen orientation compensates for that by rotating 90 degrees
+    clockwise, to the effect that the GUI is still facing upright after the device has been rotated.
+    Note that applications can lock the screen orientation, for example to force portrait or landscape
+    mode. For locked orientations, orientable sensors will not react with reading changes if the device
+    orientation is changed, as orientable sensors react to screen orientation changes only. This makes
+    sense, as the purpose of orientable sensors is to keep the sensor orientation in sync with the screen
+    orientation.
+
+    The orientation values range from 0 to 270 degrees. The orientation is applied in clockwise direction,
+    e.g. an orientation value of 90 degrees means that the screen has been rotated 90 degress to the right
+    from its origin position, to compensate a device rotation of 90 degrees to the left.
+
     \sa QSensorReading
 */
 
@@ -189,6 +223,9 @@ void QSensorPrivate::init(const QByteArray &sensorType)
                      QSensor::bufferSize property.
     \value AlwaysOn The backend supports changing the policy on whether to suspend when idle,
                     controlled by the QSensor::alwaysOn property.
+    \value SkipDuplicates The backend supports skipping of same or very similar successive
+                          readings. This can be enabled by setting the QSensor::skipDuplicates
+                          property to true.
 
     The features of QMagnetometer are:
 
@@ -200,6 +237,16 @@ void QSensorPrivate::init(const QByteArray &sensorType)
     \value FieldOfView The backend specifies its field of view, which can be
                        read from the QLightSensor::fieldOfView property.
 
+    The features of QAccelerometer are:
+
+    \value AccelerationMode The backend supports switching the acceleration mode
+                            of the acceleromter with the QAccelerometer::accelerationMode property.
+
+    The features of all orientable sensors are:
+
+    \value AxesOrientation The backend supports changing the axes orientation from the default of
+                           QSensor::FixedOrientation to something else.
+
     \omitvalue Reserved
 
     \sa QSensor::isFeatureSupported()
@@ -428,6 +475,54 @@ bool QSensor::isAlwaysOn() const
     return d->alwaysOn;
 }
 
+/*!
+    \property QSensor::skipDuplicates
+    \brief Indicates whether duplicate reading values should be omitted.
+    \since 5.1
+
+    When duplicate skipping is enabled, successive readings with the same or very
+    similar values are omitted. This helps reducing the amount of processing done, as less sensor
+    readings are made available. As a consequence, readings arrive at an irregular interval.
+
+    Duplicate skipping is not just enabled for readings that are exactly the same, but also for
+    readings that are quite similar, as each sensor has a bit of jitter even if the device is
+    not moved.
+
+    Support for this property depends on the backend. Use isFeatureSupported() to check if it is
+    supported on the current platform.
+
+    Duplicate skipping is disabled by default.
+
+    Duplicate skipping takes effect when the sensor is started, changing the property while the
+    sensor is active has no immediate effect.
+*/
+bool QSensor::skipDuplicates() const
+{
+    Q_D(const QSensor);
+    return d->skipDuplicates;
+}
+
+/*!
+    Sets the duplicate skipping to \a skipDuplicates.
+
+    \since 5.1
+*/
+void QSensor::setSkipDuplicates(bool skipDuplicates)
+{
+    Q_D(QSensor);
+    if (d->skipDuplicates != skipDuplicates) {
+        d->skipDuplicates = skipDuplicates;
+        emit skipDuplicatesChanged(skipDuplicates);
+    }
+}
+
+/*!
+    \fn QSensor::skipDuplicatesChanged(bool skipDuplicates)
+    \since 5.1
+
+    This signal is emitted when the skipDuplicates property changes.
+*/
+
 /*!
     \property QSensor::availableDataRates
     \brief the data rates that the sensor supports.
@@ -759,6 +854,142 @@ int QSensor::error() const
     return d->error;
 }
 
+/*!
+    \enum QSensor::AxesOrientationMode
+    \since 5.1
+
+    Describes how reading values are affected by the screen orientation.
+
+    \value FixedOrientation No automatic rotation is applied to the reading values.
+
+    \value AutomaticOrientation The reading values are automatically rotated based on the screen
+                                orientation.
+
+    \value UserOrientation The reading values are rotated based on the angle of the userOrientation property.
+
+    \sa QSensor::axesOrientationMode
+*/
+
+/*!
+    \property QSensor::axesOrientationMode
+    \since 5.1
+    \brief The mode that affects how the screen orientation changes reading values.
+
+    When set to FixedOrientation, which is the default mode, no automatic rotation is applied to
+    the reading. This is the only mode available for backends that do not support the
+    QSensor::AxesOrientation feature.
+
+    When set to AutomaticOrientation, the reading values are automatically rotated when the
+    screen orientation changes. In effect, the screen orientation is canceled out.
+
+    As an example, assume the device is rotated by 180 degrees and therefore the screen orientation
+    also is rotated by 180 degrees from the native orientation. Without automatic axes orientation,
+    the reading values would now be changed: Both the X and the Y values would be negated, forcing
+    an application developer to manually cancel out the negation in application code. Automatic
+    axes orientation does this automatically, in this mode the X and Y values would be the same as
+    with the default screen orientation.
+
+    This automatic rotation of the axes is handy is some usecases, for example in a bubble level
+    application that measures how level a surface is by looking at the X axis value of an
+    accelerometer. When the device and screen orientation change by 90 degrees, an application
+    developer does not need to change anything, he can continue using the X axis value even though
+    the device is rotated. Without automatic axes orientation, the application developer would need
+    to look at the Y values instead, thereby adding code to the application that reads from a
+    different axis depending on the screen orientation.
+
+    The UserOrientation mode is quite similar to AutomaticOrientation, only that the screen orientation
+    is manually controlled instead of automatically determined. The angle of the userOrientation
+    property is then used for rotating the reading values.
+
+    Since the rotation of the reading values is based on the screen orientation, Z values will never
+    change, as the Z axis is perpendicular to the screen.
+    As screen orientation changes in 90 degree steps, rotating the reading values is also done in
+    steps of 90 degrees.
+
+    This property is only used for orientable sensors.
+*/
+
+QSensor::AxesOrientationMode QSensor::axesOrientationMode() const
+{
+    Q_D(const QSensor);
+    return d->axesOrientationMode;
+}
+
+void QSensor::setAxesOrientationMode(QSensor::AxesOrientationMode axesOrientationMode)
+{
+    Q_D(QSensor);
+    if (d->axesOrientationMode != axesOrientationMode) {
+        d->axesOrientationMode = axesOrientationMode;
+        emit axesOrientationModeChanged(axesOrientationMode);
+    }
+}
+
+/*!
+    \property QSensor::currentOrientation
+    \since 5.1
+    \brief The current orientation that is used for rotating the reading values.
+
+    This might not be the same as the screen orientation. For example, in the FixedOrientation mode,
+    the reading values are not rotated, and therefore the property is 0.
+
+    In the UserOrientation mode, the readings are rotated based on the userOrientation property,
+    and therefore this property is equal to the userOrientation property.
+
+    In the AutomaticOrientation mode, the readings are rotated based on the screen orientation,
+    and therefore this property will be equal to the current screen orientation.
+
+    This property is set by the backend and only valid for orientable sensors.
+*/
+
+int QSensor::currentOrientation() const
+{
+    Q_D(const QSensor);
+    return d->currentOrientation;
+}
+
+/*!
+    \since 5.1
+    Sets the current screen orientation to \a currentOrientation. This is to be called from the
+    backend whenever the screen orientation or the userOrientation property changes.
+*/
+void QSensor::setCurrentOrientation(int currentOrientation)
+{
+    Q_D(QSensor);
+    if (d->currentOrientation != currentOrientation) {
+        d->currentOrientation = currentOrientation;
+        emit currentOrientationChanged(currentOrientation);
+    }
+}
+
+/*!
+    \property QSensor::userOrientation
+    \since 5.1
+    \brief The angle used for rotating the reading values in the UserOrientation mode.
+
+    When the axesOrientationMode property is set to UserOrientation, the angle for rotating the
+    reading values is taken from this property. In other modes, the property has no effect.
+
+    The default is 0. The only valid values are 0, 90, 180 and 270, as those are the only possible
+    screen orientations.
+
+    This property is only valid for orientable sensors.
+*/
+
+int QSensor::userOrientation() const
+{
+    Q_D(const QSensor);
+    return d->userOrientation;
+}
+
+void QSensor::setUserOrientation(int userOrientation)
+{
+    Q_D(QSensor);
+    if (d->userOrientation != userOrientation) {
+        d->userOrientation = userOrientation;
+        emit userOrientationChanged(userOrientation);
+    }
+}
+
 /*!
     \fn QSensor::sensorError(int error)
 
@@ -785,11 +1016,33 @@ int QSensor::error() const
 
     The property holds the maximum buffer size.
 
-    Note that this may be undefined, in which case the sensor does not support any form of buffering.
+    Note that this may be 1, in which case the sensor does not support any form of buffering.
+    In that case, isFeatureSupported(QSensor::Buffering) will also return false.
 
     \sa QSensor::bufferSize, QSensor::efficientBufferSize
 */
 
+int QSensor::maxBufferSize() const
+{
+    Q_D(const QSensor);
+    return d->maxBufferSize;
+}
+
+/*!
+    \since 5.1
+    Sets the maximum buffer size to \a maxBufferSize. This is to be called from the
+    backend.
+*/
+void QSensor::setMaxBufferSize(int maxBufferSize)
+{
+    // ### Qt 6: Remove the entire maxBufferSize property, no backend really uses it
+    Q_D(QSensor);
+    if (d->maxBufferSize != maxBufferSize) {
+        d->maxBufferSize = maxBufferSize;
+        emit maxBufferSizeChanged(maxBufferSize);
+    }
+}
+
 /*!
     \property QSensor::efficientBufferSize
 
@@ -797,17 +1050,36 @@ int QSensor::error() const
     no particular size is most efficient). Some sensor drivers have a FIFO buffer which
     makes it more efficient to deliver the FIFO's size worth of readings at one time.
 
-    Note that this may be undefined, in which case the sensor does not support any form of buffering.
-
     \sa QSensor::bufferSize, QSensor::maxBufferSize
 */
 
+int QSensor::efficientBufferSize() const
+{
+    Q_D(const QSensor);
+    return d->efficientBufferSize;
+}
+
+/*!
+    \since 5.1
+    Sets the efficient buffer size to \a efficientBufferSize. This is to be called from the
+    backend.
+*/
+void QSensor::setEfficientBufferSize(int efficientBufferSize)
+{
+    // ### Qt 6: Remove the entire efficientBufferSize property, no backend really uses it
+    Q_D(QSensor);
+    if (d->efficientBufferSize != efficientBufferSize) {
+        d->efficientBufferSize = efficientBufferSize;
+        emit efficientBufferSizeChanged(efficientBufferSize);
+    }
+}
+
 /*!
     \property QSensor::bufferSize
 
-    This property holds the size of the buffer. By default (and if the property
-    is left undefined), the buffer size is 1, which means no buffering.
-    If the maximum buffer size is 1 (or undefined), then buffering is not supported
+    This property holds the size of the buffer. By default, the buffer size is 1,
+    which means no buffering.
+    If the maximum buffer size is 1, then buffering is not supported
     by the sensor.
 
     Setting bufferSize greater than maxBufferSize will cause maxBufferSize to be used.
@@ -834,11 +1106,26 @@ int QSensor::error() const
     in time, for example when the event loop is blocked for too long. Without a buffer, these readings
     would simply be dropped.
 
-    The buffer size can only be changed while the sensor is not active.
-
     \sa QSensor::maxBufferSize, QSensor::efficientBufferSize
 */
 
+int QSensor::bufferSize() const
+{
+    Q_D(const QSensor);
+    return d->bufferSize;
+}
+
+void QSensor::setBufferSize(int bufferSize)
+{
+    // ### Qt 6: Currently only the Blackberry backend supports this, but only as an on/off switch.
+    //           We should consider changing this to a more appropriate API.
+    Q_D(QSensor);
+    if (d->bufferSize != bufferSize) {
+        d->bufferSize = bufferSize;
+        emit bufferSizeChanged(bufferSize);
+    }
+}
+
 // =====================================================================
 
 /*!
diff --git a/src/sensors/qsensor.h b/src/sensors/qsensor.h
index 46d011d3103ead27287602de103a3a68d8a892b5..2314fb94f98f72f856495a2f2f940fa184db8d1b 100644
--- a/src/sensors/qsensor.h
+++ b/src/sensors/qsensor.h
@@ -50,11 +50,8 @@
 #include <QtCore/QVariant>
 #include <QtCore/QPair>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QSensorPrivate;
 class QSensorBackend;
 class QSensorReading;
@@ -80,6 +77,7 @@ class Q_SENSORS_EXPORT QSensor : public QObject
 
     Q_OBJECT
     Q_ENUMS(Feature)
+    Q_ENUMS(AxesOrientationMode)
     Q_PROPERTY(QByteArray identifier READ identifier WRITE setIdentifier)
     Q_PROPERTY(QByteArray type READ type)
     Q_PROPERTY(bool connectedToBackend READ isConnectedToBackend)
@@ -93,20 +91,32 @@ class Q_SENSORS_EXPORT QSensor : public QObject
     Q_PROPERTY(QString description READ description)
     Q_PROPERTY(int error READ error NOTIFY sensorError)
     Q_PROPERTY(bool alwaysOn READ isAlwaysOn WRITE setAlwaysOn NOTIFY alwaysOnChanged REVISION 1)
-#ifdef Q_QDOC
-    Q_PROPERTY(int maxBufferSize)
-    Q_PROPERTY(int efficientBufferSize)
-    Q_PROPERTY(int bufferSize)
-#endif
+    Q_PROPERTY(bool skipDuplicates READ skipDuplicates WRITE setSkipDuplicates NOTIFY skipDuplicatesChanged)
+    Q_PROPERTY(AxesOrientationMode axesOrientationMode READ axesOrientationMode WRITE setAxesOrientationMode NOTIFY axesOrientationModeChanged)
+    Q_PROPERTY(int currentOrientation READ currentOrientation NOTIFY currentOrientationChanged)
+    Q_PROPERTY(int userOrientation READ userOrientation WRITE setUserOrientation NOTIFY userOrientationChanged)
+    Q_PROPERTY(int maxBufferSize READ maxBufferSize NOTIFY maxBufferSizeChanged)
+    Q_PROPERTY(int efficientBufferSize READ efficientBufferSize NOTIFY efficientBufferSizeChanged)
+    Q_PROPERTY(int bufferSize READ bufferSize WRITE setBufferSize NOTIFY bufferSizeChanged)
 public:
     enum Feature {
         Buffering,
         AlwaysOn,
         GeoValues,
         FieldOfView,
+        AccelerationMode,
+        SkipDuplicates,
+        AxesOrientation,
         Reserved = 257 // Make sure at least 2 bytes are used for the enum to avoid breaking BC later
     };
 
+    // Keep in sync with QmlSensor::AxesOrientationMode
+    enum AxesOrientationMode {
+        FixedOrientation,
+        AutomaticOrientation,
+        UserOrientation
+    };
+
     explicit QSensor(const QByteArray &type, QObject *parent = 0);
     virtual ~QSensor();
 
@@ -126,6 +136,9 @@ public:
     bool isAlwaysOn() const;
     void setAlwaysOn(bool alwaysOn);
 
+    bool skipDuplicates() const;
+    void setSkipDuplicates(bool skipDuplicates);
+
     qrangelist availableDataRates() const;
     int dataRate() const;
     void setDataRate(int rate);
@@ -153,6 +166,24 @@ public:
 
     Q_INVOKABLE bool isFeatureSupported(Feature feature) const;
 
+    AxesOrientationMode axesOrientationMode() const;
+    void setAxesOrientationMode(AxesOrientationMode axesOrientationMode);
+
+    int currentOrientation() const;
+    void setCurrentOrientation(int currentOrientation);
+
+    int userOrientation() const;
+    void setUserOrientation(int userOrientation);
+
+    int maxBufferSize() const;
+    void setMaxBufferSize(int maxBufferSize);
+
+    int efficientBufferSize() const;
+    void setEfficientBufferSize(int efficientBufferSize);
+
+    int bufferSize() const;
+    void setBufferSize(int bufferSize);
+
 public Q_SLOTS:
     // Start receiving values from the sensor
     bool start();
@@ -168,6 +199,13 @@ Q_SIGNALS:
     void availableSensorsChanged();
     void alwaysOnChanged();
     void dataRateChanged();
+    void skipDuplicatesChanged(bool skipDuplicates);
+    void axesOrientationModeChanged(AxesOrientationMode axesOrientationMode);
+    void currentOrientationChanged(int currentOrientation);
+    void userOrientationChanged(int userOrientation);
+    void maxBufferSizeChanged(int maxBufferSize);
+    void efficientBufferSizeChanged(int efficientBufferSize);
+    void bufferSizeChanged(int bufferSize);
 
 protected:
     explicit QSensor(const QByteArray &type, QSensorPrivate &dd, QObject* parent = 0);
@@ -253,7 +291,6 @@ private:
 
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 Q_DECLARE_METATYPE(qrange)
 Q_DECLARE_METATYPE(qrangelist)
diff --git a/src/sensors/qsensor_p.h b/src/sensors/qsensor_p.h
index 80312b65a00b2925b197e172e43b11e19cc55d2b..71a5b6eb7851bd2a014509df09a01c6beb5b9c99 100644
--- a/src/sensors/qsensor_p.h
+++ b/src/sensors/qsensor_p.h
@@ -57,7 +57,6 @@
 
 #include "private/qobject_p.h"
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 typedef QList<QSensorFilter*> QFilterList;
@@ -79,6 +78,13 @@ public:
         , cache_reading(0)
         , error(0)
         , alwaysOn(false)
+        , skipDuplicates(false)
+        , axesOrientationMode(QSensor::FixedOrientation)
+        , currentOrientation(0)
+        , userOrientation(0)
+        , bufferSize(1)
+        , maxBufferSize(1)
+        , efficientBufferSize(1)
     {
     }
 
@@ -108,6 +114,15 @@ public:
     int error;
 
     bool alwaysOn;
+    bool skipDuplicates;
+
+    QSensor::AxesOrientationMode axesOrientationMode;
+    int currentOrientation;
+    int userOrientation;
+
+    int bufferSize;
+    int maxBufferSize;
+    int efficientBufferSize;
 };
 
 class QSensorReadingPrivate
@@ -123,7 +138,6 @@ public:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qsensorbackend.h b/src/sensors/qsensorbackend.h
index 92dc9e91463430254d8e644f347b7e69768212e9..4c6ce8b55be23201f8ec24dc5090cc39f124c8b0 100644
--- a/src/sensors/qsensorbackend.h
+++ b/src/sensors/qsensorbackend.h
@@ -45,11 +45,8 @@
 #include <QtSensors/qsensor.h>
 #include <QtSensors/qsensormanager.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class Q_SENSORS_EXPORT QSensorBackend : public QObject
 {
     Q_OBJECT
@@ -94,7 +91,6 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qsensormanager.h b/src/sensors/qsensormanager.h
index c2037f751deb5e96535797c08796b4f43831efde..8fa87d1f9c46abf29653adcd5c2d8265cc76d513 100644
--- a/src/sensors/qsensormanager.h
+++ b/src/sensors/qsensormanager.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QSensorBackend;
 class QSensorBackendFactory;
 class QSensorPluginInterface;
@@ -77,7 +74,6 @@ protected:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qsensorplugin.h b/src/sensors/qsensorplugin.h
index 5caef6f1cbcbc0fa3b071f728a26bf65083ecaf0..336bce6bf580b4d697a895568ec7f6ebd3024dd1 100644
--- a/src/sensors/qsensorplugin.h
+++ b/src/sensors/qsensorplugin.h
@@ -46,11 +46,8 @@
 
 #include <QtCore/qplugin.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class Q_SENSORS_EXPORT QSensorPluginInterface
 {
 public:
@@ -71,7 +68,6 @@ Q_DECLARE_INTERFACE(QSensorPluginInterface, "com.qt-project.Qt.QSensorPluginInte
 Q_DECLARE_INTERFACE(QSensorChangesInterface, "com.qt-project.Qt.QSensorChangesInterface/5.0")
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qsensorsglobal.h b/src/sensors/qsensorsglobal.h
index bdd016ff69ed3bf5f36b86450a609a7db02b73dc..496ff4ac652052b3e573b68f87fa73a5e0296cee 100644
--- a/src/sensors/qsensorsglobal.h
+++ b/src/sensors/qsensorsglobal.h
@@ -44,11 +44,8 @@
 
 #include <QtCore/qglobal.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 #ifndef QT_STATIC
 #    if defined(QT_BUILD_SENSORS_LIB)
 #      define Q_SENSORS_EXPORT Q_DECL_EXPORT
@@ -60,7 +57,6 @@ QT_MODULE(QtSensors)
 #endif
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif // QSENSORSGLOBAL_H
 
diff --git a/src/sensors/qtapsensor.cpp b/src/sensors/qtapsensor.cpp
index bd65196b06ff95c27bf7f948f08452729ed9220f..23ec492f49b00b0fbf939351068f77d9ccb65009 100644
--- a/src/sensors/qtapsensor.cpp
+++ b/src/sensors/qtapsensor.cpp
@@ -211,7 +211,7 @@ char const * const QTapSensor::type("QTapSensor");
     Construct the sensor as a child of \a parent.
 */
 QTapSensor::QTapSensor(QObject *parent)
-    : QSensor(QTapSensor::type, parent)
+    : QSensor(QTapSensor::type, *new QTapSensorPrivate, parent)
 {
 }
 
@@ -240,10 +240,24 @@ QTapSensor::~QTapSensor()
     It is not possible to have the sensor report both single and double tap events.
     If both are needed the app should create 2 sensor objects.
 
-    Note that you must access this property via QObject::property() and QObject::setProperty().
     The property must be set before calling start().
 */
 
+bool QTapSensor::returnDoubleTapEvents() const
+{
+    Q_D(const QTapSensor);
+    return d->returnDoubleTapEvents;
+}
+
+void QTapSensor::setReturnDoubleTapEvents(bool returnDoubleTapEvents)
+{
+    Q_D(QTapSensor);
+    if (d->returnDoubleTapEvents != returnDoubleTapEvents) {
+        d->returnDoubleTapEvents = returnDoubleTapEvents;
+        emit returnDoubleTapEventsChanged(returnDoubleTapEvents);
+    }
+}
+
 #include "moc_qtapsensor.cpp"
 QT_END_NAMESPACE
 
diff --git a/src/sensors/qtapsensor.h b/src/sensors/qtapsensor.h
index da71e9657f2311ce277fe547398dc4d3a1a4f0d7..74ca40c26bb1cb81983ecef84b9753217080c531 100644
--- a/src/sensors/qtapsensor.h
+++ b/src/sensors/qtapsensor.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QTapReadingPrivate;
 
 class Q_SENSORS_EXPORT QTapReading : public QSensorReading
@@ -90,24 +87,31 @@ private:
     bool filter(QSensorReading *reading) { return filter(static_cast<QTapReading*>(reading)); }
 };
 
+class QTapSensorPrivate;
+
 class Q_SENSORS_EXPORT QTapSensor : public QSensor
 {
     Q_OBJECT
-#ifdef Q_QDOC
-    Q_PROPERTY(bool returnDoubleTapEvents)
-#endif
+    Q_PROPERTY(bool returnDoubleTapEvents READ returnDoubleTapEvents WRITE setReturnDoubleTapEvents
+               NOTIFY returnDoubleTapEventsChanged)
 public:
     explicit QTapSensor(QObject *parent = 0);
     virtual ~QTapSensor();
     QTapReading *reading() const { return static_cast<QTapReading*>(QSensor::reading()); }
     static char const * const type;
 
+    bool returnDoubleTapEvents() const;
+    void setReturnDoubleTapEvents(bool returnDoubleTapEvents);
+
+Q_SIGNALS:
+    void returnDoubleTapEventsChanged(bool returnDoubleTapEvents);
+
 private:
+    Q_DECLARE_PRIVATE(QTapSensor);
     Q_DISABLE_COPY(QTapSensor)
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qtapsensor_p.h b/src/sensors/qtapsensor_p.h
index 68270e87fa83a78f03ec701a8ce4eb96d1b1c3fb..6bf814739b7fa2df50f035c590da6dc0f3989de3 100644
--- a/src/sensors/qtapsensor_p.h
+++ b/src/sensors/qtapsensor_p.h
@@ -53,7 +53,8 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
+#include "qsensor_p.h"
+
 QT_BEGIN_NAMESPACE
 
 class QTapReadingPrivate
@@ -69,8 +70,18 @@ public:
     bool doubleTap;
 };
 
+class QTapSensorPrivate : public QSensorPrivate
+{
+public:
+    QTapSensorPrivate()
+        : returnDoubleTapEvents(true)
+    {
+    }
+
+    bool returnDoubleTapEvents;
+};
+
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/qtiltsensor.h b/src/sensors/qtiltsensor.h
index 68dcdfeafeaae86bdb6feff093d7b894b4d77df8..246a103e0fe7f61a3833a3c9369527c4f6ace30f 100644
--- a/src/sensors/qtiltsensor.h
+++ b/src/sensors/qtiltsensor.h
@@ -44,11 +44,8 @@
 
 #include <QtSensors/qsensor.h>
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
-QT_MODULE(QtSensors)
-
 class QTiltReadingPrivate;
 
 class Q_SENSORS_EXPORT QTiltReading : public QSensorReading
@@ -91,5 +88,4 @@ private:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/sensors/qtiltsensor_p.h b/src/sensors/qtiltsensor_p.h
index 14946243980a5aee0e3cdaff7930301f288f1786..e8cce136ac853e4aa0f517f24ecfb73cf14da368 100644
--- a/src/sensors/qtiltsensor_p.h
+++ b/src/sensors/qtiltsensor_p.h
@@ -53,7 +53,6 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 class QTiltReadingPrivate
@@ -70,5 +69,4 @@ public:
 };
 
 QT_END_NAMESPACE
-QT_END_HEADER
 #endif
diff --git a/src/sensors/sensorlog_p.h b/src/sensors/sensorlog_p.h
index d1cde707441a22fe33b59ae85241d3daf1e51e48..f808ab2d8415580986aebaaf7f4246daee89edc6 100644
--- a/src/sensors/sensorlog_p.h
+++ b/src/sensors/sensorlog_p.h
@@ -53,7 +53,6 @@
 // We mean it.
 //
 
-QT_BEGIN_HEADER
 QT_BEGIN_NAMESPACE
 
 #ifdef ENABLE_RUNTIME_SENSORLOG
@@ -83,7 +82,6 @@ static bool logEnabled()
 #endif
 
 QT_END_NAMESPACE
-QT_END_HEADER
 
 #endif
 
diff --git a/src/sensors/sensors.pro b/src/sensors/sensors.pro
index 2cb33468d81784524cf9ff87236d0038413d3503..fe10a5e7f37450e9581244ed29d234d0bd77b32c 100644
--- a/src/sensors/sensors.pro
+++ b/src/sensors/sensors.pro
@@ -12,6 +12,11 @@ simulator {
 
 QMAKE_DOCS = $$PWD/doc/qtsensors.qdocconf
 
+ANDROID_JAR_DEPENDENCIES = \
+    jar/QtSensors.jar:org.qtproject.qt5.android.sensors.QtSensors
+ANDROID_LIB_DEPENDENCIES = \
+    plugins/sensors/libqtsensors_android.so
+
 load(qt_module)
 
 PUBLIC_HEADERS += \
@@ -51,8 +56,11 @@ simulator {
 SENSORS=\
     qsensor\
     qaccelerometer\
+    qaltimeter\
     qambientlightsensor\
+    qambienttemperaturesensor\
     qcompass\
+    qholstersensor\
     qlightsensor\
     qmagnetometer\
     qorientationsensor\
@@ -62,6 +70,7 @@ SENSORS=\
     qtapsensor\
     qtiltsensor\
     qgyroscope\
+    qpressuresensor\
 
 for(s,SENSORS) {
     # Client API
diff --git a/tests/auto/qsensor/test_backends.h b/tests/auto/qsensor/test_backends.h
index a36a8586e0ea594be657e1789d4c4340d6bb9e6f..b76d41287ea9f95723db0232a9a8f28743849a13 100644
--- a/tests/auto/qsensor/test_backends.h
+++ b/tests/auto/qsensor/test_backends.h
@@ -48,12 +48,16 @@ void register_test_backends();
 void unregister_test_backends();
 
 #include <qaccelerometer.h>
+#include <qaltimeter.h>
 #include <qambientlightsensor.h>
+#include <qambienttemperaturesensor.h>
 #include <qcompass.h>
 #include <qgyroscope.h>
+#include <qholstersensor.h>
 #include <qlightsensor.h>
 #include <qmagnetometer.h>
 #include <qorientationsensor.h>
+#include <qpressuresensor.h>
 #include <qproximitysensor.h>
 #include <qrotationsensor.h>
 #include <qtapsensor.h>
@@ -96,9 +100,15 @@ PREPARE_SENSORINTERFACE(QAccelerometer, QAccelerometerReading, QAccelerometerFil
     reading->setY(1.0);
     reading->setZ(1.0);
 })
+PREPARE_SENSORINTERFACE(QAltimeter, QAltimeterReading, QAltimeterFilter, {
+    reading->setAltitude(8848);
+})
 PREPARE_SENSORINTERFACE(QAmbientLightSensor, QAmbientLightReading, QAmbientLightFilter, {
     reading->setLightLevel(QAmbientLightReading::Twilight);
 })
+PREPARE_SENSORINTERFACE(QAmbientTemperatureSensor, QAmbientTemperatureReading, QAmbientTemperatureFilter, {
+    reading->setTemperature(30);
+})
 PREPARE_SENSORINTERFACE(QCompass, QCompassReading, QCompassFilter, {
     reading->setAzimuth(1.0);
     reading->setCalibrationLevel(1.0);
@@ -108,6 +118,9 @@ PREPARE_SENSORINTERFACE(QGyroscope, QGyroscopeReading, QGyroscopeFilter, {
     reading->setY(1.0);
     reading->setZ(1.0);
 })
+PREPARE_SENSORINTERFACE(QHolsterSensor, QHolsterReading, QHolsterFilter, {
+    reading->setHolstered(true);
+})
 PREPARE_SENSORINTERFACE(QLightSensor, QLightReading, QLightFilter, {
     reading->setLux(1.0);
 })
@@ -120,6 +133,9 @@ PREPARE_SENSORINTERFACE(QMagnetometer, QMagnetometerReading, QMagnetometerFilter
 PREPARE_SENSORINTERFACE(QOrientationSensor, QOrientationReading, QOrientationFilter, {
     reading->setOrientation(QOrientationReading::LeftUp);
 })
+PREPARE_SENSORINTERFACE(QPressureSensor, QPressureReading, QPressureFilter, {
+    reading->setPressure(1.0);
+})
 PREPARE_SENSORINTERFACE(QProximitySensor, QProximityReading, QProximityFilter, {
     reading->setClose(true);
 })
diff --git a/tests/auto/qsensor/tst_qsensor.cpp b/tests/auto/qsensor/tst_qsensor.cpp
index a4591aa44bac7bc4707361b545d8b7d8f95ffaf4..a410f7112d3b470e78a7e0c227c0749720154ed9 100644
--- a/tests/auto/qsensor/tst_qsensor.cpp
+++ b/tests/auto/qsensor/tst_qsensor.cpp
@@ -847,10 +847,18 @@ private slots:
             QCOMPARE(reading->z(), 1.0);
         })
 
+        TEST_SENSORINTERFACE(QAltimeter, QAltimeterReading, {
+            QCOMPARE(reading->altitude(), 8848.0);
+        })
+
         TEST_SENSORINTERFACE(QAmbientLightSensor, QAmbientLightReading, {
             QCOMPARE(reading->lightLevel(), QAmbientLightReading::Twilight);
         })
 
+        TEST_SENSORINTERFACE(QAmbientTemperatureSensor, QAmbientTemperatureReading, {
+            QCOMPARE(reading->temperature(), 30.0);
+        })
+
         TEST_SENSORINTERFACE(QCompass, QCompassReading, {
             QCOMPARE(reading->azimuth(), 1.0);
             QCOMPARE(reading->calibrationLevel(), 1.0);
@@ -862,6 +870,10 @@ private slots:
             QCOMPARE(reading->z(), 1.0);
         })
 
+        TEST_SENSORINTERFACE(QHolsterSensor, QHolsterReading, {
+            QCOMPARE(reading->holstered(), true);
+        })
+
         TEST_SENSORINTERFACE(QLightSensor, QLightReading, {
             QCOMPARE(reading->lux(), 1.0);
         })
@@ -877,6 +889,10 @@ private slots:
             QCOMPARE(reading->orientation(), QOrientationReading::LeftUp);
         })
 
+        TEST_SENSORINTERFACE(QPressureSensor, QPressureReading, {
+            QCOMPARE(reading->pressure(), 1.0);
+        })
+
         TEST_SENSORINTERFACE(QProximitySensor, QProximityReading, {
             QCOMPARE(reading->close(), true);
         })
@@ -959,6 +975,7 @@ private slots:
         QVERIFY(!sensor.isFeatureSupported(QSensor::Buffering));
         QVERIFY(!sensor.isFeatureSupported(QSensor::GeoValues));
         QVERIFY(!sensor.isFeatureSupported(QSensor::FieldOfView));
+        QVERIFY(!sensor.isFeatureSupported(QSensor::AccelerationMode));
 
         // Connect to backend - according to the testsensorimpl implementation, AlwaysOn and
         // GeoValues should be supported afterwards
@@ -968,6 +985,7 @@ private slots:
         QVERIFY(!sensor.isFeatureSupported(QSensor::Buffering));
         QVERIFY(sensor.isFeatureSupported(QSensor::GeoValues));
         QVERIFY(!sensor.isFeatureSupported(QSensor::FieldOfView));
+        QVERIFY(!sensor.isFeatureSupported(QSensor::AccelerationMode));
     }
 };