diff --git a/tests/tests.js b/tests/tests.js
index a827986..855403d 100644
--- a/tests/tests.js
+++ b/tests/tests.js
@@ -24,6 +24,78 @@
 
 window.alert = window.alert || navigator.notification.alert;
 
+exports.defineAutoTests = function () {
+
+    describe('cordova.InAppBrowser', function () {
+
+        it("inappbrowser.spec.1 should exist", function () {
+            expect(cordova.InAppBrowser).toBeDefined();
+        });
+
+        it("inappbrowser.spec.2 should contain open function", function () {
+            expect(cordova.InAppBrowser.open).toBeDefined();
+            expect(typeof cordova.InAppBrowser.open === 'function').toBe(true);
+        });
+    });
+
+    describe('open method', function () {
+
+        var iabInsance;
+        var originalTimeout;
+        var url = 'http://apache.org/';
+
+        beforeEach(function () {
+            // increase timeout to ensure test url could be loaded within test time
+            originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
+            jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
+
+            iabInsance = null;
+        });
+
+        afterEach(function () {
+            // restore original timeout
+            jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
+
+            if (iabInsance && iabInsance.close) {
+                iabInsance.close();
+            }
+            iabInsance = null;
+        });
+
+        function verifyEvent(evt, type) {
+            expect(evt).toBeDefined();
+            expect(evt.type).toEqual(type);
+            expect(evt.url).toEqual(url);
+        }
+
+        it("inappbrowser.spec.3 should retun InAppBrowser class instance", function () {
+            iabInsance = cordova.InAppBrowser.open(url, '_blank');
+
+            expect(iabInsance).toBeDefined();
+
+            expect(iabInsance.addEventListener).toBeDefined();
+            expect(typeof iabInsance.addEventListener === 'function').toBe(true);
+            expect(iabInsance.close).toBeDefined();
+            expect(typeof iabInsance.close === 'function').toBe(true);
+
+        });
+
+        it("inappbrowser.spec.4 should support loadstart and loadstop events", function (done) {
+            var onLoadStart = jasmine.createSpy('loadstart event callback').and.callFake(function (evt) {
+                verifyEvent(evt, 'loadstart');
+            });
+
+            iabInsance = cordova.InAppBrowser.open(url, '_blank');
+            iabInsance.addEventListener('loadstart', onLoadStart);
+            iabInsance.addEventListener('loadstop', function (evt) {
+                verifyEvent(evt, 'loadstop');
+                expect(onLoadStart).toHaveBeenCalled();
+                done();
+            });
+        });
+    });
+};
+
 exports.defineManualTests = function (contentEl, createActionButton) {
 
     function doOpen(url, target, params, numExpectedRedirects, useWindowOpen) {
