diff --git a/test/android/test.exec.js b/test/android/test.exec.js
index 0f0cd9e..7d5dd13 100644
--- a/test/android/test.exec.js
+++ b/test/android/test.exec.js
@@ -61,7 +61,7 @@
     }
 
     describe('exec', function () {
-        it('should process messages in order even when called recursively', function () {
+        it('Test#001 : should process messages in order even when called recursively', function () {
             var firstCallbackId = null;
             var callCount = 0;
             nativeApi.exec.andCallFake(function (secret, service, action, callbackId, argsJson) {
@@ -100,7 +100,7 @@
                 expect(winSpy3).toHaveBeenCalledWith('three');
             });
         });
-        it('should process messages asynchronously', function () {
+        it('Test#002 : should process messages asynchronously', function () {
             nativeApi.exec.andCallFake(function (secret, service, action, callbackId, argsJson) {
                 expect(secret).toBe(1234);
                 return createCallbackMessage(true, false, 1, callbackId, 'stwo');
@@ -139,63 +139,63 @@
             waitsFor(function () { return callbackSpy.wasCalled; }, 200);
         }
 
-        it('should handle payloads of false', function () {
+        it('Test#003 : should handle payloads of false', function () {
             var messages = createCallbackMessage(true, true, 1, 'id', 'f');
             performExecAndReturn(messages);
             runs(function () {
                 expect(callbackSpy).toHaveBeenCalledWith('id', true, 1, [false], true);
             });
         });
-        it('should handle payloads of true', function () {
+        it('Test#004 : should handle payloads of true', function () {
             var messages = createCallbackMessage(true, true, 1, 'id', 't');
             performExecAndReturn(messages);
             runs(function () {
                 expect(callbackSpy).toHaveBeenCalledWith('id', true, 1, [true], true);
             });
         });
-        it('should handle payloads of null', function () {
+        it('Test#005 : should handle payloads of null', function () {
             var messages = createCallbackMessage(true, true, 1, 'id', 'N');
             performExecAndReturn(messages);
             runs(function () {
                 expect(callbackSpy).toHaveBeenCalledWith('id', true, 1, [null], true);
             });
         });
-        it('should handle payloads of numbers', function () {
+        it('Test#006 : should handle payloads of numbers', function () {
             var messages = createCallbackMessage(true, true, 1, 'id', 'n-3.3');
             performExecAndReturn(messages);
             runs(function () {
                 expect(callbackSpy).toHaveBeenCalledWith('id', true, 1, [-3.3], true);
             });
         });
-        it('should handle payloads of strings', function () {
+        it('Test#007 : should handle payloads of strings', function () {
             var messages = createCallbackMessage(true, true, 1, 'id', 'sHello world');
             performExecAndReturn(messages);
             runs(function () {
                 expect(callbackSpy).toHaveBeenCalledWith('id', true, 1, ['Hello world'], true);
             });
         });
-        it('should handle payloads of JSON objects', function () {
+        it('Test#008 : should handle payloads of JSON objects', function () {
             var messages = createCallbackMessage(true, true, 1, 'id', '{"a":1}');
             performExecAndReturn(messages);
             runs(function () {
                 expect(callbackSpy).toHaveBeenCalledWith('id', true, 1, [{a: 1}], true);
             });
         });
-        it('should handle payloads of JSON arrays', function () {
+        it('Test#009 : should handle payloads of JSON arrays', function () {
             var messages = createCallbackMessage(true, true, 1, 'id', '[1]');
             performExecAndReturn(messages);
             runs(function () {
                 expect(callbackSpy).toHaveBeenCalledWith('id', true, 1, [[1]], true);
             });
         });
-        it('should handle other callback opts', function () {
+        it('Test#010 : should handle other callback opts', function () {
             var messages = createCallbackMessage(false, false, 3, 'id', 'sfoo');
             performExecAndReturn(messages);
             runs(function () {
                 expect(callbackSpy).toHaveBeenCalledWith('id', false, 3, ['foo'], false);
             });
         });
-        it('should handle multiple messages', function () {
+        it('Test#011 : should handle multiple messages', function () {
             var message1 = createCallbackMessage(false, false, 3, 'id', 'sfoo');
             var message2 = createCallbackMessage(true, true, 1, 'id', 'f');
             var messages = message1 + message2;
@@ -211,7 +211,7 @@
                 expect(callbackSpy).toHaveBeenCalledWith('id', true, 1, [false], true);
             });
         });
-        it('should poll for more messages when hitting an *', function () {
+        it('Test#012 : should poll for more messages when hitting an *', function () {
             var message1 = createCallbackMessage(false, false, 3, 'id', 'sfoo');
             var message2 = createCallbackMessage(true, true, 1, 'id', 'f');
             nativeApi.retrieveJsMessages.andCallFake(function () {
@@ -225,7 +225,7 @@
                 expect(callbackSpy).toHaveBeenCalledWith('id', true, 1, [false], true);
             });
         });
-        it('should call callbacks in order when one callback enqueues another.', function () {
+        it('Test#013 : should call callbacks in order when one callback enqueues another.', function () {
             var message1 = createCallbackMessage(false, false, 3, 'id', 'scall1');
             var message2 = createCallbackMessage(false, false, 3, 'id', 'scall2');
             var message3 = createCallbackMessage(false, false, 3, 'id', 'scall3');
diff --git a/test/ios/test.exec.js b/test/ios/test.exec.js
index ac18d86..984a1bf 100644
--- a/test/ios/test.exec.js
+++ b/test/ios/test.exec.js
@@ -52,7 +52,7 @@
     }
 
     describe('exec', function () {
-        it('should return "" from nativeFetchMessages work when nothing is pending.', function () {
+        it('Test#001 : should return "" from nativeFetchMessages work when nothing is pending.', function () {
             var execPayload = exec.nativeFetchMessages();
             expect(execPayload).toBe('');
         });
diff --git a/test/test.argscheck.js b/test/test.argscheck.js
index 441bd38..6d057c7 100644
--- a/test/test.argscheck.js
+++ b/test/test.argscheck.js
@@ -32,44 +32,44 @@
         argscheck.enableChecks = true;
     });
 
-    it('should not throw when given valid args', function () {
+    it('Test#001 : should not throw when given valid args', function () {
         var testFunc = createTestFunc(false);
         testFunc(0, {}, [], '', new Date(), testFunc, 1);
     });
-    it('should not throw when given valid optional args', function () {
+    it('Test#002 : should not throw when given valid optional args', function () {
         var testFunc = createTestFunc(true);
         testFunc(0, {}, [], '', new Date(), testFunc, '');
     });
-    it('should not throw when given missing optional args', function () {
+    it('Test#003 : should not throw when given missing optional args', function () {
         var testFunc = createTestFunc(true);
         testFunc();
     });
-    it('should not throw when given null optional args', function () {
+    it('Test#004 : should not throw when given null optional args', function () {
         var testFunc = createTestFunc(true);
         testFunc(null, null, null, null, null, null, null);
     });
-    it('should throw when given invalid number', function () {
+    it('Test#005 : should throw when given invalid number', function () {
         var testFunc = createTestFunc(true);
         expect(function () { testFunc('foo', null, null, null, null, null); }).toThrow('Wrong type for parameter "num" of testFunc: Expected Number, but got String.');
     });
-    it('should throw when given invalid object', function () {
+    it('Test#006 : should throw when given invalid object', function () {
         var testFunc = createTestFunc(true);
         // Do not allow arrays for objects since we're usually dealing with JSON when expecting objects.
         expect(function () { testFunc(null, [], null, null, null, null); }).toThrow('Wrong type for parameter "obj" of testFunc: Expected Object, but got Array.');
     });
-    it('should throw when given invalid array', function () {
+    it('Test#007 : should throw when given invalid array', function () {
         var testFunc = createTestFunc(true);
         expect(function () { testFunc(null, null, {}, null, null, null); }).toThrow('Wrong type for parameter "arr" of testFunc: Expected Array, but got Object.');
     });
-    it('should throw when given invalid string', function () {
+    it('Test#008 : should throw when given invalid string', function () {
         var testFunc = createTestFunc(true);
         expect(function () { testFunc(null, null, null, 5, null, null); }).toThrow('Wrong type for parameter "str" of testFunc: Expected String, but got Number.');
     });
-    it('should throw when given invalid date', function () {
+    it('Test#009 : should throw when given invalid date', function () {
         var testFunc = createTestFunc(true);
         expect(function () { testFunc(null, null, null, null, 233, null); }).toThrow('Wrong type for parameter "date" of testFunc: Expected Date, but got Number.');
     });
-    it('should throw when given invalid function', function () {
+    it('Test#010 : should throw when given invalid function', function () {
         var testFunc = createTestFunc(true);
         expect(function () { testFunc(null, null, null, null, null, new Date()); }).toThrow('Wrong type for parameter "func" of testFunc: Expected Function, but got Date.');
     });
diff --git a/test/test.builder.js b/test/test.builder.js
index 324e00d..174ed61 100644
--- a/test/test.builder.js
+++ b/test/test.builder.js
@@ -23,7 +23,7 @@
 
     var builder = require('cordova/builder');
 
-    it('includes the module into the target', function () {
+    it('Test#001 : includes the module into the target', function () {
 
         var target = {};
         var objects = {
@@ -37,7 +37,7 @@
         expect(target.foo).toBe(require('cordova/builder'));
     });
 
-    it('returns an empty object literal if no path', function () {
+    it('Test#002 : returns an empty object literal if no path', function () {
         var target = {};
         var objects = {cat: {}};
 
@@ -46,7 +46,7 @@
         expect(target.cat).toBeDefined();
     });
 
-    it('builds out the children', function () {
+    it('Test#003 : builds out the children', function () {
 
         var target = {};
         var objects = {
diff --git a/test/test.channel.js b/test/test.channel.js
index c50fcf1..09290d8 100644
--- a/test/test.channel.js
+++ b/test/test.channel.js
@@ -36,7 +36,7 @@
     });
 
     describe('subscribe method', function () {
-        it('should throw an exception if no arguments are provided', function () {
+        it('Test#001 : should throw an exception if no arguments are provided', function () {
             expect(function () {
                 multiChannel.subscribe();
             }).toThrow();
@@ -49,7 +49,7 @@
                 multiChannel.subscribe(undefined);
             }).toThrow();
         });
-        it('should accept a function or an EventListener object implementing the handleEvent interface', function () {
+        it('Test#002 : should accept a function or an EventListener object implementing the handleEvent interface', function () {
             expect(function () {
                 multiChannel.subscribe(function () {});
             }).not.toThrow();
@@ -62,7 +62,7 @@
                 multiChannel.subscribe({apply: function () {}, call: function () {}});
             }).toThrow();
         });
-        it('should not change number of handlers if no function is provided', function () {
+        it('Test#003 : should not change number of handlers if no function is provided', function () {
             var initialLength = multiChannel.numHandlers;
 
             try {
@@ -77,7 +77,7 @@
 
             expect(multiChannel.numHandlers).toEqual(initialLength);
         });
-        it('should not change number of handlers when subscribing same function multiple times', function () {
+        it('Test#004 : should not change number of handlers when subscribing same function multiple times', function () {
             var handler = function () {};
 
             multiChannel.subscribe(handler);
@@ -91,7 +91,7 @@
     });
 
     describe('unsubscribe method', function () {
-        it('should throw an exception if no arguments are provided', function () {
+        it('Test#005 : should throw an exception if no arguments are provided', function () {
             expect(function () {
                 multiChannel.unsubscribe();
             }).toThrow();
@@ -100,7 +100,7 @@
                 multiChannel.unsubscribe(null);
             }).toThrow();
         });
-        it('should accept a function or an EventListener object implementing the handleEvent interface', function () {
+        it('Test#006 : should accept a function or an EventListener object implementing the handleEvent interface', function () {
             expect(function () {
                 multiChannel.unsubscribe(function () {});
             }).not.toThrow();
@@ -113,12 +113,12 @@
                 multiChannel.unsubscribe({apply: function () {}, call: function () {}});
             }).toThrow();
         });
-        it('should not decrement numHandlers if unsubscribing something that does not exist', function () {
+        it('Test#007 : should not decrement numHandlers if unsubscribing something that does not exist', function () {
             multiChannel.subscribe(function () {});
             multiChannel.unsubscribe(function () {});
             expect(multiChannel.numHandlers).toEqual(1);
         });
-        it('should change the handlers length appropriately', function () {
+        it('Test#008 : should change the handlers length appropriately', function () {
             var firstHandler = function () {};
             var secondHandler = function () {};
             var thirdHandler = function () {};
@@ -136,7 +136,7 @@
 
             expect(multiChannel.numHandlers).toEqual(0);
         });
-        it('should not decrement handlers length more than once if unsubscribing a single handler', function () {
+        it('Test#009 : should not decrement handlers length more than once if unsubscribing a single handler', function () {
             var firstHandler = function () {};
             multiChannel.subscribe(firstHandler);
 
@@ -149,7 +149,7 @@
 
             expect(multiChannel.numHandlers).toEqual(0);
         });
-        it('should not unregister a function registered with a different handler', function () {
+        it('Test#010 : should not unregister a function registered with a different handler', function () {
             var cHandler = function () {};
             var c2Handler = function () {};
             var c2 = channel.create('jables');
@@ -168,7 +168,7 @@
     });
 
     function commonFireTests (multi) {
-        it('should fire all subscribed handlers', function () {
+        it('Test#011 : should fire all subscribed handlers', function () {
             var testChannel = multi ? multiChannel : stickyChannel;
             var handler = jasmine.createSpy();
             var anotherOne = jasmine.createSpy();
@@ -181,16 +181,15 @@
             expectCallCount(handler, 1);
             expectCallCount(anotherOne, 1);
         });
-        it('should pass params to handlers', function () {
+        it('Test#012 : should pass params to handlers', function () {
             var testChannel = multi ? multiChannel : stickyChannel;
             var handler = jasmine.createSpy();
 
             testChannel.subscribe(handler);
-
             testChannel.fire(1, 2, 3);
             expect(handler.argsForCall[0]).toEqual({0: 1, 1: 2, 2: 3});
         });
-        it('should not fire a handler that was unsubscribed', function () {
+        it('Test#013 : should not fire a handler that was unsubscribed', function () {
             var testChannel = multi ? multiChannel : stickyChannel;
             var handler = jasmine.createSpy();
             var anotherOne = jasmine.createSpy();
@@ -204,7 +203,7 @@
             expectCallCount(handler, 0);
             expectCallCount(anotherOne, 1);
         });
-        it('should not fire a handler more than once if it was subscribed more than once', function () {
+        it('Test#014 : should not fire a handler more than once if it was subscribed more than once', function () {
             var testChannel = multi ? multiChannel : stickyChannel;
             var handler = jasmine.createSpy();
 
@@ -216,7 +215,7 @@
 
             expectCallCount(handler, 1);
         });
-        it('handler should be called when subscribed, removed, and subscribed again', function () {
+        it('Test#15 : handler should be called when subscribed, removed, and subscribed again', function () {
             var testChannel = multi ? multiChannel : stickyChannel;
             var handler = jasmine.createSpy();
 
@@ -228,7 +227,7 @@
 
             expectCallCount(handler, 1);
         });
-        it('should not prevent a callback from firing when it is removed during firing.', function () {
+        it('Test#016 : should not prevent a callback from firing when it is removed during firing.', function () {
             var testChannel = multi ? multiChannel : stickyChannel;
             var handler = jasmine.createSpy().andCallFake(function () { testChannel.unsubscribe(handler2); });
             var handler2 = jasmine.createSpy();
@@ -241,7 +240,7 @@
     }
     describe('fire method for sticky channels', function () {
         commonFireTests(false);
-        it('should instantly trigger the callback if the event has already been fired', function () {
+        it('Test#017 : should instantly trigger the callback if the event has already been fired', function () {
             var before = jasmine.createSpy('before');
             var after = jasmine.createSpy('after');
 
@@ -253,7 +252,7 @@
             expectCallCount(after, 1);
             expect(after.argsForCall[0]).toEqual({0: 1, 1: 2, 2: 3});
         });
-        it('should instantly trigger the callback if the event is currently being fired.', function () {
+        it('Test#018 : should instantly trigger the callback if the event is currently being fired.', function () {
             var handler1 = jasmine.createSpy().andCallFake(function () { stickyChannel.subscribe(handler2); });
             var handler2 = jasmine.createSpy().andCallFake(function (arg1) { expect(arg1).toEqual('foo'); });
 
@@ -262,7 +261,7 @@
 
             expectCallCount(handler2, 1);
         });
-        it('should unregister all handlers after being fired.', function () {
+        it('Test#019 : should unregister all handlers after being fired.', function () {
             var handler = jasmine.createSpy();
             stickyChannel.subscribe(handler);
             stickyChannel.fire();
@@ -272,7 +271,7 @@
     });
     describe('fire method for multi channels', function () {
         commonFireTests(true);
-        it('should not trigger the callback if the event has already been fired', function () {
+        it('Test#020 : should not trigger the callback if the event has already been fired', function () {
             var before = jasmine.createSpy('before');
             var after = jasmine.createSpy('after');
 
@@ -283,7 +282,7 @@
             expectCallCount(before, 1);
             expectCallCount(after, 0);
         });
-        it('should not trigger the callback if the event is currently being fired.', function () {
+        it('Test#021 : should not trigger the callback if the event is currently being fired.', function () {
             var handler1 = jasmine.createSpy().andCallFake(function () { multiChannel.subscribe(handler2); });
             var handler2 = jasmine.createSpy();
 
@@ -294,7 +293,7 @@
             expectCallCount(handler1, 2);
             expectCallCount(handler2, 1);
         });
-        it('should not unregister handlers after being fired.', function () {
+        it('Test#022 : should not unregister handlers after being fired.', function () {
             var handler = jasmine.createSpy();
             multiChannel.subscribe(handler);
             multiChannel.fire();
@@ -303,7 +302,7 @@
         });
     });
     describe('channel.join()', function () {
-        it('should be called when all functions start unfired', function () {
+        it('Test#023 : should be called when all functions start unfired', function () {
             var handler = jasmine.createSpy();
             var stickyChannel2 = channel.createSticky('stickyChannel');
             channel.join(handler, [stickyChannel, stickyChannel2]);
@@ -313,7 +312,7 @@
             stickyChannel2.fire();
             expectCallCount(handler, 1);
         });
-        it('should be called when one functions start fired', function () {
+        it('Test#024 : should be called when one functions start fired', function () {
             var handler = jasmine.createSpy();
             var stickyChannel2 = channel.createSticky('stickyChannel');
             stickyChannel.fire();
@@ -322,7 +321,7 @@
             stickyChannel2.fire();
             expectCallCount(handler, 1);
         });
-        it('should be called when all functions start fired', function () {
+        it('Test#025 : should be called when all functions start fired', function () {
             var handler = jasmine.createSpy();
             var stickyChannel2 = channel.createSticky('stickyChannel');
             stickyChannel.fire();
@@ -330,7 +329,7 @@
             channel.join(handler, [stickyChannel, stickyChannel2]);
             expectCallCount(handler, 1);
         });
-        it('should throw if a channel is not sticky', function () {
+        it('Test#026 : should throw if a channel is not sticky', function () {
             expect(function () {
                 channel.join(function () {}, [stickyChannel, multiChannel]);
             }).toThrow();
diff --git a/test/test.modulemapper.js b/test/test.modulemapper.js
index 8e6eb4c..8d86707 100644
--- a/test/test.modulemapper.js
+++ b/test/test.modulemapper.js
@@ -41,10 +41,10 @@
         modulemapper.reset();
     });
 
-    it('should throw in module does not exist', function () {
+    it('Test#001 : should throw in module does not exist', function () {
         expect(function () { modulemapper.clobbers('cordova/invalid', 'newProp'); }).toThrow();
     });
-    it('should properly set a new top-level property', function () {
+    it('Test#002 : should properly set a new top-level property', function () {
         modulemapper.clobbers('cordova/test/testmodule', 'newProp1');
         modulemapper.defaults('cordova/test/testmodule', 'newProp2');
         modulemapper.merges('cordova/test/testmodule', 'newProp3');
@@ -53,7 +53,7 @@
         expect(context.newProp2).toBe(testmodule);
         expect(context.newProp3).toBe(testmodule);
     });
-    it('should properly set a new non-top-level property', function () {
+    it('Test#003 : should properly set a new non-top-level property', function () {
         modulemapper.clobbers('cordova/test/testmodule', 'foo1.newProp');
         modulemapper.defaults('cordova/test/testmodule', 'foo2.newProp');
         modulemapper.merges('cordova/test/testmodule', 'foo3.newProp');
@@ -62,7 +62,7 @@
         expect(context.foo2.newProp).toBe(testmodule);
         expect(context.foo3.newProp).toBe(testmodule);
     });
-    it('should properly set a new non-top-level property #2', function () {
+    it('Test#004 : should properly set a new non-top-level property #2', function () {
         modulemapper.clobbers('cordova/test/testmodule', 'foo1.bar.newProp');
         modulemapper.defaults('cordova/test/testmodule', 'foo2.bar.newProp');
         modulemapper.merges('cordova/test/testmodule', 'foo3.bar.newProp');
@@ -71,7 +71,7 @@
         expect(context.foo2.bar.newProp).toBe(testmodule);
         expect(context.foo3.bar.newProp).toBe(testmodule);
     });
-    it('should properly set a non-new non-top-level property', function () {
+    it('Test#005 : should properly set a non-new non-top-level property', function () {
         modulemapper.clobbers('cordova/test/testmodule', 'obj.newProp1');
         modulemapper.defaults('cordova/test/testmodule', 'obj.newProp2');
         modulemapper.merges('cordova/test/testmodule', 'obj.newProp3');
@@ -80,7 +80,7 @@
         expect(context.obj.newProp2).toBe(testmodule);
         expect(context.obj.newProp3).toBe(testmodule);
     });
-    it('should clobber existing properties', function () {
+    it('Test#006 : should clobber existing properties', function () {
         modulemapper.clobbers('cordova/test/testmodule', 'num');
         modulemapper.clobbers('cordova/test/testmodule', 'obj.str');
         modulemapper.clobbers('cordova/test/testmodule', 'getme');
@@ -91,7 +91,7 @@
         expect(context.getme).toBe(testmodule);
         expect(context.TestClass).toBe(testmodule);
     });
-    it('should not clobber existing properties when using defaults', function () {
+    it('Test#007 : should not clobber existing properties when using defaults', function () {
         modulemapper.defaults('cordova/test/testmodule', 'num');
         modulemapper.defaults('cordova/test/testmodule', 'obj.str');
         modulemapper.defaults('cordova/test/testmodule', 'obj.getme');
@@ -102,13 +102,13 @@
         expect(context.getme).not.toBe(testmodule);
         expect(context.TestClass).not.toBe(testmodule);
     });
-    it('should throw when namespace is a non-object', function () {
+    it('Test#008 : should throw when namespace is a non-object', function () {
         expect(function () {
             modulemapper.merges('cordova/test/testmodule', 'num');
             modulemapper.mapModules(context);
         }).toThrow();
     });
-    it('should merge into objects', function () {
+    it('Test#009 : should merge into objects', function () {
         modulemapper.merges('cordova/test/testmodule', 'obj');
         modulemapper.mapModules(context);
         for (var k in testmodule) {
@@ -120,20 +120,20 @@
         expect(context.obj.subObj.num).toBe(9);
         expect(context.obj.subObj.str).toBe(testmodule.subObj.str);
     });
-    it('should merge into constructor prototypes', function () {
+    it('Test#010 : should merge into constructor prototypes', function () {
         modulemapper.merges('cordova/test/testmodule', 'TestClass');
         modulemapper.mapModules(context);
         for (var k in testmodule) {
             expect(context.TestClass.prototype[k]).toBe(testmodule[k]);
         }
     });
-    it('should maintain order of calls', function () {
+    it('Test#011 : should maintain order of calls', function () {
         modulemapper.merges('cordova/test/testmodule', 'obj');
         modulemapper.clobbers('cordova/test/testmodule', 'obj');
         modulemapper.mapModules(context);
         expect(context.obj).toBe(testmodule);
     });
-    it('should maintain order of calls2', function () {
+    it('Test#012 : should maintain order of calls2', function () {
         modulemapper.merges('cordova/test/testmodule', 'obj.foo');
         modulemapper.clobbers('cordova/test/testmodule', 'obj');
         modulemapper.merges('cordova/test/testmodule', 'obj.obj');
@@ -143,30 +143,30 @@
         expect(context.obj).not.toBe(testmodule.obj);
         expect(context.obj.obj).toBe(testmodule.obj);
     });
-    it('should return undefined for getOriginalSymbol("unknown")', function () {
+    it('Test#013 : should return undefined for getOriginalSymbol("unknown")', function () {
         expect(modulemapper.getOriginalSymbol(context, 'blah')).toBeUndefined();
         modulemapper.mapModules(context);
         expect(modulemapper.getOriginalSymbol(context, 'obj.foo.bar')).toBeUndefined('obj.foo.bar');
     });
-    it('should remember original symbols when clobbering', function () {
+    it('Test#014 : should remember original symbols when clobbering', function () {
         var orig = context.obj;
         modulemapper.clobbers('cordova/test/testmodule', 'obj');
         modulemapper.mapModules(context);
         expect(modulemapper.getOriginalSymbol(context, 'obj')).toBe(orig);
     });
-    it('should remember original symbols when double clobbering', function () {
+    it('Test#015 : should remember original symbols when double clobbering', function () {
         var orig = context.obj;
         modulemapper.clobbers('cordova/test/testmodule', 'obj');
         modulemapper.clobbers('cordova/test/testmodule', 'obj');
         modulemapper.mapModules(context);
         expect(modulemapper.getOriginalSymbol(context, 'obj')).toBe(orig);
     });
-    it('should return original symbols when symbol was not clobbered', function () {
+    it('Test#016 : should return original symbols when symbol was not clobbered', function () {
         modulemapper.mapModules(context);
         expect(modulemapper.getOriginalSymbol(context, 'obj')).toBe(context.obj);
         expect(modulemapper.getOriginalSymbol(context, 'obj.str')).toBe(context.obj.str);
     });
-    it('should log about deprecated property access', function () {
+    it('Test#017 : should log about deprecated property access', function () {
         var origConsoleLog = console.log;
         console.log = jasmine.createSpy('console.log');
         this.after(function () {
diff --git a/test/test.pluginloader.js b/test/test.pluginloader.js
index 283f3b2..abca2d1 100644
--- a/test/test.pluginloader.js
+++ b/test/test.pluginloader.js
@@ -50,7 +50,7 @@
         done = true;
     }
 
-    it('should inject cordova_plugins.js when it is not already there', function () {
+    it('Test#001 : should inject cordova_plugins.js when it is not already there', function () {
         injectScript.andCallFake(function (url, onload, onerror) {
             // jsdom deficiencies:
             if (typeof location !== 'undefined') {
@@ -73,7 +73,7 @@
         });
     });
 
-    it('should not inject cordova_plugins.js when it is already there', function () {
+    it('Test#002 : should not inject cordova_plugins.js when it is already there', function () {
         define('cordova/plugin_list', function (require, exports, module) {
             module.exports = [];
         });
@@ -83,7 +83,8 @@
             expect(injectScript).not.toHaveBeenCalled();
         });
     });
-    it('should inject plugin scripts when they are not already there', function () {
+
+    it('Test#003 : should inject plugin scripts when they are not already there', function () {
         define('cordova/plugin_list', function (require, exports, module) {
             module.exports = [
                 { 'file': 'some/path.js', 'id': 'some.id' }
@@ -108,7 +109,7 @@
         });
     });
 
-    it('should not inject plugin scripts when they are already there', function () {
+    it('Test#004 : should not inject plugin scripts when they are already there', function () {
         define('cordova/plugin_list', function (require, exports, module) {
             module.exports = [
                 { 'file': 'some/path.js', 'id': 'some.id' }
diff --git a/test/test.require.js b/test/test.require.js
index 7bde4a4..9ad8c18 100644
--- a/test/test.require.js
+++ b/test/test.require.js
@@ -27,22 +27,22 @@
     });
 
     describe('when defining', function () {
-        it('can define and remove module', function () {
+        it('Test#001 : can define and remove module', function () {
             define('a', jasmine.createSpy());
             define.remove('a');
         });
 
-        it("can remove a module that doesn't exist", function () {
+        it("Test#002 : can remove a module that doesn't exist", function () {
             define.remove("can't touch this");
         });
 
-        it('throws an error the module already exists', function () {
+        it('Test#003 : throws an error the module already exists', function () {
             expect(function () {
                 define('cordova', function () {});
             }).toThrow('module cordova already defined');
         });
 
-        it("doesn't call the factory method when defining", function () {
+        it("Test#004 : doesn't call the factory method when defining", function () {
             var factory = jasmine.createSpy();
             define('ff', factory);
             expect(factory).not.toHaveBeenCalled();
@@ -50,13 +50,13 @@
     });
 
     describe('when requiring', function () {
-        it("throws an exception when module doesn't exist", function () {
+        it("Test#005 : throws an exception when module doesn't exist", function () {
             expect(function () {
                 require('your mom');
             }).toThrow('module your mom not found');
         });
 
-        it('throws an exception when modules depend on each other', function () {
+        it('Test#006 : throws an exception when modules depend on each other', function () {
             define('ModuleA', function (require, exports, module) {
                 require('ModuleB');
             });
@@ -70,7 +70,7 @@
             define.remove('ModuleB');
         });
 
-        it('throws an exception when a cycle of requires occurs', function () {
+        it('Test#007 : throws an exception when a cycle of requires occurs', function () {
             define('ModuleA', function (require, exports, module) {
                 require('ModuleB');
             });
@@ -88,7 +88,7 @@
             define.remove('ModuleC');
         });
 
-        it('calls the factory method when requiring', function () {
+        it('Test#008 : calls the factory method when requiring', function () {
             var factory = jasmine.createSpy();
             define('dino', factory);
             require('dino');
@@ -102,7 +102,7 @@
             define.remove('dino');
         });
 
-        it('returns the exports object', function () {
+        it('Test#009 : returns the exports object', function () {
             define('a', function (require, exports, module) {
                 exports.stuff = 'asdf';
             });
@@ -112,7 +112,7 @@
             define.remove('a');
         });
 
-        it('can use both the exports and module.exports object', function () {
+        it('Test#010 : can use both the exports and module.exports object', function () {
             define('a', function (require, exports, module) {
                 exports.a = 'a';
                 module.exports.b = 'b';
@@ -124,7 +124,7 @@
             define.remove('a');
         });
 
-        it('returns was is assigned to module.exports', function () {
+        it('Test#011 : returns was is assigned to module.exports', function () {
             var Foo = function () { };
             define('a', function (require, exports, module) {
                 module.exports = new Foo();
@@ -135,7 +135,7 @@
             define.remove('a');
         });
 
-        it('has the id and exports values but not the factory on the module object', function () {
+        it('Test#012 : has the id and exports values but not the factory on the module object', function () {
             var factory = function (require, exports, module) {
                 expect(module.id).toBe('a');
                 expect(module.exports).toBeDefined();
diff --git a/test/test.urlutil.js b/test/test.urlutil.js
index 4d18aab..d21ad4c 100644
--- a/test/test.urlutil.js
+++ b/test/test.urlutil.js
@@ -26,7 +26,7 @@
         return;
     }
 
-    it('can handle absolute URLs', function () {
+    it('Test#001 : can handle absolute URLs', function () {
         expect(urlutil.makeAbsolute('http://www.foo.com')).toBe('http://www.foo.com/');
         expect(urlutil.makeAbsolute('http://www.foo.com?foo#bar')).toBe('http://www.foo.com/?foo#bar');
         expect(urlutil.makeAbsolute('http://www.foo.com/%20hi')).toBe('http://www.foo.com/%20hi');
@@ -38,17 +38,17 @@
         expect(urlutil.makeAbsolute('/foo?a#b')).toBe(rootUrl + 'foo?a#b');
         expect(urlutil.makeAbsolute('/foo/b%20ar')).toBe(rootUrl + 'foo/b%20ar');
     }
-    it('can handle root-relative URLs', function () {
+    it('Test#002 : can handle root-relative URLs', function () {
         testRootRelative(window.location.href);
     });
 
-    it('can handle relative URLs', function () {
+    it('Test#003 : can handle relative URLs', function () {
         var rootUrl = window.location.href.replace(/[?#].*/, '').replace(/[^\/]*$/, ''); // eslint-disable-line no-useless-escape
         expect(urlutil.makeAbsolute('foo?a#b')).toBe(rootUrl + 'foo?a#b');
         expect(urlutil.makeAbsolute('foo/b%20ar')).toBe(rootUrl + 'foo/b%20ar');
     });
 
-    it('can handle relative URLs with base tags', function () {
+    it('Test#004 : can handle relative URLs with base tags', function () {
         var rootUrl = 'http://base.com/esab/';
         var baseTag = document.createElement('base');
         baseTag.href = rootUrl;
@@ -61,7 +61,7 @@
         testRootRelative(rootUrl);
     });
 
-    it('can handle scheme-relative URLs', function () {
+    it('Test#005 : can handle scheme-relative URLs', function () {
         var rootUrl = window.location.href.replace(/:.*/, '');
         expect(urlutil.makeAbsolute('//www.foo.com/baz%20?foo#bar')).toBe(rootUrl + '://www.foo.com/baz%20?foo#bar');
     });
diff --git a/test/test.utils.js b/test/test.utils.js
index abf2a9b..1b5e751 100644
--- a/test/test.utils.js
+++ b/test/test.utils.js
@@ -23,16 +23,16 @@
     var utils = require('cordova/utils');
 
     describe('utils.arrayIndexOf', function () {
-        it('should return -1 when not found', function () {
+        it('Test#001 : should return -1 when not found', function () {
             expect(utils.arrayIndexOf([1, 2, 3], 4)).toBe(-1);
         });
-        it('should return 0 for first item', function () {
+        it('Test#002 : should return 0 for first item', function () {
             expect(utils.arrayIndexOf([1, 2, 3], 1)).toBe(0);
         });
-        it('should return 2 for last item', function () {
+        it('Test#003 : should return 2 for last item', function () {
             expect(utils.arrayIndexOf([1, 2, 3], 3)).toBe(2);
         });
-        it('should return index of first occurance', function () {
+        it('Test#004 : should return index of first occurance', function () {
             expect(utils.arrayIndexOf([1, 2, 1], 1)).toBe(0);
         });
     });
@@ -43,12 +43,12 @@
             expect(utils.arrayRemove(a, 2)).toBe(true);
             expect(a).toEqual([1, 3]);
         });
-        it('should return false when item was not there.', function () {
+        it('Test#006 : should return false when item was not there.', function () {
             var a = [1, 2, 3];
             expect(utils.arrayRemove(a, 4)).toBe(false);
             expect(a).toEqual([1, 2, 3]);
         });
-        it('should remove only first occurance', function () {
+        it('Test#007 : should remove only first occurance', function () {
             var a = [1, 2, 1];
             expect(utils.arrayRemove(a, 1)).toBe(true);
             expect(a).toEqual([2, 1]);
@@ -56,66 +56,66 @@
     });
 
     describe('isArray', function () {
-        it('should return true for [].', function () {
+        it('Test#008 : should return true for [].', function () {
             var isArray = utils.isArray([]);
             expect(isArray).toBe(true);
         });
-        it('should return true for new Array().', function () {
+        it('Test#009 : should return true for new Array().', function () {
             var isArray = utils.isArray(new Array()); // eslint-disable-line no-array-constructor
             expect(isArray).toBe(true);
         });
-        it('should return false for {}.', function () {
+        it('Test#010 : should return false for {}.', function () {
             var isArray = utils.isArray({});
             expect(isArray).toBe(false);
         });
     });
 
     describe('isDate', function () {
-        it('should return true for new Date().', function () {
+        it('Test#011 : should return true for new Date().', function () {
             var isDate = utils.isDate(new Date());
             expect(isDate).toBe(true);
         });
-        it('should return false for {}.', function () {
+        it('Test#012 : should return false for {}.', function () {
             var isDate = utils.isDate({});
             expect(isDate).toBe(false);
         });
     });
 
     describe('when cloning', function () {
-        it('can clone an array', function () {
+        it('Test#013 : can clone an array', function () {
             var orig = [1, 2, 3, {four: 4}, '5'];
 
             expect(utils.clone(orig)).toEqual(orig);
             expect(utils.clone(orig)).not.toBe(orig);
         });
 
-        it('can clone null', function () {
+        it('Test#014 : can clone null', function () {
             expect(utils.clone(null)).toBeNull();
         });
 
-        it('can clone undefined', function () {
+        it('Test#015 : can clone undefined', function () {
             expect(utils.clone(undefined)).not.toBeDefined();
         });
 
-        it('can clone a function', function () {
+        it('Test#016 : can clone a function', function () {
             var f = function () { return 4; };
             expect(utils.clone(f)).toBe(f);
         });
 
-        it('can clone a number', function () {
+        it('Test#017 : can clone a number', function () {
             expect(utils.clone(4)).toBe(4);
         });
 
-        it('can clone a string', function () {
+        it('Test#018 : can clone a string', function () {
             expect(utils.clone('why')).toBe('why');
         });
 
-        it('can clone a date', function () {
+        it('Test#19 : can clone a date', function () {
             var d = Date.now();
             expect(utils.clone(d)).toBe(d);
         });
 
-        it('can clone an object', function () {
+        it('Test#020 : can clone an object', function () {
 
             var orig = {
                 a: {
@@ -141,33 +141,33 @@
     });
 
     describe('when closing around a function', function () {
-        it('calls the original function when calling the closed function', function () {
+        it('Test#021 : calls the original function when calling the closed function', function () {
             var f = jasmine.createSpy();
             utils.close(null, f)();
             expect(f).toHaveBeenCalled();
         });
 
-        it('uses the correct context for the closed function', function () {
+        it('Test#022 : uses the correct context for the closed function', function () {
             var context = {};
             utils.close(context, function () {
                 expect(this).toBe(context);
             })();
         });
 
-        it('passes the arguments to the closed function', function () {
+        it('Test#023 : passes the arguments to the closed function', function () {
             utils.close(null, function (arg) {
                 expect(arg).toBe(1);
             })(1);
         });
 
-        it('overrides the arguments when provided', function () {
+        it('Test#024 : overrides the arguments when provided', function () {
             utils.close(null, function (arg) {
                 expect(arg).toBe(42);
             }, [42])(16);
         });
     });
 
-    it('can create a uuid', function () {
+    it('Test#025 : can create a uuid', function () {
         var uuid = utils.createUUID();
         expect(uuid).toMatch(/^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$/);
         expect(uuid).not.toEqual(utils.createUUID());
