diff --git a/plugin.xml b/plugin.xml
index 36032b1..c32a175 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -36,6 +36,9 @@
     <js-module src="www/accelerometer.js" name="accelerometer">
         <clobbers target="navigator.accelerometer" />
     </js-module>
+
+    <js-module src="test/tests.js" name="tests">
+    </js-module>
     
     <!-- firefoxos -->
     <platform name="firefoxos">
diff --git a/test/tests.js b/test/tests.js
new file mode 100644
index 0000000..f85e695
--- /dev/null
+++ b/test/tests.js
@@ -0,0 +1,154 @@
+exports.defineAutoTests = function() {
+  describe('Accelerometer (navigator.accelerometer)', function () {
+    var fail = function(done) {
+      expect(true).toBe(false);
+      done();
+    };
+
+    it("accelerometer.spec.1 should exist", function () {
+      expect(navigator.accelerometer).toBeDefined();
+    });
+
+    describe("getCurrentAcceleration", function() {
+      it("accelerometer.spec.2 should exist", function() {
+        expect(typeof navigator.accelerometer.getCurrentAcceleration).toBeDefined();
+        expect(typeof navigator.accelerometer.getCurrentAcceleration == 'function').toBe(true);
+      });
+
+      it("accelerometer.spec.3 success callback should be called with an Acceleration object", function(done) {
+        var win = function(a) {
+          expect(a).toBeDefined();
+          expect(a.x).toBeDefined();
+          expect(typeof a.x == 'number').toBe(true);
+          expect(a.y).toBeDefined();
+          expect(typeof a.y == 'number').toBe(true);
+          expect(a.z).toBeDefined();
+          expect(typeof a.z == 'number').toBe(true);
+          expect(a.timestamp).toBeDefined();
+          expect(typeof a.timestamp).toBe('number');
+          done();
+        };
+
+        navigator.accelerometer.getCurrentAcceleration(win, fail.bind(null, done));
+      });
+
+      it("accelerometer.spec.4 success callback Acceleration object should have (reasonable) values for x, y and z expressed in m/s^2", function(done) {
+        var reasonableThreshold = 15;
+        var win = function(a) {
+          expect(a.x).toBeLessThan(reasonableThreshold);
+          expect(a.x).toBeGreaterThan(reasonableThreshold * -1);
+          expect(a.y).toBeLessThan(reasonableThreshold);
+          expect(a.y).toBeGreaterThan(reasonableThreshold * -1);
+          expect(a.z).toBeLessThan(reasonableThreshold);
+          expect(a.z).toBeGreaterThan(reasonableThreshold * -1);
+          done()
+        };
+
+        navigator.accelerometer.getCurrentAcceleration(win, fail.bind(null,done));
+      });
+
+      it("accelerometer.spec.5 success callback Acceleration object should return a recent timestamp", function(done) {
+        var veryRecently = (new Date()).getTime();
+        // Need to check that dates returned are not vastly greater than a recent time stamp.
+        // In case the timestamps returned are ridiculously high
+        var reasonableTimeLimit = veryRecently + 5000; // 5 seconds from now
+        var win = function(a) {
+          expect(a.timestamp).toBeGreaterThan(veryRecently);
+          expect(a.timestamp).toBeLessThan(reasonableTimeLimit);
+          done();
+        };
+
+        navigator.accelerometer.getCurrentAcceleration(win, fail.bind(null,done));
+      });
+    });
+
+    describe("watchAcceleration", function() {
+      var id;
+
+      afterEach(function() {
+          navigator.accelerometer.clearWatch(id);
+      });
+
+      it("accelerometer.spec.6 should exist", function() {
+          expect(navigator.accelerometer.watchAcceleration).toBeDefined();
+          expect(typeof navigator.accelerometer.watchAcceleration == 'function').toBe(true);
+      });
+
+      it("accelerometer.spec.7 success callback should be called with an Acceleration object", function(done) {
+        var win = function(a) {
+          expect(a).toBeDefined();
+          expect(a.x).toBeDefined();
+          expect(typeof a.x == 'number').toBe(true);
+          expect(a.y).toBeDefined();
+          expect(typeof a.y == 'number').toBe(true);
+          expect(a.z).toBeDefined();
+          expect(typeof a.z == 'number').toBe(true);
+          expect(a.timestamp).toBeDefined();
+          expect(typeof a.timestamp).toBe('number');
+          done();
+        };
+
+        id = navigator.accelerometer.watchAcceleration(win, fail.bind(null,done), {frequency:100});
+      });
+
+        it("accelerometer.spec.8 success callback Acceleration object should have (reasonable) values for x, y and z expressed in m/s^2", function(done) {
+          var reasonableThreshold = 15;
+          var win = function(a) {
+            expect(a.x).toBeLessThan(reasonableThreshold);
+            expect(a.x).toBeGreaterThan(reasonableThreshold * -1);
+            expect(a.y).toBeLessThan(reasonableThreshold);
+            expect(a.y).toBeGreaterThan(reasonableThreshold * -1);
+            expect(a.z).toBeLessThan(reasonableThreshold);
+            expect(a.z).toBeGreaterThan(reasonableThreshold * -1);
+            done();
+          };
+
+          id = navigator.accelerometer.watchAcceleration(win, fail.bind(null,done), {frequency:100});
+        });
+
+        it("accelerometer.spec.9 success callback Acceleration object should return a recent timestamp", function(done) {
+          var veryRecently = (new Date()).getTime();
+          // Need to check that dates returned are not vastly greater than a recent time stamp.
+          // In case the timestamps returned are ridiculously high
+          var reasonableTimeLimit = veryRecently + 5000; // 5 seconds from now
+          var win = function(a) {
+            expect(a.timestamp).toBeGreaterThan(veryRecently);
+            expect(a.timestamp).toBeLessThan(reasonableTimeLimit);
+            done();
+          };
+
+          id = navigator.accelerometer.watchAcceleration(win, fail.bind(null,done), {frequency:100});
+        });
+    });
+
+    describe("clearWatch", function() {
+      it("accelerometer.spec.10 should exist", function() {
+          expect(navigator.accelerometer.clearWatch).toBeDefined();
+          expect(typeof navigator.accelerometer.clearWatch == 'function').toBe(true);
+      });
+
+      it("accelerometer.spec.11 should clear an existing watch", function(done) {
+          var id;
+
+          // expect win to get called exactly once
+          var win = function(a) {
+            // clear watch on first call
+            navigator.accelerometer.clearWatch(id);
+            // if win isn't called again in 201 ms we assume success
+            var tid = setTimeout(function() {
+              expect(true).toBe(true);
+              done();
+            }, 101);
+            // if win is called again, clear the timeout and fail the test
+            win = function() {
+              clearTimeout(tid);
+              fail(done);
+            }
+          };
+
+          // wrap the success call in a closure since the value of win changes between calls
+          id = navigator.accelerometer.watchAcceleration(function() { win(); }, fail.bind(null, done), {frequency:100});
+      });
+    });
+  });
+};
