diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..1594d12
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,16 @@
+# Contributing to Apache Cordova
+
+Anyone can contribute to Cordova. And we need your contributions.
+
+There are multiple ways to contribute: report bugs, improve the docs, and
+contribute code.
+
+For instructions on this, start with the 
+[contribution overview](http://cordova.apache.org/#contribute).
+
+The details are explained there, but the important items are:
+ - Sign and submit an Apache ICLA (Contributor License Agreement).
+ - Have a Jira issue open that corresponds to your contribution.
+ - Run the tests so your patch doesn't break existing functionality.
+
+We look forward to your contributions!
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..8ec56a5
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,5 @@
+Apache Cordova
+Copyright 2012 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
index 4bd5977..d0cba9b 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,22 @@
-cordova-plugin-device-motion
-============================
+<!---
+ license: Licensed to the Apache Software Foundation (ASF) under one
+         or more contributor license agreements.  See the NOTICE file
+         distributed with this work for additional information
+         regarding copyright ownership.  The ASF licenses this file
+         to you under the Apache License, Version 2.0 (the
+         "License"); you may not use this file except in compliance
+         with the License.  You may obtain a copy of the License at
 
-Standalone plugin to be used together with cordova-pluman, to install into cordova native projects.
-To install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).
+           http://www.apache.org/licenses/LICENSE-2.0
 
-If you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).
+         Unless required by applicable law or agreed to in writing,
+         software distributed under the License is distributed on an
+         "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+         KIND, either express or implied.  See the License for the
+         specific language governing permissions and limitations
+         under the License.
+-->
+
+# org.apache.cordova.device-motion
+
+Plugin documentation: [doc/index.md](doc/index.md)
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 1509ede..1044990 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -28,3 +28,36 @@
 * CB-4889 renaming org.apache.cordova.core.device-motion to org.apache.cordova.device-motion
 * Rename CHANGELOG.md -> RELEASENOTES.md
 * [CB-4752] Incremented plugin version on dev branch.
+
+### 0.2.3 (Oct 28, 2013)
+* tweak scoping
+* fixed the scope
+* properly stop watching...
+* adding timestamp to the response
+* fix acceleromter for firefox os
+* update firefoxos integration
+* fixed callbacks
+* accelerometer registers, but is not responding
+* fxos added, not working
+* CB-5128: added repo + issue tag to plugin.xml for device motion
+* CB-5012 ensure result is returned
+* [CB-4825] Add CoreMotion.framework to plugin.xml
+* [CB-4825] avoid retain cycle in update block
+* [CB-4825] use CoreMotion framework for accelerometer
+* [CB-4915] Incremented plugin version on dev branch.
+
+### 0.2.4 (Dec 4, 2013)
+* add ubuntu platform
+* 1. Added amazon-fireos platform. 2. Change to use amazon-fireos as the platform if the user agent string contains 'cordova-amazon-fireos'
+
+### 0.2.5 (Jan 02, 2014)
+* CB-5658 Add doc/index.md for Device Motion plugin
+
+### 0.2.6 (Feb 05, 2014)
+* Add Tizen support
+
+### 0.2.7 (Apr 17, 2014)
+* CB-6422: [windows8] use cordova/exec/proxy
+* CB-6460: Update license headers
+* CB-6465: Add license headers to Tizen code
+* Add NOTICE file
diff --git a/doc/index.md b/doc/index.md
new file mode 100644
index 0000000..d0f5127
--- /dev/null
+++ b/doc/index.md
@@ -0,0 +1,157 @@
+<!---
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+# org.apache.cordova.device-motion
+
+This plugin provides access to the device's accelerometer. The accelerometer is
+a motion sensor that detects the change (_delta_) in movement relative to the
+current device orientation, in three dimensions along the _x_, _y_, and _z_
+axis.
+
+## Installation
+
+    cordova plugin add org.apache.cordova.device-motion
+
+## Supported Platforms
+
+- Amazon Fire OS
+- Android
+- BlackBerry 10
+- Firefox OS
+- iOS
+- Tizen
+- Windows Phone 7 and 8
+- Windows 8
+
+## Methods
+
+- navigator.accelerometer.getCurrentAcceleration
+- navigator.accelerometer.watchAcceleration
+- navigator.accelerometer.clearWatch
+
+## Objects
+
+- Acceleration
+
+## navigator.accelerometer.getCurrentAcceleration
+
+Get the current acceleration along the _x_, _y_, and _z_ axes.
+
+These acceleration values are returned to the `accelerometerSuccess`
+callback function.
+
+    navigator.accelerometer.getCurrentAcceleration(accelerometerSuccess, accelerometerError);
+
+
+### Example
+
+    function onSuccess(acceleration) {
+        alert('Acceleration X: ' + acceleration.x + '\n' +
+              'Acceleration Y: ' + acceleration.y + '\n' +
+              'Acceleration Z: ' + acceleration.z + '\n' +
+              'Timestamp: '      + acceleration.timestamp + '\n');
+    };
+
+    function onError() {
+        alert('onError!');
+    };
+
+    navigator.accelerometer.getCurrentAcceleration(onSuccess, onError);
+
+### iOS Quirks
+
+- iOS doesn't recognize the concept of getting the current acceleration at any given point.
+
+- You must watch the acceleration and capture the data at given time intervals.
+
+- Thus, the `getCurrentAcceleration` function yields the last value reported from a `watchAccelerometer` call.
+
+## navigator.accelerometer.watchAcceleration
+
+Retrieves the device's current `Acceleration` at a regular interval, executing
+the `accelerometerSuccess` callback function each time. Specify the interval in
+milliseconds via the `acceleratorOptions` object's `frequency` parameter.
+
+The returned watch ID references the accelerometer's watch interval,
+and can be used with `navigator.accelerometer.clearWatch` to stop watching the
+accelerometer.
+
+    var watchID = navigator.accelerometer.watchAcceleration(accelerometerSuccess,
+                                                           accelerometerError,
+                                                           [accelerometerOptions]);
+
+- __accelerometerOptions__: An object with the following optional keys:
+  - __frequency__: How often to retrieve the `Acceleration` in milliseconds. _(Number)_ (Default: 10000)
+
+
+###  Example
+
+    function onSuccess(acceleration) {
+        alert('Acceleration X: ' + acceleration.x + '\n' +
+              'Acceleration Y: ' + acceleration.y + '\n' +
+              'Acceleration Z: ' + acceleration.z + '\n' +
+              'Timestamp: '      + acceleration.timestamp + '\n');
+    };
+
+    function onError() {
+        alert('onError!');
+    };
+
+    var options = { frequency: 3000 };  // Update every 3 seconds
+
+    var watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options);
+
+### iOS Quirks
+
+The API calls the success callback function at the interval requested,
+but restricts the range of requests to the device between 40ms and
+1000ms. For example, if you request an interval of 3 seconds,
+(3000ms), the API requests data from the device every 1 second, but
+only executes the success callback every 3 seconds.
+
+## navigator.accelerometer.clearWatch
+
+Stop watching the `Acceleration` referenced by the `watchID` parameter.
+
+    navigator.accelerometer.clearWatch(watchID);
+
+- __watchID__: The ID returned by `navigator.accelerometer.watchAcceleration`.
+
+###  Example
+
+    var watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options);
+
+    // ... later on ...
+
+    navigator.accelerometer.clearWatch(watchID);
+
+## Acceleration
+
+Contains `Accelerometer` data captured at a specific point in time.
+Acceleration values include the effect of gravity (9.81 m/s^2), so that when a
+device lies flat and facing up, _x_, _y_, and _z_ values returned should be
+`0`, `0`, and `9.81`.
+
+### Properties
+
+- __x__:  Amount of acceleration on the x-axis. (in m/s^2) _(Number)_
+- __y__:  Amount of acceleration on the y-axis. (in m/s^2) _(Number)_
+- __z__:  Amount of acceleration on the z-axis. (in m/s^2) _(Number)_
+- __timestamp__: Creation timestamp in milliseconds. _(DOMTimeStamp)_
+
diff --git a/docs/acceleration/acceleration.md b/docs/acceleration/acceleration.md
deleted file mode 100644
index 4f982b9..0000000
--- a/docs/acceleration/acceleration.md
+++ /dev/null
@@ -1,109 +0,0 @@
----
-license: Licensed to the Apache Software Foundation (ASF) under one
-         or more contributor license agreements.  See the NOTICE file
-         distributed with this work for additional information
-         regarding copyright ownership.  The ASF licenses this file
-         to you under the Apache License, Version 2.0 (the
-         "License"); you may not use this file except in compliance
-         with the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-         Unless required by applicable law or agreed to in writing,
-         software distributed under the License is distributed on an
-         "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-         KIND, either express or implied.  See the License for the
-         specific language governing permissions and limitations
-         under the License.
----
-
-Acceleration
-============
-
-Contains `Accelerometer` data captured at a specific point in time.
-
-Properties
-----------
-
-- __x:__  Amount of acceleration on the x-axis. (in m/s^2) (`Number`)
-- __y:__  Amount of acceleration on the y-axis. (in m/s^2) (`Number`)
-- __z:__  Amount of acceleration on the z-axis. (in m/s^2) (`Number`)
-- __timestamp:__ Creation timestamp in milliseconds. (`DOMTimeStamp`)
-
-Description
------------
-
-This object is created and populated by Cordova, and returned by an `Accelerometer` method. The x, y, z acceleration values include the effect of gravity (9.81 m/s^2), so at when a device is lying flat on a table facing up, the value returned should be x=0, y=0, z=9.81.
-
-Supported Platforms
--------------------
-
-- Android
-- BlackBerry WebWorks (OS 5.0 and higher)
-- iOS
-- Windows Phone 7 and 8
-- Bada 1.2 & 2.x
-- webOS
-- Tizen
-- Windows 8
-
-
-Quick Example
--------------
-
-    function onSuccess(acceleration) {
-        alert('Acceleration X: ' + acceleration.x + '\n' +
-              'Acceleration Y: ' + acceleration.y + '\n' +
-              'Acceleration Z: ' + acceleration.z + '\n' +
-              'Timestamp: '      + acceleration.timestamp + '\n');
-    };
-
-    function onError() {
-        alert('onError!');
-    };
-
-    navigator.accelerometer.getCurrentAcceleration(onSuccess, onError);
-
-Full Example
-------------
-
-    <!DOCTYPE html>
-    <html>
-      <head>
-        <title>Acceleration Example</title>
-
-        <script type="text/javascript" charset="utf-8" src="cordova-2.6.0.js"></script>
-        <script type="text/javascript" charset="utf-8">
-
-        // Wait for Cordova to load
-        //
-        document.addEventListener("deviceready", onDeviceReady, false);
-
-        // Cordova is ready
-        //
-        function onDeviceReady() {
-            navigator.accelerometer.getCurrentAcceleration(onSuccess, onError);
-        }
-
-        // onSuccess: Get a snapshot of the current acceleration
-        //
-        function onSuccess(acceleration) {
-            alert('Acceleration X: ' + acceleration.x + '\n' +
-                  'Acceleration Y: ' + acceleration.y + '\n' +
-                  'Acceleration Z: ' + acceleration.z + '\n' +
-                  'Timestamp: '      + acceleration.timestamp + '\n');
-        }
-
-        // onError: Failed to get the acceleration
-        //
-        function onError() {
-            alert('onError!');
-        }
-
-        </script>
-      </head>
-      <body>
-        <h1>Example</h1>
-        <p>getCurrentAcceleration</p>
-      </body>
-    </html>
diff --git a/docs/accelerometer.clearWatch.md b/docs/accelerometer.clearWatch.md
deleted file mode 100644
index 579a6e7..0000000
--- a/docs/accelerometer.clearWatch.md
+++ /dev/null
@@ -1,114 +0,0 @@
----
-license: Licensed to the Apache Software Foundation (ASF) under one
-         or more contributor license agreements.  See the NOTICE file
-         distributed with this work for additional information
-         regarding copyright ownership.  The ASF licenses this file
-         to you under the Apache License, Version 2.0 (the
-         "License"); you may not use this file except in compliance
-         with the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-         Unless required by applicable law or agreed to in writing,
-         software distributed under the License is distributed on an
-         "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-         KIND, either express or implied.  See the License for the
-         specific language governing permissions and limitations
-         under the License.
----
-
-accelerometer.clearWatch
-========================
-
-Stop watching the `Acceleration` referenced by the watch ID parameter.
-
-    navigator.accelerometer.clearWatch(watchID);
-
-- __watchID__: The ID returned by `accelerometer.watchAcceleration`.
-
-Supported Platforms
--------------------
-
-- Android
-- BlackBerry WebWorks (OS 5.0 and higher)
-- iPhone
-- Windows Phone 7 and 8
-- Bada 1.2 & 2.x
-- Tizen
-- Windows 8
-
-Quick Example
--------------
-
-    var watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options);
-    
-    // ... later on ...
-    
-    navigator.accelerometer.clearWatch(watchID);
-    
-Full Example
-------------
-
-    <!DOCTYPE html>
-    <html>
-      <head>
-        <title>Acceleration Example</title>
-
-        <script type="text/javascript" charset="utf-8" src="cordova-2.6.0.js"></script>
-        <script type="text/javascript" charset="utf-8">
-
-        // The watch id references the current `watchAcceleration`
-        var watchID = null;
-        
-        // Wait for Cordova to load
-        //
-        document.addEventListener("deviceready", onDeviceReady, false);
-
-        // Cordova is ready
-        //
-        function onDeviceReady() {
-            startWatch();
-        }
-
-        // Start watching the acceleration
-        //
-        function startWatch() {
-            
-            // Update acceleration every 3 seconds
-            var options = { frequency: 3000 };
-            
-            watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options);
-        }
-        
-        // Stop watching the acceleration
-        //
-        function stopWatch() {
-            if (watchID) {
-                navigator.accelerometer.clearWatch(watchID);
-                watchID = null;
-            }
-        }
-		    
-        // onSuccess: Get a snapshot of the current acceleration
-        //
-        function onSuccess(acceleration) {
-            var element = document.getElementById('accelerometer');
-            element.innerHTML = 'Acceleration X: ' + acceleration.x + '<br />' +
-                                'Acceleration Y: ' + acceleration.y + '<br />' +
-                                'Acceleration Z: ' + acceleration.z + '<br />' + 
-                                'Timestamp: '      + acceleration.timestamp + '<br />';
-        }
-
-        // onError: Failed to get the acceleration
-        //
-        function onError() {
-            alert('onError!');
-        }
-
-        </script>
-      </head>
-      <body>
-        <div id="accelerometer">Waiting for accelerometer...</div>
-		<button onclick="stopWatch();">Stop Watching</button>
-      </body>
-    </html>
diff --git a/docs/accelerometer.getCurrentAcceleration.md b/docs/accelerometer.getCurrentAcceleration.md
deleted file mode 100644
index 02e14b3..0000000
--- a/docs/accelerometer.getCurrentAcceleration.md
+++ /dev/null
@@ -1,110 +0,0 @@
----
-license: Licensed to the Apache Software Foundation (ASF) under one
-         or more contributor license agreements.  See the NOTICE file
-         distributed with this work for additional information
-         regarding copyright ownership.  The ASF licenses this file
-         to you under the Apache License, Version 2.0 (the
-         "License"); you may not use this file except in compliance
-         with the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-         Unless required by applicable law or agreed to in writing,
-         software distributed under the License is distributed on an
-         "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-         KIND, either express or implied.  See the License for the
-         specific language governing permissions and limitations
-         under the License.
----
-
-accelerometer.getCurrentAcceleration
-====================================
-
-Get the current acceleration along the x, y, and z axis.
-
-    navigator.accelerometer.getCurrentAcceleration(accelerometerSuccess, accelerometerError);
-
-Description
------------
-
-The accelerometer is a motion sensor that detects the change (delta) in movement relative to the current device orientation. The accelerometer can detect 3D movement along the x, y, and z axis.
-
-The acceleration is returned using the `accelerometerSuccess` callback function.
-
-Supported Platforms
--------------------
-
-- Android
-- BlackBerry WebWorks (OS 5.0 and higher)
-- iPhone
-- Windows Phone 7 and 8
-- Bada 1.2 & 2.x
-- Tizen
-- Windows 8
-
-Quick Example
--------------
-
-    function onSuccess(acceleration) {
-        alert('Acceleration X: ' + acceleration.x + '\n' +
-              'Acceleration Y: ' + acceleration.y + '\n' +
-              'Acceleration Z: ' + acceleration.z + '\n' +
-              'Timestamp: '      + acceleration.timestamp + '\n');
-    };
-
-    function onError() {
-        alert('onError!');
-    };
-
-    navigator.accelerometer.getCurrentAcceleration(onSuccess, onError);
-
-Full Example
-------------
-
-    <!DOCTYPE html>
-    <html>
-      <head>
-        <title>Acceleration Example</title>
-
-        <script type="text/javascript" charset="utf-8" src="cordova-2.6.0.js"></script>
-        <script type="text/javascript" charset="utf-8">
-
-        // Wait for Cordova to load
-        //
-        document.addEventListener("deviceready", onDeviceReady, false);
-
-        // Cordova is ready
-        //
-        function onDeviceReady() {
-            navigator.accelerometer.getCurrentAcceleration(onSuccess, onError);
-        }
-    
-        // onSuccess: Get a snapshot of the current acceleration
-        //
-        function onSuccess(acceleration) {
-            alert('Acceleration X: ' + acceleration.x + '\n' +
-                  'Acceleration Y: ' + acceleration.y + '\n' +
-                  'Acceleration Z: ' + acceleration.z + '\n' +
-                  'Timestamp: '      + acceleration.timestamp + '\n');
-        }
-    
-        // onError: Failed to get the acceleration
-        //
-        function onError() {
-            alert('onError!');
-        }
-
-        </script>
-      </head>
-      <body>
-        <h1>Example</h1>
-        <p>getCurrentAcceleration</p>
-      </body>
-    </html>
-    
-iPhone Quirks
--------------
-
-- iPhone doesn't have the concept of getting the current acceleration at any given point.
-- You must watch the acceleration and capture the data at given time intervals.
-- Thus, the `getCurrentAcceleration` function will give you the last value reported from a Cordova `watchAccelerometer` call.
diff --git a/docs/accelerometer.md b/docs/accelerometer.md
deleted file mode 100644
index 3f68d04..0000000
--- a/docs/accelerometer.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-license: Licensed to the Apache Software Foundation (ASF) under one
-         or more contributor license agreements.  See the NOTICE file
-         distributed with this work for additional information
-         regarding copyright ownership.  The ASF licenses this file
-         to you under the Apache License, Version 2.0 (the
-         "License"); you may not use this file except in compliance
-         with the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-         Unless required by applicable law or agreed to in writing,
-         software distributed under the License is distributed on an
-         "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-         KIND, either express or implied.  See the License for the
-         specific language governing permissions and limitations
-         under the License.
----
-
-Accelerometer
-=============
-
-> Captures device motion in the x, y, and z direction.
-
-Methods
--------
-
-- accelerometer.getCurrentAcceleration
-- accelerometer.watchAcceleration
-- accelerometer.clearWatch
-
-Arguments
----------
-
-- accelerometerSuccess
-- accelerometerError
-- accelerometerOptions
-
-Objects (Read-Only)
--------------------
-
-- Acceleration
-
-Permissions
------------
-
-### Android
-
-#### app/res/xml/config.xml
-
-    <plugin name="Accelerometer" value="org.apache.cordova.AccelListener" />
-
-### Bada
-
-    No permissions are required.
-
-### BlackBerry WebWorks
-
-#### www/plugins.xml
-
-    <plugin name="Accelerometer" value="org.apache.cordova.accelerometer.Accelerometer" />
-
-#### www/config.xml
-
-    <feature id="blackberry.system"  required="true" version="1.0.0.0" />
-    <feature id="org.apache.cordova" required="true" version="1.0.0" />
-
-### iOS
-
-#### config.xml
-
-    <plugin name="Accelerometer" value="CDVAccelerometer" />
-
-### webOS
-
-    No permissions are required.
-
-### Windows Phone
-
-#### Properties/WPAppManifest.xml
-
-    <Capabilities>
-        <Capability Name="ID_CAP_SENSORS" />
-    </Capabilities>
-
-Reference: [Application Manifest for Windows Phone](http://msdn.microsoft.com/en-us/library/ff769509%28v=vs.92%29.aspx)
-
-### Tizen
-
-    No permissions are required.
diff --git a/docs/accelerometer.watchAcceleration.md b/docs/accelerometer.watchAcceleration.md
deleted file mode 100644
index 9cc7405..0000000
--- a/docs/accelerometer.watchAcceleration.md
+++ /dev/null
@@ -1,138 +0,0 @@
----
-license: Licensed to the Apache Software Foundation (ASF) under one
-         or more contributor license agreements.  See the NOTICE file
-         distributed with this work for additional information
-         regarding copyright ownership.  The ASF licenses this file
-         to you under the Apache License, Version 2.0 (the
-         "License"); you may not use this file except in compliance
-         with the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-         Unless required by applicable law or agreed to in writing,
-         software distributed under the License is distributed on an
-         "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-         KIND, either express or implied.  See the License for the
-         specific language governing permissions and limitations
-         under the License.
----
-
-accelerometer.watchAcceleration
-===============================
-
-At a regular interval, get the acceleration along the x, y, and z axis.
-
-    var watchID = navigator.accelerometer.watchAcceleration(accelerometerSuccess,
-                                                           accelerometerError,
-                                                           [accelerometerOptions]);
-                                                           
-Description
------------
-
-The accelerometer is a motion sensor that detects the change (delta) in movement relative to the current position. The accelerometer can detect 3D movement along the x, y, and z axis.
-
-The `accelerometer.watchAcceleration` gets the device's current acceleration at a regular interval. Each time the `Acceleration` is retrieved, the `accelerometerSuccess` callback function is executed. Specify the interval in milliseconds via the `frequency` parameter in the `acceleratorOptions` object.
-
-The returned watch ID references the accelerometer watch interval. The watch ID can be used with `accelerometer.clearWatch` to stop watching the accelerometer.
-
-Supported Platforms
--------------------
-
-- Android
-- BlackBerry WebWorks (OS 5.0 and higher)
-- iPhone
-- Windows Phone 7 and 8
-- Bada 1.2 & 2.x
-- Tizen
-- Windows 8
-
-Quick Example
--------------
-
-    function onSuccess(acceleration) {
-        alert('Acceleration X: ' + acceleration.x + '\n' +
-              'Acceleration Y: ' + acceleration.y + '\n' +
-              'Acceleration Z: ' + acceleration.z + '\n' +
-              'Timestamp: '      + acceleration.timestamp + '\n');
-    };
-
-    function onError() {
-        alert('onError!');
-    };
-
-    var options = { frequency: 3000 };  // Update every 3 seconds
-    
-    var watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options);
-
-Full Example
-------------
-
-    <!DOCTYPE html>
-    <html>
-      <head>
-        <title>Acceleration Example</title>
-
-        <script type="text/javascript" charset="utf-8" src="cordova-2.6.0.js"></script>
-        <script type="text/javascript" charset="utf-8">
-
-        // The watch id references the current `watchAcceleration`
-        var watchID = null;
-        
-        // Wait for Cordova to load
-        //
-        document.addEventListener("deviceready", onDeviceReady, false);
-
-        // Cordova is ready
-        //
-        function onDeviceReady() {
-            startWatch();
-        }
-
-        // Start watching the acceleration
-        //
-        function startWatch() {
-            
-            // Update acceleration every 3 seconds
-            var options = { frequency: 3000 };
-            
-            watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options);
-        }
-        
-        // Stop watching the acceleration
-        //
-        function stopWatch() {
-            if (watchID) {
-                navigator.accelerometer.clearWatch(watchID);
-                watchID = null;
-            }
-        }
-        
-        // onSuccess: Get a snapshot of the current acceleration
-        //
-        function onSuccess(acceleration) {
-            var element = document.getElementById('accelerometer');
-            element.innerHTML = 'Acceleration X: ' + acceleration.x + '<br />' +
-                                'Acceleration Y: ' + acceleration.y + '<br />' +
-                                'Acceleration Z: ' + acceleration.z + '<br />' +
-                                'Timestamp: '      + acceleration.timestamp + '<br />';
-        }
-
-        // onError: Failed to get the acceleration
-        //
-        function onError() {
-            alert('onError!');
-        }
-
-        </script>
-      </head>
-      <body>
-        <div id="accelerometer">Waiting for accelerometer...</div>
-      </body>
-    </html>
-    
- iPhone Quirks
--------------
-
-- At the interval requested, Cordova will call the success callback function and pass the accelerometer results.
-- However, in requests to the device Cordova restricts the interval to minimum of every 40ms and a maximum of every 1000ms.
-  - For example, if you request an interval of 3 seconds (3000ms), Cordova will request an interval of 1 second from the device but invoke the success callback at the requested interval of 3 seconds.
diff --git a/docs/parameters/accelerometerError.md b/docs/parameters/accelerometerError.md
deleted file mode 100644
index 814df4d..0000000
--- a/docs/parameters/accelerometerError.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-license: Licensed to the Apache Software Foundation (ASF) under one
-         or more contributor license agreements.  See the NOTICE file
-         distributed with this work for additional information
-         regarding copyright ownership.  The ASF licenses this file
-         to you under the Apache License, Version 2.0 (the
-         "License"); you may not use this file except in compliance
-         with the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-         Unless required by applicable law or agreed to in writing,
-         software distributed under the License is distributed on an
-         "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-         KIND, either express or implied.  See the License for the
-         specific language governing permissions and limitations
-         under the License.
----
-
-accelerometerError
-==================
-
-onError callback function for acceleration functions.
-
-    function() {
-        // Handle the error
-    }
diff --git a/docs/parameters/accelerometerOptions.md b/docs/parameters/accelerometerOptions.md
deleted file mode 100644
index 9e8211d..0000000
--- a/docs/parameters/accelerometerOptions.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-license: Licensed to the Apache Software Foundation (ASF) under one
-         or more contributor license agreements.  See the NOTICE file
-         distributed with this work for additional information
-         regarding copyright ownership.  The ASF licenses this file
-         to you under the Apache License, Version 2.0 (the
-         "License"); you may not use this file except in compliance
-         with the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-         Unless required by applicable law or agreed to in writing,
-         software distributed under the License is distributed on an
-         "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-         KIND, either express or implied.  See the License for the
-         specific language governing permissions and limitations
-         under the License.
----
-
-accelerometerOptions
-====================
-
-An optional parameter to customize the retrieval of the accelerometer.
-
-Options
--------
-
-- __frequency:__ How often to retrieve the `Acceleration` in milliseconds. _(Number)_ (Default: 10000)
diff --git a/docs/parameters/accelerometerSuccess.md b/docs/parameters/accelerometerSuccess.md
deleted file mode 100644
index 4e68fb6..0000000
--- a/docs/parameters/accelerometerSuccess.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-license: Licensed to the Apache Software Foundation (ASF) under one
-         or more contributor license agreements.  See the NOTICE file
-         distributed with this work for additional information
-         regarding copyright ownership.  The ASF licenses this file
-         to you under the Apache License, Version 2.0 (the
-         "License"); you may not use this file except in compliance
-         with the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-         Unless required by applicable law or agreed to in writing,
-         software distributed under the License is distributed on an
-         "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-         KIND, either express or implied.  See the License for the
-         specific language governing permissions and limitations
-         under the License.
----
-
-accelerometerSuccess
-====================
-
-onSuccess callback function that provides the Acceleration information.
-
-    function(acceleration) {
-        // Do something
-    }
-
-Parameters
-----------
-
-- __acceleration:__ The acceleration at a single moment in time. (Acceleration)
-
-Example
--------
-
-    function onSuccess(acceleration) {
-        alert('Acceleration X: ' + acceleration.x + '\n' +
-              'Acceleration Y: ' + acceleration.y + '\n' +
-              'Acceleration Z: ' + acceleration.z + '\n' +
-              'Timestamp: '      + acceleration.timestamp + '\n');
-    };
diff --git a/plugin.xml b/plugin.xml
index 0c96b4d..c32a175 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -1,13 +1,33 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
 
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
            id="org.apache.cordova.device-motion"
-      version="0.2.2">
+      version="0.2.8-dev">
 	
     <name>Device Motion</name>
     <description>Cordova Device Motion Plugin</description>
     <license>Apache 2.0</license>
     <keywords>cordova,device,motion</keywords>
+    <repo>https://git-wip-us.apache.org/repos/asf/cordova-plugin-device-motion.git</repo>
+    <issue>https://issues.apache.org/jira/browse/CB/component/12320636</issue>
 
     <js-module src="www/Acceleration.js" name="Acceleration">
         <clobbers target="Acceleration" />
@@ -20,6 +40,19 @@
     <js-module src="test/tests.js" name="tests">
     </js-module>
     
+    <!-- firefoxos -->
+    <platform name="firefoxos">
+        <config-file target="config.xml" parent="/*">
+            <feature name="Accelerometer">
+                <param name="firefoxos-package" value="Accelerometer" />
+            </feature>
+        </config-file>                                         
+        
+        <js-module src="src/firefoxos/accelerometer.js" name="accelerometer-impl">
+          <runs />
+        </js-module>
+    </platform>
+
     <!-- android -->
     <platform name="android">
 	    
@@ -33,6 +66,25 @@
     
     </platform>
     
+    <!-- amazon-fireos -->
+    <platform name="amazon-fireos">
+	    
+        <config-file target="res/xml/config.xml" parent="/*">
+            <feature name="Accelerometer">
+                <param name="android-package" value="org.apache.cordova.devicemotion.AccelListener"/>
+            </feature>
+        </config-file>
+
+        <source-file src="src/android/AccelListener.java" target-dir="src/org/apache/cordova/devicemotion" />
+    
+    </platform>
+    
+    <!-- ubuntu -->
+    <platform name="ubuntu">
+        <header-file src="src/ubuntu/accelerometer.h" />
+        <source-file src="src/ubuntu/accelerometer.cpp" />
+    </platform>
+
     <!-- ios -->
     <platform name="ios">
         
@@ -45,6 +97,7 @@
         <header-file src="src/ios/CDVAccelerometer.h" />
         <source-file src="src/ios/CDVAccelerometer.m" />
         
+        <framework src="CoreMotion.framework" />
     </platform>
 
     <!-- blackberry10 -->
@@ -91,5 +144,11 @@
             <merges target="" />
         </js-module>
     </platform>
-    
+
+    <!-- tizen -->
+    <platform name="tizen">
+        <js-module src="src/tizen/AccelerometerProxy.js" name="AccelerometerProxy">
+            <runs/>
+        </js-module>
+    </platform>
 </plugin>
diff --git a/src/firefoxos/accelerometer.js b/src/firefoxos/accelerometer.js
new file mode 100644
index 0000000..c0152ad
--- /dev/null
+++ b/src/firefoxos/accelerometer.js
@@ -0,0 +1,41 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+function listener(success, ev) {
+    var acc = ev.accelerationIncludingGravity;
+    acc.timestamp = new Date().getTime();
+    success(acc);
+}
+
+var Accelerometer = {
+    start: function start(success, error) {
+        return window.addEventListener('devicemotion', function(ev) {
+            listener(success, ev);
+        }, false);
+    },
+
+    stop: function stop() {
+        window.removeEventListener('devicemotion', listener, false);
+    }
+};
+
+module.exports = Accelerometer;
+require('cordova/firefoxos/commandProxy').add('Accelerometer', Accelerometer);
diff --git a/src/ios/CDVAccelerometer.h b/src/ios/CDVAccelerometer.h
index 923d0c8..ee1664f 100755
--- a/src/ios/CDVAccelerometer.h
+++ b/src/ios/CDVAccelerometer.h
@@ -20,7 +20,7 @@
 #import <UIKit/UIKit.h>
 #import <Cordova/CDVPlugin.h>
 
-@interface CDVAccelerometer : CDVPlugin <UIAccelerometerDelegate>
+@interface CDVAccelerometer : CDVPlugin
 {
     double x;
     double y;
diff --git a/src/ios/CDVAccelerometer.m b/src/ios/CDVAccelerometer.m
index 33093d0..e98aacd 100755
--- a/src/ios/CDVAccelerometer.m
+++ b/src/ios/CDVAccelerometer.m
@@ -17,10 +17,13 @@
  under the License.
  */
 
+#import <CoreMotion/CoreMotion.h>
 #import "CDVAccelerometer.h"
 
 @interface CDVAccelerometer () {}
 @property (readwrite, assign) BOOL isRunning;
+@property (readwrite, assign) BOOL haveReturnedResult;
+@property (readwrite, strong) CMMotionManager* motionManager;
 @end
 
 @implementation CDVAccelerometer
@@ -28,7 +31,7 @@
 @synthesize callbackId, isRunning;
 
 // defaults to 10 msec
-#define kAccelerometerInterval 40
+#define kAccelerometerInterval 10
 // g constant: -9.81 m/s^2
 #define kGravitationalConstant -9.81
 
@@ -42,6 +45,8 @@
         timestamp = 0;
         self.callbackId = nil;
         self.isRunning = NO;
+        self.haveReturnedResult = YES;
+        self.motionManager = nil;
     }
     return self;
 }
@@ -53,17 +58,31 @@
 
 - (void)start:(CDVInvokedUrlCommand*)command
 {
-    NSString* cbId = command.callbackId;
-    NSTimeInterval desiredFrequency_num = kAccelerometerInterval;
-    UIAccelerometer* pAccel = [UIAccelerometer sharedAccelerometer];
+    self.haveReturnedResult = NO;
+    self.callbackId = command.callbackId;
 
-    // accelerometer expects fractional seconds, but we have msecs
-    pAccel.updateInterval = desiredFrequency_num / 1000;
-    self.callbackId = cbId;
-    if (!self.isRunning) {
-        pAccel.delegate = self;
-        self.isRunning = YES;
+    if (!self.motionManager)
+    {
+        self.motionManager = [[CMMotionManager alloc] init];
     }
+
+    if ([self.motionManager isAccelerometerAvailable] == YES) {
+        // Assign the update interval to the motion manager and start updates
+        [self.motionManager setAccelerometerUpdateInterval:kAccelerometerInterval/1000];  // expected in seconds
+        __weak CDVAccelerometer* weakSelf = self;
+        [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
+            x = accelerometerData.acceleration.x;
+            y = accelerometerData.acceleration.y;
+            z = accelerometerData.acceleration.z;
+            timestamp = ([[NSDate date] timeIntervalSince1970] * 1000);
+            [weakSelf returnAccelInfo];
+        }];
+
+        if (!self.isRunning) {
+            self.isRunning = YES;
+        }
+    }
+    
 }
 
 - (void)onReset
@@ -73,24 +92,14 @@
 
 - (void)stop:(CDVInvokedUrlCommand*)command
 {
-    UIAccelerometer* theAccelerometer = [UIAccelerometer sharedAccelerometer];
-
-    theAccelerometer.delegate = nil;
-    self.isRunning = NO;
-}
-
-/**
- * Picks up accel updates from device and stores them in this class
- */
-- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
-{
-    if (self.isRunning) {
-        x = acceleration.x;
-        y = acceleration.y;
-        z = acceleration.z;
-        timestamp = ([[NSDate date] timeIntervalSince1970] * 1000);
-        [self returnAccelInfo];
+    if ([self.motionManager isAccelerometerAvailable] == YES) {
+        if (self.haveReturnedResult == NO){
+            // block has not fired before stop was called, return whatever result we currently have
+            [self returnAccelInfo];
+        }
+        [self.motionManager stopAccelerometerUpdates];
     }
+    self.isRunning = NO;
 }
 
 - (void)returnAccelInfo
@@ -106,6 +115,7 @@
     CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:accelProps];
     [result setKeepCallback:[NSNumber numberWithBool:YES]];
     [self.commandDelegate sendPluginResult:result callbackId:self.callbackId];
+    self.haveReturnedResult = YES;
 }
 
 // TODO: Consider using filtering to isolate instantaneous data vs. gravity data -jm
diff --git a/src/tizen/AccelerometerProxy.js b/src/tizen/AccelerometerProxy.js
new file mode 100644
index 0000000..b534422
--- /dev/null
+++ b/src/tizen/AccelerometerProxy.js
@@ -0,0 +1,51 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+(function(win) {
+    var cordova = require('cordova'),
+        Acceleration = require('org.apache.cordova.device-motion.Acceleration'),
+        accelerometerCallback = null;
+
+    module.exports = {
+        start: function (successCallback, errorCallback) {
+            if (accelerometerCallback) {
+                win.removeEventListener("devicemotion", accelerometerCallback, true);
+            }
+
+            accelerometerCallback = function (motion) {
+                successCallback({
+                    x: motion.accelerationIncludingGravity.x,
+                    y: motion.accelerationIncludingGravity.y,
+                    z: motion.accelerationIncludingGravity.z,
+                    timestamp: new Date().getTime()
+                });
+            };
+            win.addEventListener("devicemotion", accelerometerCallback, true);
+        },
+
+        stop: function (successCallback, errorCallback) {
+            win.removeEventListener("devicemotion", accelerometerCallback, true);
+            accelerometerCallback = null;
+        }
+    };
+
+    require("cordova/tizen/commandProxy").add("Accelerometer", module.exports);
+}(window));
diff --git a/src/ubuntu/accelerometer.cpp b/src/ubuntu/accelerometer.cpp
new file mode 100644
index 0000000..8d39174
--- /dev/null
+++ b/src/ubuntu/accelerometer.cpp
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+#include <cassert>
+#include "accelerometer.h"
+
+DeviceMotion::DeviceMotion(Cordova *cordova): CPlugin(cordova), _scId(0), _ecId(0) {
+    _accelerometerSource = QSharedPointer<QAccelerometer>(new QAccelerometer());
+    _sensorAvaliable = _accelerometerSource->start();
+    connect(_accelerometerSource.data(), SIGNAL(readingChanged()), SLOT(updateSensor()));
+}
+
+void DeviceMotion::start(int scId, int ecId) {
+    assert(_ecId == 0);
+    assert(_scId == 0);
+
+    _ecId = ecId;
+    _scId = scId;
+
+    if (!_sensorAvaliable) {
+        this->cb(ecId);
+        return;
+    }
+}
+
+void DeviceMotion::stop(int, int) {
+    _scId = 0;
+    _ecId = 0;
+}
+
+void DeviceMotion::updateSensor() {
+    QAccelerometerReading *accelerometer = _accelerometerSource->reading();
+
+    QVariantMap obj;
+    obj.insert("x", accelerometer->x());
+    obj.insert("y", accelerometer->y());
+    obj.insert("z", accelerometer->z());
+    // accelerometer->timestamp() is not sutiable.
+    // Timestamps values are microseconds since _a_ fixed point(depend on backend).
+    obj.insert("timestamp", QDateTime::currentDateTime().toMSecsSinceEpoch());
+
+    if (_scId)
+        this->cb(_scId, obj);
+}
diff --git a/src/ubuntu/accelerometer.h b/src/ubuntu/accelerometer.h
new file mode 100644
index 0000000..3f36a16
--- /dev/null
+++ b/src/ubuntu/accelerometer.h
@@ -0,0 +1,55 @@
+/*
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+#ifndef ACCELEROMETER_H
+#define ACCELEROMETER_H
+
+#include <cplugin.h>
+#include <QAccelerometer>
+#include <QtCore>
+
+class DeviceMotion: public CPlugin {
+    Q_OBJECT
+public:
+    explicit DeviceMotion(Cordova *cordova);
+
+    virtual const QString fullName() override {
+        return DeviceMotion::fullID();
+    }
+
+    virtual const QString shortName() override {
+        return "Accelerometer";
+    }
+
+    static const QString fullID() {
+        return "Accelerometer";
+    }
+
+public slots:
+    void start(int scId, int ecId);
+    void stop(int scId, int ecId);
+
+protected slots:
+    void updateSensor();
+
+private:
+    int _scId, _ecId;
+    bool _sensorAvaliable;
+    QSharedPointer<QAccelerometer> _accelerometerSource;
+};
+
+#endif
diff --git a/src/windows8/AccelerometerProxy.js b/src/windows8/AccelerometerProxy.js
index d76e9b2..0b41ba7 100644
--- a/src/windows8/AccelerometerProxy.js
+++ b/src/windows8/AccelerometerProxy.js
@@ -67,4 +67,4 @@
     }
 };
 
-require("cordova/windows8/commandProxy").add("Accelerometer",module.exports);
+require("cordova/exec/proxy").add("Accelerometer",module.exports);
