diff --git a/.gitignore b/.gitignore
index 5a5baf3..198f042 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,8 @@
 node_modules/.bin
 node_modules/istanbul/
 node_modules/jasmine-node/
+node_modules/jasmine/
+node_modules/jasmine-core/
 node_modules/jshint/
 node_modules/rewire/
 node_modules/align-text/
diff --git a/package.json b/package.json
index 040d73e..e73937c 100644
--- a/package.json
+++ b/package.json
@@ -15,9 +15,9 @@
   ],
   "scripts": {
     "test": "npm run jshint && npm run test-unit && npm run test-e2e",
-    "test-unit": "jasmine-node --captureExceptions spec/unit",
-    "test-e2e": "jasmine-node --captureExceptions spec/e2e",
-    "cover": "istanbul cover --root template --print detail node_modules/jasmine-node/bin/jasmine-node -- spec/unit",
+    "test-unit": "jasmine --captureExceptions ",
+    "test-e2e": "jasmine --captureExceptions spec/e2e/endtoend.spec.js",
+    "cover": "istanbul cover --root bin/templates/cordova --print detail jasmine",
     "jshint": "jshint bin && jshint template && jshint spec"
   },
   "dependencies": {
@@ -32,7 +32,7 @@
   },
   "devDependencies": {
     "istanbul": "^0.4.0",
-    "jasmine-node": "1.14.5",
+    "jasmine": "^2.5.3",
     "jshint": "^2.8.0",
     "rewire": "^2.5.1"
   },
diff --git a/spec/e2e/endtoend.spec.js b/spec/e2e/endtoend.spec.js
index 71ed278..52f1cfa 100644
--- a/spec/e2e/endtoend.spec.js
+++ b/spec/e2e/endtoend.spec.js
@@ -91,7 +91,7 @@
         api.locations.www = path.join(projectFolder, 'www');
 
         var fail = jasmine.createSpy('fail')
-        .andCallFake(function (err) {
+        .and.callFake(function (err) {
             console.error(err);
         });
 
diff --git a/spec/support/jasmine.json b/spec/support/jasmine.json
new file mode 100644
index 0000000..f683549
--- /dev/null
+++ b/spec/support/jasmine.json
@@ -0,0 +1,8 @@
+{
+    "spec_dir": "spec",
+    "spec_files": [
+        "../spec/unit/**/*[sS]pec.js"
+    ],
+    "stopSpecOnExpectationFailure": false,
+    "random": false
+}
diff --git a/spec/unit/AppxManifest.spec.js b/spec/unit/AppxManifest.spec.js
index 65f9092..ab5f992 100644
--- a/spec/unit/AppxManifest.spec.js
+++ b/spec/unit/AppxManifest.spec.js
@@ -38,7 +38,7 @@
 
     beforeEach(function () {
         var parseElementtreeSyncOrig = xml.parseElementtreeSync;
-        spyOn(xml, 'parseElementtreeSync').andCallFake(function (manifestPath) {
+        spyOn(xml, 'parseElementtreeSync').and.callFake(function (manifestPath) {
             return XMLS[manifestPath] || parseElementtreeSyncOrig(manifestPath);
         });
 
@@ -47,21 +47,21 @@
 
     describe('constructor', function () {
 
-        it('should create a new AppxManifest instance', function () {
+        it('Test #000 : should create a new AppxManifest instance', function () {
             var manifest;
             expect(function () { manifest = new AppxManifest(WINDOWS_MANIFEST); }).not.toThrow();
             expect(manifest instanceof AppxManifest).toBe(true);
         });
 
-        it('should throw if first parameter is not a file', function () {
+        it('Test #001 : should throw if first parameter is not a file', function () {
             expect(function () { new AppxManifest('/invalid/path'); }).toThrow();
         });
 
-        it('should throw if first parameter is not a valid manifest file (no "Package" tag)', function () {
+        it('Test #002 : should throw if first parameter is not a valid manifest file (no "Package" tag)', function () {
             expect(function () { new AppxManifest('/invalid/manifest'); }).toThrow();
         });
 
-        it('should add ":" to manifest prefix if needed', function () {
+        it('Test #003 : should add ":" to manifest prefix if needed', function () {
             expect(new AppxManifest(WINDOWS_MANIFEST, 'prefix').prefix).toEqual('prefix:');
         });
     });
@@ -71,20 +71,20 @@
             AppxManifest.__set__('manifestCache', { a: 'foo/a', b: 'foo/b', c: 'foo/c' });
         });
 
-        it('should remove all entries when no parameter is specified', function () {
+        it('Test #004 : should remove all entries when no parameter is specified', function () {
             AppxManifest.purgeCache();
             var cache = AppxManifest.__get__('manifestCache');
             expect(Object.keys(cache).length).toBe(0);
         });
 
-        it('should remove an entry when parameter is a string key', function () {
+        it('Test #005 : should remove an entry when parameter is a string key', function () {
             AppxManifest.purgeCache('a');
             var cache = AppxManifest.__get__('manifestCache');
             expect(Object.keys(cache).length).toBe(2);
             expect(cache.a).not.toBeDefined();
         });
 
-        it('should remove multiple entries when parameter is an array of keys', function () {
+        it('Test #006 : should remove multiple entries when parameter is an array of keys', function () {
             AppxManifest.purgeCache(['a', 'b']);
             var cache = AppxManifest.__get__('manifestCache');
             expect(Object.keys(cache).length).toBe(1);
@@ -92,7 +92,7 @@
             expect(cache.b).not.toBeDefined();
         });
 
-        it('should not remove anything if there is no such key', function () {
+        it('Test #007 : should not remove anything if there is no such key', function () {
             AppxManifest.purgeCache(['bar']);
             var cache = AppxManifest.__get__('manifestCache');
             expect(Object.keys(cache).length).toBe(3);
@@ -104,16 +104,16 @@
 
     describe('static get() method', function () {
 
-        it('should return an AppxManifest instance', function () {
+        it('Test #008 : should return an AppxManifest instance', function () {
             expect(AppxManifest.get(WINDOWS_MANIFEST) instanceof AppxManifest).toBe(true);
         });
 
-        it('should detect manifest prefix based on "Package" element attributes', function () {
+        it('Test #009 : should detect manifest prefix based on "Package" element attributes', function () {
             expect(AppxManifest.get(WINDOWS_MANIFEST).prefix).toEqual('m2:');
             expect(AppxManifest.get(WINDOWS_PHONE_MANIFEST).prefix).toEqual('m3:');
         });
 
-        it('should instantiate either AppxManifest or Windows 10 AppxManifest based on manifest prefix', function () {
+        it('Test #010 : should instantiate either AppxManifest or Windows 10 AppxManifest based on manifest prefix', function () {
             expect(AppxManifest.get('/no/prefixed').prefix).toEqual('');
             expect(AppxManifest.get('/no/prefixed') instanceof AppxManifest).toBe(true);
             expect(AppxManifest.get('/no/prefixed') instanceof Win10AppxManifest).toBe(false);
@@ -122,32 +122,32 @@
             expect(AppxManifest.get('/uap/prefixed') instanceof Win10AppxManifest).toBe(true);
         });
 
-        it('should cache AppxManifest instances by default', function () {
+        it('Test #011 : should cache AppxManifest instances by default', function () {
             var manifest  = AppxManifest.get('/no/prefixed');
-            expect(xml.parseElementtreeSync.calls.length).toBe(2);
+            expect(xml.parseElementtreeSync.calls.count()).toBe(2);
 
             var manifest2 = AppxManifest.get('/no/prefixed');
-            expect(xml.parseElementtreeSync.calls.length).toBe(2);
+            expect(xml.parseElementtreeSync.calls.count()).toBe(2);
 
             expect(manifest).toBe(manifest2);
         });
 
-        it('should not use cache to get AppxManifest instances when "ignoreCache" is specified', function () {
+        it('Test #012 : should not use cache to get AppxManifest instances when "ignoreCache" is specified', function () {
             var manifest  = AppxManifest.get('/no/prefixed');
-            expect(xml.parseElementtreeSync.calls.length).toBe(2);
+            expect(xml.parseElementtreeSync.calls.count()).toBe(2);
 
             var manifest2 = AppxManifest.get('/no/prefixed', true);
-            expect(xml.parseElementtreeSync.calls.length).toBe(4);
+            expect(xml.parseElementtreeSync.calls.count()).toBe(4);
 
             expect(manifest).not.toBe(manifest2);
         });
 
-        it('should not cache AppxManifest instances when "ignoreCache" is specified', function () {
+        it('Test #013 : should not cache AppxManifest instances when "ignoreCache" is specified', function () {
             var manifest  = AppxManifest.get('/no/prefixed', true);
-            expect(xml.parseElementtreeSync.calls.length).toBe(2);
+            expect(xml.parseElementtreeSync.calls.count()).toBe(2);
 
             var manifest2 = AppxManifest.get('/no/prefixed');
-            expect(xml.parseElementtreeSync.calls.length).toBe(4);
+            expect(xml.parseElementtreeSync.calls.count()).toBe(4);
 
             expect(manifest).not.toBe(manifest2);
         });
@@ -156,7 +156,7 @@
     describe('instance get* methods', function () {
         var methods = ['getPhoneIdentity','getIdentity','getProperties','getApplication','getVisualElements'];
 
-        it('should exists', function () {
+        it('Test #014 : should exists', function () {
             var manifest = AppxManifest.get(WINDOWS_PHONE_MANIFEST);
             var emptyManifest = AppxManifest.get('/no/prefixed');
 
@@ -171,7 +171,7 @@
     });
 
     describe('instance write method', function () {
-        it('should not write duplicate UAP capability declarations', function () {
+        it('Test #015 : should not write duplicate UAP capability declarations', function () {
             var manifest = AppxManifest.get(WINDOWS_10_MANIFEST);
             var capabilities = manifest.doc.find('.//Capabilities');
             capabilities.append(new et.Element('uap:Capability', { 'Name': 'enterpriseAuthentication' }));
@@ -184,11 +184,11 @@
     });
 
     describe('getVisualElements methods', function () {
-        it('refineColor should leave CSS color name as is', function () {
+        it('Test #016 : refineColor should leave CSS color name as is', function () {
             expect(refineColor(CSS_COLOR_NAME)).toEqual(CSS_COLOR_NAME);
         });
 
-        it('setForegroundText should change the ForegroundText property on non-Windows 10 platforms', function () {
+        it('Test #017 : setForegroundText should change the ForegroundText property on non-Windows 10 platforms', function () {
             var visualElementsWindows = AppxManifest.get(WINDOWS_MANIFEST).getVisualElements();
             var visualElementsWindows10 = AppxManifest.get(WINDOWS_10_MANIFEST).getVisualElements();
 
@@ -213,7 +213,7 @@
             expect(visualElementsWindows10.getForegroundText()).toEqual(undefined);
         });
 
-        it('getSplashScreenExtension/setSplashScreenExtension', function () {
+        it('Test #018 : getSplashScreenExtension/setSplashScreenExtension', function () {
             var visualElementsWindows = AppxManifest.get(WINDOWS_MANIFEST).getVisualElements();
             var visualElementsWindows10 = AppxManifest.get(WINDOWS_10_MANIFEST).getVisualElements();
             var visualElementsWindowsPhone = AppxManifest.get(WINDOWS_PHONE_MANIFEST).getVisualElements();
diff --git a/spec/unit/ConfigChanges.spec.js b/spec/unit/ConfigChanges.spec.js
index 5f3b990..e641bdc 100644
--- a/spec/unit/ConfigChanges.spec.js
+++ b/spec/unit/ConfigChanges.spec.js
@@ -53,7 +53,7 @@
             { before: undefined, count: 1, xml: '<DummyElement name="Dummy" />'}
         ]}};
         munger = new PlatformMunger('windows', tempDir);
-        spyOn(BaseMunger.prototype, 'apply_file_munge').andCallThrough();
+        spyOn(BaseMunger.prototype, 'apply_file_munge').and.callThrough();
     });
 
     afterEach(function () {
@@ -122,7 +122,7 @@
     }
 
     var fail = jasmine.createSpy('fail')
-    .andCallFake(function (err) {
+    .and.callFake(function (err) {
         console.error(err);
     });
 
diff --git a/spec/unit/JsprojManager.spec.js b/spec/unit/JsprojManager.spec.js
index 5e1834f..132a705 100644
--- a/spec/unit/JsprojManager.spec.js
+++ b/spec/unit/JsprojManager.spec.js
@@ -43,9 +43,9 @@
 
         JsprojManager.__set__('proj', jasmine.createSpy('proj'));
 
-        spyOn(shell, 'ls').andReturn([PROJECT_PATH + '/CordovaApp.projitems']);
-        spyOn(xml, 'parseElementtreeSync').andReturn(FAKE_MANIFEST);
-        spyOn(AppxManifest, 'get').andCallThrough();
+        spyOn(shell, 'ls').and.returnValue([PROJECT_PATH + '/CordovaApp.projitems']);
+        spyOn(xml, 'parseElementtreeSync').and.returnValue(FAKE_MANIFEST);
+        spyOn(AppxManifest, 'get').and.callThrough();
 
         project = JsprojManager.getProject(PROJECT_PATH);
     });
@@ -55,7 +55,7 @@
     });
 
     it('should throw if project is not a windows project', function () {
-        shell.ls.andCallThrough();
+        shell.ls.and.callThrough();
         expect(function () {
             JsprojManager.getProject(INVALID_PROJECT_PATH);
         }).toThrow();
@@ -65,6 +65,6 @@
         expect(project.getPackageName()).toBe('HelloCordova');
         expect(AppxManifest.get).toHaveBeenCalled();
         // Should pass 'ignoreCache' option to 'get' method
-        expect(AppxManifest.get.calls[0].args[1]).toBe(true);
+        expect(AppxManifest.get.calls.argsFor(0)[1]).toBe(true);
     });
 });
diff --git a/spec/unit/MSBuildTools.spec.js b/spec/unit/MSBuildTools.spec.js
index 442479b..8c65248 100644
--- a/spec/unit/MSBuildTools.spec.js
+++ b/spec/unit/MSBuildTools.spec.js
@@ -106,7 +106,7 @@
     it('spec.6 should return valid version and path', function(){
         var version  = '14.0';
 
-        spawnSpy.andReturn(Q.resolve(
+        spawnSpy.and.returnValue(Q.resolve(
             '\r\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MSBuild\\ToolsVersions\\12.0\r\n\t' +
             'MSBuildToolsPath\tREG_SZ\t' + fakeToolsPath(version) + '\r\n\r\n')
         );
@@ -118,7 +118,7 @@
     });
 
     it('spec.7 should return null if no tools found for version', function(){
-        spawnSpy.andReturn(Q.resolve('ERROR: The system was unable to find the specified registry key or value.'));
+        spawnSpy.and.returnValue(Q.resolve('ERROR: The system was unable to find the specified registry key or value.'));
 
         checkMSBuildVersion('14.0').then(function (actual) {
             expect(actual).not.toBeDefined();
@@ -126,7 +126,7 @@
     });
 
     it('spec.8 should return null on internal error', function(){
-        spawnSpy.andReturn(Q.reject());
+        spawnSpy.and.returnValue(Q.reject());
 
         checkMSBuildVersion('14.0').then(function (actual) {
             expect(actual).not.toBeDefined();
@@ -156,8 +156,8 @@
     var programFilesOrig = process.env['ProgramFiles'];
 
     beforeEach(function () {
-        shellTest = spyOn(shell, 'test').andReturn(true);
-        shellLs = spyOn(shell, 'ls').andReturn(availableVersions);
+        shellTest = spyOn(shell, 'test').and.returnValue(true);
+        shellLs = spyOn(shell, 'ls').and.returnValue(availableVersions);
         process.env['ProgramFiles(x86)'] = '/';
         process.env['ProgramFiles'] = '/';
     });
@@ -174,9 +174,9 @@
     });
 
     it('should return empty array if no UAP SDKs installed', function() {
-        shellLs.andReturn([]);
+        shellLs.and.returnValue([]);
         expect(buildTools.getAvailableUAPVersions().length).toEqual(0);
-        shellTest.andReturn(false);
+        shellTest.and.returnValue(false);
         expect(buildTools.getAvailableUAPVersions().length).toEqual(0);
     });
 
@@ -188,7 +188,7 @@
 
     it('should return sorted list versions with only valid versions', function() {
         var brokenAvailableVersions = availableVersions.concat('Broken.version');
-        shellLs.andReturn(brokenAvailableVersions);
+        shellLs.and.returnValue(brokenAvailableVersions);
 
         var versions = buildTools.getAvailableUAPVersions();
         expect(versions).toEqual(jasmine.any(Array));
@@ -222,7 +222,7 @@
     });
 
     it('should return MSBuildTools instance', function (done) {
-        spawnSpy.andReturn(Q(fakeVersion));
+        spawnSpy.and.returnValue(Q(fakeVersion));
 
         buildTools.getMSBuildToolsAt(fakePath)
         .then(function (tools) {
@@ -237,7 +237,7 @@
     });
 
     it('should reject promise if no msbuild found', function (done) {
-        spawnSpy.andReturn(Q.reject());
+        spawnSpy.and.returnValue(Q.reject());
 
         buildTools.getMSBuildToolsAt(messyPath)
         .then(success, fail)
diff --git a/spec/unit/Prepare.Win10.spec.js b/spec/unit/Prepare.Win10.spec.js
index f64f9c5..977c0bc 100644
--- a/spec/unit/Prepare.Win10.spec.js
+++ b/spec/unit/Prepare.Win10.spec.js
@@ -200,7 +200,7 @@
         mockConfig = createMockConfigAndManifestForApplyAccessRules(true, 'http://www.bing.com/*');
         addCapabilityDeclarationToMockManifest(mockConfig.manifest, 'documentsLibrary');
 
-        spyOn(AppxManifest, 'get').andReturn(mockConfig.manifest);
+        spyOn(AppxManifest, 'get').and.returnValue(mockConfig.manifest);
 
         stringFound = false;
         events.on('warn', function (msg) {
@@ -242,7 +242,7 @@
     '</widget>\n';
 
     var origParseElementtreeSync = xml.parseElementtreeSync;
-    spyOn(xml, 'parseElementtreeSync').andCallFake(function(path) {
+    spyOn(xml, 'parseElementtreeSync').and.callFake(function(path) {
         if (path ==='config.xml') return new et.ElementTree(et.XML(TEST_XML));
         return origParseElementtreeSync(path);
     });
@@ -250,7 +250,7 @@
     var config = new ConfigParser('config.xml');
 
     var origGetPreference = config.getPreference;
-    spyOn(config, 'getPreference').andCallFake(function (prefName) {
+    spyOn(config, 'getPreference').and.callFake(function (prefName) {
         if (prefName === 'WindowsDefaultUriPrefix') {
             return isWin10 ? 'ms-appx-web://' : 'ms-appx://';
         }
@@ -468,8 +468,8 @@
 
     function createMockConfig(images, splashScreens) {
         var result = jasmine.createSpyObj('config', ['getIcons', 'getSplashScreens']);
-        result.getIcons.andReturn(images);
-        result.getSplashScreens.andReturn(splashScreens || []);
+        result.getIcons.and.returnValue(images);
+        result.getSplashScreens.and.returnValue(splashScreens || []);
 
         return result;
     }
@@ -506,7 +506,7 @@
         events.on('warn', warnSpy);
         copyImages(project, locations);
         expect(FileUpdater.updatePaths).toHaveBeenCalledWith({}, { rootDir: PROJECT }, logFileOp);
-        expect(warnSpy.calls[0].args[0]).toMatch('image was skipped');
+        expect(warnSpy.calls.argsFor(0)[0]).toMatch('image was skipped');
     });
 
     describe('when "target" attribute is specified for the image', function () {
@@ -524,7 +524,7 @@
                 'Square44x44.targetsize-16.jpg'
             ];
 
-            spyOn(fs, 'readdirSync').andReturn(matchingFiles.concat(nonMatchingFiles));
+            spyOn(fs, 'readdirSync').and.returnValue(matchingFiles.concat(nonMatchingFiles));
 
             var images = [{src: 'res/Windows/Square44x44.png', target: 'SmallIcon' }];
             var project = { projectConfig: createMockConfig(images), root: PROJECT };
@@ -564,9 +564,9 @@
         var splashScreensFiles = splashScreens.map(function(splash) {
             return path.basename(splash.src);
         });
-        spyOn(fs, 'readdirSync').andReturn(splashScreensFiles);
+        spyOn(fs, 'readdirSync').and.returnValue(splashScreensFiles);
 
-        spyOn(fs, 'statSync').andReturn({
+        spyOn(fs, 'statSync').and.returnValue({
             size: size300K
         });
 
@@ -580,7 +580,7 @@
         expectedPathMap['images' + path.sep + 'SplashScreenPhone.scale-240.png'] = path.join('res', 'Windows', 'splashscreenphone.scale-240.png');
         expectedPathMap['images' + path.sep + 'SplashScreenPhone.scale-100.png'] = path.join('res', 'Windows', 'splashscreenphone.png');
         expect(FileUpdater.updatePaths).toHaveBeenCalledWith(expectedPathMap, { rootDir: PROJECT }, logFileOp);
-        expect(warnSpy.calls[0].args[0]).toMatch('file size exceeds the limit');
+        expect(warnSpy.calls.argsFor(0)[0]).toMatch('file size exceeds the limit');
     });
 
     it('should ignore splashScreens with unsupported extensions and emit a warning', function () {
@@ -596,9 +596,9 @@
         var splashScreensFiles = splashScreens.map(function(splash) {
             return path.basename(splash.src);
         });
-        spyOn(fs, 'readdirSync').andReturn(splashScreensFiles);
+        spyOn(fs, 'readdirSync').and.returnValue(splashScreensFiles);
 
-        spyOn(fs, 'statSync').andReturn({
+        spyOn(fs, 'statSync').and.returnValue({
             size: 0
         });
 
@@ -610,15 +610,15 @@
         var extensionNotSupportedMsg = 'extension is not supported';
         var expectedPathMap = {};
         expect(FileUpdater.updatePaths).toHaveBeenCalledWith(expectedPathMap, { rootDir: PROJECT }, logFileOp);
-        expect(warnSpy.calls[0].args[0]).toMatch(extensionNotSupportedMsg);
-        expect(warnSpy.calls[1].args[0]).toMatch(extensionNotSupportedMsg);
-        expect(warnSpy.calls[2].args[0]).toMatch(extensionNotSupportedMsg);
+        expect(warnSpy.calls.argsFor(0)[0]).toMatch(extensionNotSupportedMsg);
+        expect(warnSpy.calls.argsFor(1)[0]).toMatch(extensionNotSupportedMsg);
+        expect(warnSpy.calls.argsFor(2)[0]).toMatch(extensionNotSupportedMsg);
     });
 
     it('should warn about mixed splashscreen extensions used for non-MRT syntax', function () {
         var updateSplashScreenImageExtensions = prepare.__get__('updateSplashScreenImageExtensions');
         spyOn(fs, 'writeFileSync');
-        spyOn(AppxManifest, 'get').andReturn({
+        spyOn(AppxManifest, 'get').and.returnValue({
             getVisualElements: function() {
                 return {
                     getSplashScreenExtension: function() {
@@ -644,9 +644,9 @@
         var splashScreensFiles = splashScreens.map(function(splash) {
             return path.basename(splash.src);
         });
-        spyOn(fs, 'readdirSync').andReturn(splashScreensFiles);
+        spyOn(fs, 'readdirSync').and.returnValue(splashScreensFiles);
 
-        spyOn(fs, 'statSync').andReturn({
+        spyOn(fs, 'statSync').and.returnValue({
             size: 0
         });
 
@@ -656,8 +656,8 @@
         updateSplashScreenImageExtensions(project, locations);
 
         var mixedExtensionsMsg = 'splash screens have mixed file extensions';
-        expect(warnSpy.calls[0].args[0]).toMatch(mixedExtensionsMsg);
-        expect(warnSpy.calls[1].args[0]).toMatch(mixedExtensionsMsg);
+        expect(warnSpy.calls.argsFor(0)[0]).toMatch(mixedExtensionsMsg);
+        expect(warnSpy.calls.argsFor(1)[0]).toMatch(mixedExtensionsMsg);
     });
 
     it('should update manifests with proper splashscreen image extension', function () {
@@ -672,7 +672,7 @@
             win81Manifest = AppxManifest.get(Win81ManifestPath),
             wp81Manifest = AppxManifest.get(WP81ManifestPath);
 
-        spyOn(AppxManifest, 'get').andCallFake(function(manifestPath) {
+        spyOn(AppxManifest, 'get').and.callFake(function(manifestPath) {
             if (manifestPath.indexOf(Win10ManifestName) !== -1) {
                 return win10Manifest;
             }
@@ -695,9 +695,9 @@
         var splashScreensFiles = splashScreens.map(function(splash) {
             return path.basename(splash.src);
         });
-        spyOn(fs, 'readdirSync').andReturn(splashScreensFiles);
+        spyOn(fs, 'readdirSync').and.returnValue(splashScreensFiles);
 
-        spyOn(fs, 'statSync').andReturn({
+        spyOn(fs, 'statSync').and.returnValue({
             size: 0
         });
 
diff --git a/spec/unit/Version.spec.js b/spec/unit/Version.spec.js
index 4ee16a8..7f5882a 100644
--- a/spec/unit/Version.spec.js
+++ b/spec/unit/Version.spec.js
@@ -21,7 +21,7 @@
 
 describe('Version constructor', function () {
 
-    it('should behave correctly', function () {
+    it('Test #000 : should behave correctly', function () {
         var v1 = new Version(1);
         expect(v1.major).toBe(1);
         expect(v1.minor).toBe(0);
@@ -47,13 +47,15 @@
 
 describe('Version parse functions work as expected.', function() {
 
-    var version = Version.fromString('1.2.4.7');
-    expect(version.major).toBe(1);
-    expect(version.minor).toBe(2);
-    expect(version.build).toBe(4);
-    expect(version.qfe).toBe(7);
+    it('Test #001 : should behave correctly', function() {
+        var version = Version.fromString('1.2.4.7');
+        expect(version.major).toBe(1);
+        expect(version.minor).toBe(2);
+        expect(version.build).toBe(4);
+        expect(version.qfe).toBe(7);
+    });
 
-    it('should parse incomplete version string.', function() {
+    it('Test #002 : should parse incomplete version string.', function() {
         var version = Version.fromString('1.5.3');
         expect(version.major).toBe(1);
         expect(version.minor).toBe(5);
@@ -61,7 +63,7 @@
         expect(version.qfe).toBe(0);
     });
 
-    it('should produce an error as the version string is invalid', function() {
+    it('Test #003 : should produce an error as the version string is invalid', function() {
         try {
             Version.fromString('This is invalid.');
 
@@ -72,7 +74,7 @@
         }
     });
 
-    it('should produce an error as the string is too long.', function() {
+    it('Test #004 : should produce an error as the string is too long.', function() {
         try {
             Version.fromString('1.5.3.2.7');
 
@@ -81,63 +83,63 @@
         catch (ex) {
             expect(ex.constructor).toBe(RangeError);
         }
+        expect(Version.tryParse('This is invalid')).toBe(false);
     });
-
-    expect(Version.tryParse('This is invalid')).toBe(false);
-
 });
 
 describe('Version equality functions work as expected.', function() {
+    it('Test #005 : should parse incomplete version string.', function() {
+        var v1Base = new Version(1, 1, 2, 3);
+        // equal to v1Base
+        var v1Copy = new Version(1, 1, 2, 3);
+        // greater than v1Base by QFE
+        var gtV1ByQfe = new Version(1, 1, 2, 4);
+        // greater than v1Base by Build
+        var gtV1ByBuild = new Version(1, 1, 3, 3);
+        // greater than v1Base by Minor
+        var gtV1ByMinor = new Version(1, 2, 2, 3);
+        // greater than v1Base by Major
+        var gtV1ByMajor = new Version(2, 1, 2, 3);
 
-    var v1Base = new Version(1, 1, 2, 3);
-    // equal to v1Base
-    var v1Copy = new Version(1, 1, 2, 3);
-    // greater than v1Base by QFE
-    var gtV1ByQfe = new Version(1, 1, 2, 4);
-    // greater than v1Base by Build
-    var gtV1ByBuild = new Version(1, 1, 3, 3);
-    // greater than v1Base by Minor
-    var gtV1ByMinor = new Version(1, 2, 2, 3);
-    // greater than v1Base by Major
-    var gtV1ByMajor = new Version(2, 1, 2, 3);
+        expect(v1Copy.eq(v1Base)).toBe(true);
+        expect(v1Copy.gte(v1Base)).toBe(true);
+        expect(v1Copy.gt(v1Base)).toBe(false);
 
-    expect(v1Copy.eq(v1Base)).toBe(true);
-    expect(v1Copy.gte(v1Base)).toBe(true);
-    expect(v1Copy.gt(v1Base)).toBe(false);
+        expect(gtV1ByQfe.eq(v1Base)).toBe(false);
+        expect(gtV1ByQfe.gte(v1Base)).toBe(true);
+        expect(gtV1ByQfe.gt(v1Base)).toBe(true);
 
-    expect(gtV1ByQfe.eq(v1Base)).toBe(false);
-    expect(gtV1ByQfe.gte(v1Base)).toBe(true);
-    expect(gtV1ByQfe.gt(v1Base)).toBe(true);
+        expect(gtV1ByBuild.eq(v1Base)).toBe(false);
+        expect(gtV1ByBuild.gte(v1Base)).toBe(true);
+        expect(gtV1ByBuild.gt(v1Base)).toBe(true);
 
-    expect(gtV1ByBuild.eq(v1Base)).toBe(false);
-    expect(gtV1ByBuild.gte(v1Base)).toBe(true);
-    expect(gtV1ByBuild.gt(v1Base)).toBe(true);
+        expect(gtV1ByMinor.eq(v1Base)).toBe(false);
+        expect(gtV1ByMinor.gte(v1Base)).toBe(true);
+        expect(gtV1ByMinor.gt(v1Base)).toBe(true);
 
-    expect(gtV1ByMinor.eq(v1Base)).toBe(false);
-    expect(gtV1ByMinor.gte(v1Base)).toBe(true);
-    expect(gtV1ByMinor.gt(v1Base)).toBe(true);
-
-    expect(gtV1ByMajor.eq(v1Base)).toBe(false);
-    expect(gtV1ByMajor.gte(v1Base)).toBe(true);
-    expect(gtV1ByMajor.gt(v1Base)).toBe(true);
+        expect(gtV1ByMajor.eq(v1Base)).toBe(false);
+        expect(gtV1ByMajor.gte(v1Base)).toBe(true);
+        expect(gtV1ByMajor.gt(v1Base)).toBe(true);
+    });
 });
 
 describe('Version equality tests integrate with Array sort and toString() as expected.', function() {
+    it('Test #006 : should parse incomplete version string.', function() {
+        var v1Base = new Version(1, 1, 2, 3);
+        // equal to v1Base
+        var v1Copy = new Version(1, 1, 2, 3);
+        // greater than v1Base by QFE
+        var gtV1ByQfe = new Version(1, 1, 2, 4);
+        // greater than v1Base by Build
+        var gtV1ByBuild = new Version(1, 1, 3, 3);
+        // greater than v1Base by Minor
+        var gtV1ByMinor = new Version(1, 2, 2, 3);
+        // greater than v1Base by Major
+        var gtV1ByMajor = new Version(2, 1, 2, 3);
 
-    var v1Base = new Version(1, 1, 2, 3);
-    // equal to v1Base
-    var v1Copy = new Version(1, 1, 2, 3);
-    // greater than v1Base by QFE
-    var gtV1ByQfe = new Version(1, 1, 2, 4);
-    // greater than v1Base by Build
-    var gtV1ByBuild = new Version(1, 1, 3, 3);
-    // greater than v1Base by Minor
-    var gtV1ByMinor = new Version(1, 2, 2, 3);
-    // greater than v1Base by Major
-    var gtV1ByMajor = new Version(2, 1, 2, 3);
+        var toTest = [gtV1ByBuild, gtV1ByMajor, v1Copy, gtV1ByMinor, gtV1ByQfe, v1Base];
+        toTest.sort(Version.comparer);
 
-    var toTest = [gtV1ByBuild, gtV1ByMajor, v1Copy, gtV1ByMinor, gtV1ByQfe, v1Base];
-    toTest.sort(Version.comparer);
-
-    expect(toTest.join(',')).toBe('1.1.2.3,1.1.2.3,1.1.2.4,1.1.3.3,1.2.2.3,2.1.2.3');
+        expect(toTest.join(',')).toBe('1.1.2.3,1.1.2.3,1.1.2.4,1.1.3.3,1.2.2.3,2.1.2.3');
+    });
 });
diff --git a/spec/unit/WindowsConfigParser.spec.js b/spec/unit/WindowsConfigParser.spec.js
index a4b1bd3..4180dc6 100644
--- a/spec/unit/WindowsConfigParser.spec.js
+++ b/spec/unit/WindowsConfigParser.spec.js
@@ -40,13 +40,13 @@
 
     var mockConfig;
     beforeEach(function () {
-        spyOn(xml, 'parseElementtreeSync').andReturn(new et.ElementTree(et.XML(TEST_XML)));
+        spyOn(xml, 'parseElementtreeSync').and.returnValue(new et.ElementTree(et.XML(TEST_XML)));
 
         mockConfig = new ConfigParser('/some/file');
     });
 
     it('should correctly transform all versions as a baseline.', function() {
-        spyOn(mockConfig, 'getMatchingPreferences').andReturn([
+        spyOn(mockConfig, 'getMatchingPreferences').and.returnValue([
             { name: 'Windows.Universal-MinVersion', value: '10.0.9910.0' },
             { name: 'Windows.Universal-MaxVersionTested', value: '10.0.9917.0' },
             { name: 'Windows.Desktop-MinVersion', value: '10.0.9910.0' },
@@ -73,7 +73,7 @@
     });
 
     it('should produce versions correctly even when the config file has no settings.', function() {
-        spyOn(mockConfig, 'getMatchingPreferences').andReturn([]);
+        spyOn(mockConfig, 'getMatchingPreferences').and.returnValue([]);
 
         var versionSet = mockConfig.getAllMinMaxUAPVersions();
         var verBaseline = rewire('../../template/cordova/lib/ConfigParser')
@@ -88,7 +88,7 @@
 
     it('should fail with a RangeError if version specified incorrectly', function() {
         spyOn(mockConfig, 'getMatchingPreferences')
-        .andReturn([
+        .and.returnValue([
             { name: 'Windows.Universal-MinVersion', value: '10.0.9910.f' },
             { name: 'Windows.Universal-MaxVersionTested', value: '10.0.9917.0' },
         ]);
diff --git a/spec/unit/build.spec.js b/spec/unit/build.spec.js
index ade3a01..1c2bc5f 100644
--- a/spec/unit/build.spec.js
+++ b/spec/unit/build.spec.js
@@ -84,17 +84,17 @@
         configParserOriginal = build.__get__('ConfigParser');
 
         var originalBuildMethod = build.run;
-        spyOn(build, 'run').andCallFake(function () {
+        spyOn(build, 'run').and.callFake(function () {
             // Bind original build to custom 'this' object to mock platform's locations property
             return originalBuildMethod.apply({locations: {www: 'some/path'}}, arguments);
         });
 
-        spyOn(utils, 'isCordovaProject').andReturn(true);
+        spyOn(utils, 'isCordovaProject').and.returnValue(true);
         spyOn(prepare, 'applyPlatformConfig');
         spyOn(prepare, 'updateBuildConfig');
-        spyOn(package, 'getPackage').andReturn(Q({}));
+        spyOn(package, 'getPackage').and.returnValue(Q({}));
 
-        spyOn(AppxManifest, 'get').andReturn({
+        spyOn(AppxManifest, 'get').and.returnValue({
             getIdentity: function () {
                 return  { setPublisher: function () {} };
             },
@@ -113,7 +113,7 @@
             buildSpy = jasmine.createSpy();
 
         // utils.isCordovaProject is a spy, so we can call andReturn directly on it
-        utils.isCordovaProject.andReturn(false);
+        utils.isCordovaProject.and.returnValue(false);
         createFindAllAvailableVersionsMock([{version: '14.0', buildProject: buildSpy, path: testPath }]);
 
         build.run([ 'node', buildPath, '--release', '--debug' ])
@@ -153,10 +153,8 @@
         build.run({ buildConfig: buildConfigPath })
         .finally(function() {
             expect(prepare.updateBuildConfig).toHaveBeenCalled();
-
-            var buildOpts = prepare.updateBuildConfig.calls[0].args[0];
+            var buildOpts = prepare.updateBuildConfig.calls.argsFor(0)[0];
             var buildConfig = require(buildConfigPath).windows.debug;
-
             expect(buildOpts.packageCertificateKeyFile).toBeDefined();
             expect(buildOpts.packageCertificateKeyFile)
                 .toEqual(path.resolve(path.dirname(buildConfigPath), buildConfig.packageCertificateKeyFile));
@@ -165,13 +163,15 @@
                 expect(buildOpts[key]).toBeDefined();
                 expect(buildOpts[key]).toEqual(buildConfig[key]);
             });
-
+            done();
+        }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
             done();
         });
-    });
+    }, 20000);
 
     it('spec.4 should call buildProject of MSBuildTools with buildType = "release" if called with --release argument', function(done) {
-        var buildSpy = jasmine.createSpy().andCallFake(function (solutionFile, buildType, buildArch) {
+        var buildSpy = jasmine.createSpy().and.callFake(function (solutionFile, buildType, buildArch) {
             expect(buildType).toBe('release');
         });
 
@@ -185,7 +185,7 @@
     });
 
     it('spec.5 should call buildProject of MSBuildTools with buildType = "debug" if called without arguments', function(done) {
-        var buildSpy = jasmine.createSpy().andCallFake(function (solutionFile, buildType, buildArch) {
+        var buildSpy = jasmine.createSpy().and.callFake(function (solutionFile, buildType, buildArch) {
             expect(buildType).toBe('debug');
         });
 
@@ -199,7 +199,7 @@
     });
 
     it('spec.6 should call buildProject of MSBuildTools with buildArch = "arm" if called with --archs="arm" argument', function(done) {
-        var buildSpy = jasmine.createSpy().andCallFake(function (solutionFile, buildType, buildArch) {
+        var buildSpy = jasmine.createSpy().and.callFake(function (solutionFile, buildType, buildArch) {
             expect(buildArch).toBe('arm');
         });
 
@@ -338,7 +338,7 @@
     });
 
     it('spec.13 should be able to override target via --appx parameter', function(done) {
-        var buildSpy = jasmine.createSpy().andCallFake(function(solutionFile, buildType, buildArch) {
+        var buildSpy = jasmine.createSpy().and.callFake(function(solutionFile, buildType, buildArch) {
                 // check that we build Windows 10 and not Windows 8.1
                 expect(solutionFile.toLowerCase()).toMatch('cordovaapp.windows10.jsproj');
             });
@@ -361,10 +361,10 @@
         process.env.VSINSTALLDIR = customMSBuildPath;
 
         spyOn(MSBuildTools, 'getMSBuildToolsAt')
-            .andReturn(Q({
+            .and.returnValue(Q({
                 path: customMSBuildPath,
                 version: customMSBuildVersion,
-                buildProject: jasmine.createSpy('buildProject').andReturn(Q())
+                buildProject: jasmine.createSpy('buildProject').and.returnValue(Q())
             }));
 
         var fail = jasmine.createSpy('fail');
@@ -409,7 +409,7 @@
         });
 
         it('should handle build flags from both CLI and buildConfig.json', function () {
-            readFileSync.andReturn(JSON.stringify({
+            readFileSync.and.returnValue(JSON.stringify({
                 windows: { debug: { buildFlag: 'baz="quux"' } }
             }));
 
@@ -423,12 +423,12 @@
 
     describe('build', function () {
         beforeEach(function () {
-            spyOn(utils, 'isCordovaProject').andReturn(true);
+            spyOn(utils, 'isCordovaProject').and.returnValue(true);
             spyOn(prepare, 'applyPlatformConfig');
             spyOn(prepare, 'updateBuildConfig');
-            spyOn(package, 'getPackage').andReturn(Q({}));
+            spyOn(package, 'getPackage').and.returnValue(Q({}));
 
-            spyOn(AppxManifest, 'get').andReturn({
+            spyOn(AppxManifest, 'get').and.returnValue({
                 getIdentity: function () {
                     return  { setPublisher: function () {} };
                 },
@@ -438,7 +438,7 @@
 
         it('should pass buildFlags directly to MSBuild', function(done) {
             var fail = jasmine.createSpy('fail');
-            var buildTools = {version: '14.0', buildProject: jasmine.createSpy('buildProject').andReturn(Q()), path: testPath };
+            var buildTools = {version: '14.0', buildProject: jasmine.createSpy('buildProject').and.returnValue(Q()), path: testPath };
             var buildOptions = {
                 argv: ['--buildFlag', 'foo=bar']
             };
diff --git a/spec/unit/check_reqs.spec.js b/spec/unit/check_reqs.spec.js
index deebb67..62c8e61 100644
--- a/spec/unit/check_reqs.spec.js
+++ b/spec/unit/check_reqs.spec.js
@@ -35,12 +35,12 @@
             Requirement = check_reqs.__get__('Requirement');
         });
 
-        it('that should be constructable', function () {
+        it('Test #000 : that should be constructable', function () {
             var requirement = new Requirement('someId', 'Some Name');
             expect(requirement instanceof Requirement).toBeTruthy();
         });
 
-        it('that should have fields defined', function () {
+        it('Test #001 : that should have fields defined', function () {
             var requirement = new Requirement('someId', 'Some Name');
             expect(requirement.id).toBe('someId');
             expect(requirement.name).toBe('Some Name');
@@ -75,11 +75,11 @@
 
             checkSpy = jasmine.createSpy('checkSpy');
             fakeCheckFns = [
-                checkSpy.andReturn(Q('1.0')),
-                checkSpy.andReturn(Q('2.0')),
-                checkSpy.andReturn(Q('3.0'))
+                checkSpy.and.returnValue(Q('1.0')),
+                checkSpy.and.returnValue(Q('2.0')),
+                checkSpy.and.returnValue(Q('3.0'))
             ];
-            spyOn(xml, 'parseElementtreeSync').andReturn(new et.ElementTree(et.XML(TEST_XML)));
+            spyOn(xml, 'parseElementtreeSync').and.returnValue(new et.ElementTree(et.XML(TEST_XML)));
             fakeConfig = new ConfigParser('/some/file');
         });
 
@@ -89,7 +89,7 @@
             check_reqs.__set__('config', originalconfig);
         });
 
-        it('that should return a promise, fulfilled with an array of Requirements', function (done) {
+        it('Test #002 : that should return a promise, fulfilled with an array of Requirements', function (done) {
             check_reqs.__set__('requirements', fakeRequirements);
             check_reqs.__set__('checkFns', fakeCheckFns);
             check_reqs.__set__('config', fakeConfig);
@@ -106,7 +106,7 @@
             });
         });
 
-        it('that should not reject if one of requirements is not installed', function  (done) {
+        it('Test #003 : that should not reject if one of requirements is not installed', function  (done) {
             check_reqs.__set__('requirements', fakeRequirements);
             fakeCheckFns[0] = function () { return Q.reject('Error message'); };
             check_reqs.__set__('checkFns', fakeCheckFns);
@@ -124,9 +124,9 @@
             });
         });
 
-        it('that should reject if one of checks has internal erorrs', function  (done) {
+        it('Test #004 : that should reject if one of checks has internal erorrs', function  (done) {
             check_reqs.__set__('requirements', fakeRequirements);
-            fakeCheckFns[0] = checkSpy.andThrow('Fatal error');
+            fakeCheckFns[0] = checkSpy.and.throwError('Fatal error');
             check_reqs.__set__('checkFns', fakeCheckFns);
             check_reqs.__set__('config', fakeConfig);
 
@@ -136,15 +136,15 @@
                 done();
             })
             .catch(function  (error) {
-                expect(error).toBe('Fatal error');
+                expect(error).toMatch('Fatal error');
                 done();
             });
         });
 
-        it('that should not run other requirements checks if `fatal` requirement isn\'t installed', function  (done) {
+        it('Test #005 : that should not run other requirements checks if `fatal` requirement isn\'t installed', function  (done) {
             check_reqs.__set__('requirements', fakeRequirements);
             // The second requirement is fatal, so we're setting up second check to fail
-            fakeCheckFns[1] = checkSpy.andReturn(Q.reject('Error message'));
+            fakeCheckFns[1] = checkSpy.and.returnValue(Q.reject('Error message'));
             check_reqs.__set__('checkFns', fakeCheckFns);
             check_reqs.__set__('config', fakeConfig);
 
@@ -152,7 +152,7 @@
             .then(function (requirements) {
                 expect(requirements.length).toBe(2);
                 expect(requirements[1].isFatal).toBeTruthy();
-                expect(checkSpy.calls.length).toBe(2);
+                expect(checkSpy.calls.count()).toBe(2);
                 done();
             })
             .catch(function  (error) {
diff --git a/spec/unit/clean.spec.js b/spec/unit/clean.spec.js
index 3892b28..5d9148a 100644
--- a/spec/unit/clean.spec.js
+++ b/spec/unit/clean.spec.js
@@ -12,12 +12,12 @@
         iconPath = path.join(currentProject, 'images/SplashScreen.scale-100.png');
 
         var fsExistsSyncOrig = fs.existsSync;
-        spyOn(fs, 'existsSync').andCallFake(function (filePath) {
+        spyOn(fs, 'existsSync').and.callFake(function (filePath) {
             if (/config\.xml$/.test(filePath)) return true;
             return fsExistsSyncOrig(filePath);
         });
         var fsStatSyncOrig = fs.statSync;
-        spyOn(fs, 'statSync').andCallFake(function (filePath) {
+        spyOn(fs, 'statSync').and.callFake(function (filePath) {
             if (/SplashScreen\.scale-100\.png$/.test(filePath)) {
                 // Use absolute path:
                 return fsStatSyncOrig(iconPath);
@@ -42,7 +42,7 @@
             }
         };
 
-        var rejected = jasmine.createSpy().andCallFake(function(err) {
+        var rejected = jasmine.createSpy().and.callFake(function(err) {
             // Log error:
             expect(err).not.toBeDefined();
         });
diff --git a/spec/unit/deployment.spec.js b/spec/unit/deployment.spec.js
index b9a5959..8f3e3cd 100644
--- a/spec/unit/deployment.spec.js
+++ b/spec/unit/deployment.spec.js
@@ -43,14 +43,14 @@
         }
     });
 
-    it('Provides an AppDeployCmdTool when 8.1 is requested.', function() {
+    it('Test #000 : Provides an AppDeployCmdTool when 8.1 is requested.', function() {
 
         var tool = deployment.getDeploymentTool('8.1');
         expect(tool instanceof AppDeployCmdTool).toBe(true);
 
     });
 
-    it('Provides a WinAppDeployCmdTool when 10.0 is requested.', function() {
+    it('Test #001 : Provides a WinAppDeployCmdTool when 10.0 is requested.', function() {
 
         var tool = deployment.getDeploymentTool('10.0');
         expect(tool instanceof WinAppDeployCmdTool).toBe(true);
@@ -98,66 +98,55 @@
         }
     });
 
-    it('enumerateDevices returns a valid set of objects', function() {
+    it('Test #002 : enumerateDevices returns a valid set of objects', function(done) {
         var deploymentTool = deployment.getDeploymentTool('10.0');
-        var done = false;
-        deploymentTool.enumerateDevices().then(function(deviceList) {
-
+        deploymentTool.enumerateDevices()
+        .then(function(deviceList) {
             expect(deviceList.length).toBe(3);
             expect(deviceList[0].name).toBe('Lumia 1520 (RM-940)');
             expect(deviceList[0].index).toBe(0);
             expect(deviceList[0].type).toBe('device');
-
-            done = true;
-
+            done();
+        }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
+            done();
         });
-
-        waitsFor(function() { return done; });
     });
 
-    it('installAppPackage passes the correct set of parameters', function() {
+    it('Test #003 : installAppPackage passes the correct set of parameters', function(done) {
         var deploymentTool = deployment.getDeploymentTool('10.0');
-        var done = false;
-        deploymentTool.enumerateDevices().then(function(deviceList) {
-            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ false, /*shouldUpdate*/ false).then(function() {
-
-                // expect() calls are in the fakeSpawn function
-                done = true;
-
-            });
+        deploymentTool.enumerateDevices()
+        .then(function(deviceList) {
+            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ false, /*shouldUpdate*/ false);
+            done();
+        }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
+            done();
         });
-
-        waitsFor(function() { return done; });
     });
 
-    it('installAppPackage passes the correct set of parameters when updating', function() {
+    it('Test #004 : installAppPackage passes the correct set of parameters when updating', function(done) {
         var deploymentTool = deployment.getDeploymentTool('10.0');
-        var done = false;
-        deploymentTool.enumerateDevices().then(function(deviceList) {
-            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ false, /*shouldUpdate*/ true).then(function() {
-
-                // expect() calls are in the fakeSpawn function
-                done = true;
-
-            });
+        deploymentTool.enumerateDevices()
+        .then(function(deviceList) {
+            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ false, /*shouldUpdate*/ true);
+            done();
+        }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
+            done();
         });
-
-        waitsFor(function() { return done; });
     });
 
-    it('uninstallAppPackage passes the correct set of parameters', function() {
+    it('Test #005 : uninstallAppPackage passes the correct set of parameters', function(done) {
         var deploymentTool = deployment.getDeploymentTool('10.0');
-        var done = false;
-        deploymentTool.enumerateDevices().then(function(deviceList) {
-            deploymentTool.uninstallAppPackage(TEST_APP_PACKAGE_ID, deviceList[2]).then(function() {
-
-                // expect() calls are in the fakeSpawn function
-                done = true;
-
-            });
+        deploymentTool.enumerateDevices()
+        .then(function(deviceList) {
+            deploymentTool.uninstallAppPackage(TEST_APP_PACKAGE_ID, deviceList[2]);
+            done();
+        }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
+            done();
         });
-
-        waitsFor(function() { return done; });
     });
 });
 
@@ -206,93 +195,81 @@
         }
     });
 
-    it('enumerateDevices returns a valid set of objects', function() {
+    it('Test #006 : enumerateDevices returns a valid set of objects', function(done) {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        var done = false;
-        deploymentTool.enumerateDevices().then(function(deviceList) {
-
+        deploymentTool.enumerateDevices()
+        .then(function(deviceList) {
             expect(deviceList.length).toBe(12);
             expect(deviceList[0].name).toBe('Device');
             expect(deviceList[0].index).toBe(0);
             expect(deviceList[0].type).toBe('device');
-
             expect(deviceList[5].name).toBe('Mobile Emulator 10.0.10150.0 1080p 6 inch 2GB');
             expect(deviceList[5].index).toBe(5);
             expect(deviceList[5].type).toBe('emulator');
-
-            done = true;
-
+            done();
+        }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
+            done();
         });
-        waitsFor(function() { return done; });
     });
 
-    it('installAppPackage passes the correct set of parameters', function() {
+    it('Test #007 : installAppPackage passes the correct set of parameters', function(done) {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        var done = false;
-        deploymentTool.enumerateDevices().then(function(deviceList) {
-            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ false, /*shouldUpdate*/ false).then(function() {
-
-                // expect() calls are in the fakeSpawn function
-                done = true;
-
-            });
+        deploymentTool.enumerateDevices()
+        .then(function(deviceList) {
+            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ false, /*shouldUpdate*/ false);
+            done();
+        }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
+            done();
         });
-        waitsFor(function() { return done; });
     });
 
-    it('installAppPackage passes the correct set of parameters when updating', function() {
+    it('Test #008 : installAppPackage passes the correct set of parameters when updating', function(done) {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        var done = false;
-        deploymentTool.enumerateDevices().then(function(deviceList) {
-            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ false, /*shouldUpdate*/ true).then(function() {
-
-                // expect() calls are in the fakeSpawn function
-                done = true;
-
-            });
+        deploymentTool.enumerateDevices()
+        .then(function(deviceList) {
+            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ false, /*shouldUpdate*/ true);
+            done();
+        }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
+            done();
         });
-        waitsFor(function() { return done; });
     });
 
-    it('installAppPackage passes the correct set of parameters when launching', function() {
+    it('Test #009 : installAppPackage passes the correct set of parameters when launching', function(done) {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        var done = false;
-        deploymentTool.enumerateDevices().then(function(deviceList) {
-            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ true, /*shouldUpdate*/ false).then(function() {
-
-                // expect() calls are in the fakeSpawn function
-                done = true;
-
-            });
+        deploymentTool.enumerateDevices()
+        .then(function(deviceList) {
+            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ true, /*shouldUpdate*/ false);
+            done();
+        }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
+            done();
         });
-        waitsFor(function() { return done; });
     });
 
-    it('installAppPackage passes the correct set of parameters when updating and launching', function() {
+    it('Test #010 : installAppPackage passes the correct set of parameters when updating and launching', function(done) {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        var done = false;
-        deploymentTool.enumerateDevices().then(function(deviceList) {
-            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ true, /*shouldUpdate*/ true).then(function() {
-
-                // expect() calls are in the fakeSpawn function
-                done = true;
-
-            });
+        deploymentTool.enumerateDevices()
+        .then(function(deviceList) {
+            deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /*shouldLaunch*/ true, /*shouldUpdate*/ true);
+            done();
+        }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
+            done();
         });
-        waitsFor(function() { return done; });
     });
 
-    it('uninstallAppPackage passes the correct set of parameters', function() {
+    it('Test #011 : uninstallAppPackage passes the correct set of parameters', function(done) {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        var done = false;
-        deploymentTool.enumerateDevices().then(function(deviceList) {
-            deploymentTool.uninstallAppPackage(TEST_APP_PACKAGE_ID, deviceList[5]).then(function() {
-
-                // expect() calls are in the fakeSpawn function
-                done = true;
-
-            });
+        deploymentTool.enumerateDevices()
+        .then(function(deviceList) {
+            deploymentTool.uninstallAppPackage(TEST_APP_PACKAGE_ID, deviceList[5]);
+            done();
+       }).fail(function err (errMsg) {
+            expect(errMsg).toBeUndefined();
+            done();
         });
-        waitsFor(function() { return done; });
     });
 });
diff --git a/spec/unit/pluginHandler/common.spec.js b/spec/unit/pluginHandler/common.spec.js
index d026b97..776fb58 100644
--- a/spec/unit/pluginHandler/common.spec.js
+++ b/spec/unit/pluginHandler/common.spec.js
@@ -40,12 +40,12 @@
 
 describe('common platform handler', function() {
     describe('copyFile', function() {
-        it('should throw if source path not found', function(){
+        it('Test #000 : should throw if source path not found', function(){
             expect(function(){copyFile('/some/dir', 'foo', project_dir, dest);})
                 .toThrow(new Error('"' + path.resolve('/some/dir', 'foo') + '" not found!'));
         });
 
-        it('should throw if src not in plugin directory', function(){
+        it('Test #001 : should throw if src not in plugin directory', function(){
             shell.mkdir('-p', project_dir);
             fs.writeFileSync(non_plugin_file, 'contents', 'utf-8');
             var outside_file = '../non_plugin_file';
@@ -54,7 +54,7 @@
             shell.rm('-rf', test_dir);
         });
 
-        it('should allow symlink src, if inside plugin', function(){
+        it('Test #002 : should allow symlink src, if inside plugin', function(){
             shell.mkdir('-p', java_dir);
             fs.writeFileSync(java_file, 'contents', 'utf-8');
 
@@ -67,7 +67,7 @@
             shell.rm('-rf', project_dir);
         });
 
-        it('should throw if symlink is linked to a file outside the plugin', function(){
+        it('Test #003 : should throw if symlink is linked to a file outside the plugin', function(){
             shell.mkdir('-p', java_dir);
             fs.writeFileSync(non_plugin_file, 'contents', 'utf-8');
 
@@ -81,7 +81,7 @@
             shell.rm('-rf', project_dir);
         });
 
-        it('should throw if dest is outside the project directory', function(){
+        it('Test #004 : should throw if dest is outside the project directory', function(){
             shell.mkdir('-p', java_dir);
             fs.writeFileSync(java_file, 'contents', 'utf-8');
             expect(function(){copyFile(test_dir, java_file, project_dir, non_plugin_file);})
@@ -89,11 +89,11 @@
             shell.rm('-rf', project_dir);
         });
 
-        it('should call mkdir -p on target path', function(){
+        it('Test #005 : should call mkdir -p on target path', function(){
             shell.mkdir('-p', java_dir);
             fs.writeFileSync(java_file, 'contents', 'utf-8');
 
-            var s = spyOn(shell, 'mkdir').andCallThrough();
+            var s = spyOn(shell, 'mkdir').and.callThrough();
             copyFile(test_dir, java_file, project_dir, dest);
 
             expect(s).toHaveBeenCalled();
@@ -101,11 +101,11 @@
             shell.rm('-rf', project_dir);
         });
 
-        it('should call cp source/dest paths', function(){
+        it('Test #006 : should call cp source/dest paths', function(){
             shell.mkdir('-p', java_dir);
             fs.writeFileSync(java_file, 'contents', 'utf-8');
 
-            var s = spyOn(shell, 'cp').andCallThrough();
+            var s = spyOn(shell, 'cp').and.callThrough();
             copyFile(test_dir, java_file, project_dir, dest);
 
             expect(s).toHaveBeenCalled();
@@ -116,7 +116,7 @@
     });
 
     describe('copyNewFile', function () {
-        it('should throw if target path exists', function(){
+        it('Test #007 : should throw if target path exists', function(){
             shell.mkdir('-p', dest);
             expect(function(){copyNewFile(test_dir, src, project_dir, dest);})
                 .toThrow(new Error('"' + dest + '" already exists!'));
@@ -125,11 +125,11 @@
     });
 
     describe('deleteJava', function() {
-        it('should call fs.unlinkSync on the provided paths', function(){
+        it('Test #008 : should call fs.unlinkSync on the provided paths', function(){
             shell.mkdir('-p', java_dir);
             fs.writeFileSync(java_file, 'contents', 'utf-8');
 
-            var s = spyOn(fs, 'unlinkSync').andCallThrough();
+            var s = spyOn(fs, 'unlinkSync').and.callThrough();
             removeFileAndParents(project_dir, java_file);
             expect(s).toHaveBeenCalled();
             expect(s).toHaveBeenCalledWith(path.resolve(project_dir, java_file));
@@ -137,7 +137,7 @@
             shell.rm('-rf', java_dir);
         });
 
-        it('should delete empty directories after removing source code in a java src path hierarchy', function(){
+        it('Test #009 : should delete empty directories after removing source code in a java src path hierarchy', function(){
             shell.mkdir('-p', java_dir);
             fs.writeFileSync(java_file, 'contents', 'utf-8');
 
diff --git a/spec/unit/pluginHandler/windows.spec.js b/spec/unit/pluginHandler/windows.spec.js
index 2da9a97..11aa573 100644
--- a/spec/unit/pluginHandler/windows.spec.js
+++ b/spec/unit/pluginHandler/windows.spec.js
@@ -66,19 +66,27 @@
 }
 
 beforeEach(function () {
-    this.addMatchers({
-        toContainXmlPath: function (xpath) {
-            var xml = this.actual;
-            var notText = this.isNot ? 'not ' : '';
-            this.message = function () {
-                return 'Expected xml \'' + et.tostring(xml) + '\' ' + notText + 'to contain elements matching \'' + xpath + '\'.';
+    jasmine.addMatchers({
+        toContainXmlPath: function () {
+            return {
+                compare: function(actual, expected) {
+                    var xml = actual;
+                    var notText = this.isNot ? 'not ' : '';
+                    var result = {};
+                    result.pass = xml.find(expected) !== null;
+                    if(result.pass) {
+                        result.message = 'Expected xml \'' + et.tostring(xml) + '\' ' + notText + 'to contain elements matching \'' + actual + '\'.';
+                    } else {
+                        result.message = 'Expected xml \'' + et.tostring(xml) + '\' ' + notText + 'to not contain elements matching \'' + actual + '\'.';
+                    }
+                        return result;
+                }
             };
-
-            return xml.find(xpath) !== null;
         }
     });
 });
 
+
 var getPluginFilePath = PluginHandler.__get__('getPluginFilePath');
 var computeResourcePath = function(resourceFile) {
     return getPluginFilePath(dummyPluginInfo, resourceFile.src, cordovaProjectWindowsPlatformDir);
@@ -114,7 +122,7 @@
         var copyFileSpy = jasmine.createSpy('copyFile');
 
         beforeEach(function () {
-            PluginHandler.__set__('copyFile', copyFileSpy.andCallFake(copyFileOrig));
+            PluginHandler.__set__('copyFile', copyFileSpy.and.callFake(copyFileOrig));
         });
 
         afterEach(function() {
@@ -122,7 +130,6 @@
         });
 
         function validateInstalledProjects(tag, elementToInstall, xpath, supportedPlatforms) {
-            jasmine.getEnv().currentSpec.removeAllSpies();
 
             var projects = copyArray(dummyProject.projects);
             projects.push(dummyProject.master);
@@ -173,7 +180,7 @@
 
             projects.forEach(function (project) {
                 if (projectsAddedTo.indexOf(path.basename(project.location)) > -1) {
-                    projectsAddedToSpies.push(spyOn(project, 'appendToRoot').andCallFake(appendToRootFake));
+                    projectsAddedToSpies.push(spyOn(project, 'appendToRoot').and.callFake(appendToRootFake));
                 } else {
                     projectsNotAddedToSpies.push(spyOn(project, 'appendToRoot'));
                 }
@@ -194,26 +201,26 @@
 
             var install = PluginHandler.getInstaller('source-file');
 
-            it('should copy stuff from one location to another by calling common.copyFile', function () {
+            it('Test #000 : should copy stuff from one location to another by calling common.copyFile', function () {
                 var source = copyArray(valid_source);
                 install(source[0], dummyPluginInfo, dummyProject);
                 expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, 'src/windows/dummer.js', cordovaProjectWindowsPlatformDir, path.join('plugins', 'org.test.plugins.dummyplugin', 'dummer.js'), false);
             });
-            it('should throw if source-file src cannot be found', function () {
+            it('Test #001 : should throw if source-file src cannot be found', function () {
                 var source = copyArray(invalid_source);
-                copyFileSpy.andCallFake(copyFileOrig);
+                copyFileSpy.and.callFake(copyFileOrig);
                 expect(function () {
                     install(source[1], faultyPluginInfo, dummyProject);
-                }).toThrow('"' + path.resolve(faultyplugin, 'src/windows/NotHere.js') + '" not found!');
+                }).toThrow(new Error ('"' + path.resolve(faultyplugin, 'src/windows/NotHere.js') + '" not found!'));
             });
-            it('should throw if source-file target already exists', function () {
+            it('Test #002 : should throw if source-file target already exists', function () {
                 var source = copyArray(valid_source);
                 var target = path.join(cordovaProjectWindowsPlatformDir, 'plugins', dummyPluginInfo.id, 'dummer.js');
                 shell.mkdir('-p', path.dirname(target));
                 fs.writeFileSync(target, 'some bs', 'utf-8');
                 expect(function () {
                     install(source[0], dummyPluginInfo, dummyProject);
-                }).toThrow('"' + target + '" already exists!');
+                }).toThrow(new Error ('"' + target + '" already exists!'));
             });
         });
 
@@ -225,48 +232,64 @@
 
             // This could be separated into individual specs, but that results in a lot of copying and deleting the
             // project files, which is not needed.
-            it('should write to correct project files when conditions are specified', function () {
 
+            it('Test #003 : should write to correct project files when conditions are specified', function () {
                 var xpath = 'Content[@Include="' + resourceFiles[0].target + '"][@Condition="\'$(Platform)\'==\'x86\'"]';
                 validateInstalledProjects('resource-file', resourceFiles[0], xpath, ['all']);
-
-                xpath = 'Content[@Include="' + resourceFiles[1].target + '"]';
-                validateInstalledProjects('resource-file', resourceFiles[1], xpath, ['windows', 'phone', 'windows10']);
-
-                xpath = 'Content[@Include="' + resourceFiles[2].target + '"]';
-                validateInstalledProjects('resource-file', resourceFiles[2], xpath, ['phone']);
-
-                xpath = 'Content[@Include="' + resourceFiles[3].target + '"][@Condition="\'$(Platform)\'==\'x64\'"]';
-                validateInstalledProjects('resource-file', resourceFiles[3], xpath, ['windows8']);
             });
 
-            it('should write to correct project files when conditions are specified with reference', function () {
 
+            // project files, which is not needed.
+            it('Test #004 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'Content[@Include="' + resourceFiles[1].target + '"]';
+                validateInstalledProjects('resource-file', resourceFiles[1], xpath, ['windows', 'phone', 'windows10']);
+            });
+
+            // project files, which is not needed.
+            it('Test #005 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'Content[@Include="' + resourceFiles[2].target + '"]';
+                validateInstalledProjects('resource-file', resourceFiles[2], xpath, ['phone']);
+            });
+
+            it('Test #006 : should write to correct project files when conditions are specified with reference', function () {
                 var xpath = 'Content[@Include="' + computeResourcePath(resourcereferenceFiles[0]) + '"][@Condition="\'$(Platform)\'==\'x86\'"]';
                 validateInstalledProjects('resource-file', resourcereferenceFiles[0], xpath, ['all']);
 
-                xpath = 'Content[@Include="' + computeResourcePath(resourcereferenceFiles[1]) + '"]';
+            });
+
+            it('Test #007 : should write to correct project files when conditions are specified with reference', function () {
+                var xpath = 'Content[@Include="' + computeResourcePath(resourcereferenceFiles[1]) + '"]';
                 validateInstalledProjects('resource-file', resourcereferenceFiles[1], xpath, ['windows', 'phone', 'windows10']);
+            });
 
-                xpath = 'Content[@Include="' + computeResourcePath(resourcereferenceFiles[2]) + '"]';
+            it('Test #008 : should write to correct project files when conditions are specified with reference', function () {
+                var xpath = 'Content[@Include="' + computeResourcePath(resourcereferenceFiles[2]) + '"]';
                 validateInstalledProjects('resource-file', resourcereferenceFiles[2], xpath, ['phone']);
+            });
 
-                xpath = 'Content[@Include="' + computeResourcePath(resourcereferenceFiles[3]) + '"][@Condition="\'$(Platform)\'==\'x64\'"]';
+            it('Test #009 : should write to correct project files when conditions are specified with reference', function () {
+                var xpath = 'Content[@Include="' + computeResourcePath(resourcereferenceFiles[3]) + '"][@Condition="\'$(Platform)\'==\'x64\'"]';
                 validateInstalledProjects('resource-file', resourcereferenceFiles[3], xpath, ['windows8']);
             });
 
-            it('should throw if conditions are invalid', function () {
+            // project files, which is not needed.
+            it('Test #010 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'Content[@Include="' + resourceFiles[3].target + '"][@Condition="\'$(Platform)\'==\'x64\'"]';
+                validateInstalledProjects('resource-file', resourceFiles[3], xpath, ['windows8']);
+            });
+
+            it('Test #011 : should throw if conditions are invalid', function () {
                 expect(function () {
                     install(invalidResourceFiles[0], faultyPluginInfo, dummyProject);
-                }).toThrow('Invalid arch attribute (must be "x86", "x64" or "ARM"): x85');
+                }).toThrow(new Error ('Invalid arch attribute (must be "x86", "x64" or "ARM"): x85'));
 
                 expect(function () {
                     install(invalidResourceFiles[1], faultyPluginInfo, dummyProject);
-                }).toThrow('Invalid versions attribute (must be a valid semantic version range): 8.0a');
+                }).toThrow(new Error ('Invalid versions attribute (must be a valid semantic version range): 8.0a'));
 
                 expect(function () {
                     install(invalidResourceFiles[2], faultyPluginInfo, dummyProject);
-                }).toThrow('Invalid device-target attribute (must be "all", "phone", "windows" or "win"): daphne');
+                }).toThrow(new Error('Invalid device-target attribute (must be "all", "phone", "windows" or "win"): daphne'));
             });
         });
 
@@ -277,32 +300,35 @@
 
             // This could be separated into individual specs, but that results in a lot of copying and deleting the
             // project files, which is not needed.
-            it('should write to correct project files when conditions are specified', function () {
+            it('Test #012 : should write to correct project files when conditions are specified', function () {
                 var xpath = 'SDKReference[@Include="TestSDK1, Version=1.0"][@Condition="\'$(Platform)\'==\'x86\'"]';
                 validateInstalledProjects('lib-file', libfiles[0], xpath, ['all']);
-
-                xpath = 'SDKReference[@Include="TestSDK2, Version=1.0"]';
+            });
+            it('Test #013 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'SDKReference[@Include="TestSDK2, Version=1.0"]';
                 validateInstalledProjects('lib-file', libfiles[1], xpath, ['windows', 'phone', 'windows10']);
-
-                xpath = 'SDKReference[@Include="TestSDK3, Version=1.0"]';
+            });
+            it('Test #014 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'SDKReference[@Include="TestSDK3, Version=1.0"]';
                 validateInstalledProjects('lib-file', libfiles[2], xpath, ['phone']);
-
-                xpath = 'SDKReference[@Include="TestSDK4, Version=1.0"]';
+            });
+            it('Test #015 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'SDKReference[@Include="TestSDK4, Version=1.0"]';
                 validateInstalledProjects('lib-file', libfiles[3], xpath, ['windows8']);
             });
 
-            it('should throw if conditions are invalid', function () {
+            it('Test #016 : should throw if conditions are invalid', function () {
                 expect(function () {
                     install(invalidLibFiles[0], faultyPluginInfo, dummyProject);
-                }).toThrow('Invalid arch attribute (must be "x86", "x64" or "ARM"): x85');
+                }).toThrow(new Error ('Invalid arch attribute (must be "x86", "x64" or "ARM"): x85'));
 
                 expect(function () {
                     install(invalidLibFiles[1], faultyPluginInfo, dummyProject);
-                }).toThrow('Invalid versions attribute (must be a valid semantic version range): 8.0a');
+                }).toThrow(new Error ('Invalid versions attribute (must be a valid semantic version range): 8.0a'));
 
                 expect(function () {
                     install(invalidLibFiles[2], faultyPluginInfo, dummyProject);
-                }).toThrow('Invalid device-target attribute (must be "all", "phone", "windows" or "win"): daphne');
+                }).toThrow(new Error ('Invalid device-target attribute (must be "all", "phone", "windows" or "win"): daphne'));
             });
         });
 
@@ -311,27 +337,37 @@
 
             // This could be separated into individual specs, but that results in a lot of copying and deleting the
             // project files, which is not needed.
-            it('should write to correct project files when conditions are specified', function () {
+            it('Test #017 : should write to correct project files when conditions are specified', function () {
                 var xpath = 'Reference[@Include="dummy1"][@Condition="\'$(Platform)\'==\'x64\'"]/HintPath';
                 validateInstalledProjects('framework', frameworks[0], xpath, ['all']);
+            });
 
-                xpath = 'Reference[@Include="dummy2"]/HintPath';
+            it('Test #018 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'Reference[@Include="dummy2"]/HintPath';
                 validateInstalledProjects('framework', frameworks[1], xpath, ['all']);
+            });
 
-                xpath = 'Reference[@Include="dummy3"]/HintPath';
+            it('Test #019 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'Reference[@Include="dummy3"]/HintPath';
                 validateInstalledProjects('framework', frameworks[2], xpath, ['windows', 'windows8', 'windows10']);
+            });
 
-                xpath = 'Reference[@Include="dummy4"][@Condition="\'$(Platform)\'==\'ARM\'"]/HintPath';
+            it('Test #020 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'Reference[@Include="dummy4"][@Condition="\'$(Platform)\'==\'ARM\'"]/HintPath';
                 validateInstalledProjects('framework', frameworks[3], xpath, ['phone']);
+            });
 
-                xpath = 'Reference[@Include="dummy5"]/HintPath';
+            it('Test #021 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'Reference[@Include="dummy5"]/HintPath';
                 validateInstalledProjects('framework', frameworks[4], xpath, ['phone']);
+            });
 
-                xpath = 'Reference[@Include="dummy6"]/HintPath';
+            it('Test #022 : should write to correct project files when conditions are specified', function () {
+                var xpath = 'Reference[@Include="dummy6"]/HintPath';
                 validateInstalledProjects('framework', frameworks[5], xpath, ['windows', 'windows10', 'phone']);
             });
 
-            it('with .winmd and .dll files', function() {
+            it('Test #023 : with .winmd and .dll files', function() {
                var frameworks = copyArray(test_frameworks);
                var install = PluginHandler.getInstaller('framework');
                var uninstall = PluginHandler.getUninstaller('framework');
@@ -380,7 +416,7 @@
         describe('of <framework> elements of type \'projectReference\'', function () {
             var frameworks = copyArray(valid_frameworks);
 
-            it('should write to correct project files when conditions are specified', function () {
+            it('Test #024 : should write to correct project files when conditions are specified', function () {
                 var curDir;
                 var xpath;
 
@@ -389,13 +425,39 @@
 
                 xpath = 'ProjectReference[@Include="' + winJoin('..', '..', 'plugins', 'org.test.plugins.dummyplugin', 'src', 'windows', 'dummy1.vcxproj') + '"][@Condition="\'$(Platform)\'==\'x64\'"]';
                 validateInstalledProjects('framework', frameworks[6], xpath, ['all']);
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
+            it('Test #025 : should write to correct project files when conditions are specified', function () {
+                var curDir;
+                var xpath;
+
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
 
                 xpath = 'ProjectReference[@Include="' + winJoin('..', '..', 'plugins', 'org.test.plugins.dummyplugin', 'src', 'windows', 'dummy2.vcxproj') + '"]';
                 validateInstalledProjects('framework', frameworks[7], xpath, ['windows8']);
 
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
+            it('Test #026 : should write to correct project files when conditions are specified', function () {
+                var curDir;
+                var xpath;
+
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
+
                 xpath = 'ProjectReference[@Include="' + winJoin('..', '..', 'plugins', 'org.test.plugins.dummyplugin', 'src', 'windows', 'dummy3.vcxproj') + '"]';
                 validateInstalledProjects('framework', frameworks[8], xpath, ['windows', 'windows8', 'windows10']);
 
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
+            it('Test #027 : should write to correct project files when conditions are specified', function () {
+                var curDir;
+                var xpath;
+
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
+
                 xpath = 'ProjectReference[@Include="' + winJoin('..', '..', 'plugins', 'org.test.plugins.dummyplugin', 'src', 'windows', 'dummy4.vcxproj') + '"]';
                 validateInstalledProjects('framework', frameworks[9], xpath, ['windows', 'phone']);
 
@@ -415,13 +477,13 @@
                 platformWwwDest = path.resolve(dummyProject.platformWww, 'plugins', dummyPluginInfo.id, jsModule.src);
             });
 
-            it('should put module to both www and platform_www when options.usePlatformWww flag is specified', function () {
+            it('Test #028 : should put module to both www and platform_www when options.usePlatformWww flag is specified', function () {
                 install(jsModule, dummyPluginInfo, dummyProject, {usePlatformWww: true});
                 expect(fs.writeFileSync).toHaveBeenCalledWith(wwwDest, jasmine.any(String), 'utf-8');
                 expect(fs.writeFileSync).toHaveBeenCalledWith(platformWwwDest, jasmine.any(String), 'utf-8');
             });
 
-            it('should put module to www only when options.usePlatformWww flag is not specified', function () {
+            it('Test #025 : should put module to www only when options.usePlatformWww flag is not specified', function () {
                 install(jsModule, dummyPluginInfo, dummyProject);
                 expect(fs.writeFileSync).toHaveBeenCalledWith(wwwDest, jasmine.any(String), 'utf-8');
                 expect(fs.writeFileSync).not.toHaveBeenCalledWith(platformWwwDest, jasmine.any(String), 'utf-8');
@@ -434,18 +496,18 @@
             var install = PluginHandler.getInstaller('asset');
 
             beforeEach(function () {
-                copyFileSpy.reset();
+                copyFileSpy.calls.reset();
                 wwwDest = path.resolve(dummyProject.www, asset.target);
                 platformWwwDest = path.resolve(dummyProject.platformWww, asset.target);
             });
 
-            it('should put asset to both www and platform_www when options.usePlatformWww flag is specified', function () {
+            it('Test #029 : should put asset to both www and platform_www when options.usePlatformWww flag is specified', function () {
                 install(asset, dummyPluginInfo, dummyProject, {usePlatformWww: true});
                 expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.www, asset.target);
                 expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.platformWww, asset.target);
             });
 
-            it('should put asset to www only when options.usePlatformWww flag is not specified', function () {
+            it('Test #030 : should put asset to www only when options.usePlatformWww flag is not specified', function () {
                 install(asset, dummyPluginInfo, dummyProject);
                 expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.www, asset.target);
                 expect(copyFileSpy).not.toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.platformWww, asset.target);
@@ -458,7 +520,7 @@
         var removeFileSpy = jasmine.createSpy('removeFile');
 
         beforeEach(function () {
-            PluginHandler.__set__('removeFile', removeFileSpy.andCallFake(removeFileOrig));
+            PluginHandler.__set__('removeFile', removeFileSpy.and.callFake(removeFileOrig));
         });
 
         afterEach(function () {
@@ -466,7 +528,6 @@
         });
 
         function validateUninstalledProjects(tag, elementToUninstall, xmlPath, incText, targetConditions, supportedPlatforms) {
-            jasmine.getEnv().currentSpec.removeAllSpies();
 
             var projects = copyArray(dummyProject.projects);
             projects.push(dummyProject.master);
@@ -506,7 +567,7 @@
             var install = PluginHandler.getInstaller('source-file');
             var uninstall = PluginHandler.getUninstaller('source-file');
 
-            it('should remove stuff by calling common.removeFile', function () {
+            it('Test #031 : should remove stuff by calling common.removeFile', function () {
                 var source = copyArray(valid_source);
                 install(source[0], dummyPluginInfo, dummyProject);
                 uninstall(source[0], dummyPluginInfo, dummyProject);
@@ -519,7 +580,7 @@
             // project files, which is not needed.
             var install = PluginHandler.getInstaller('resource-file');
 
-            it('should remove from correct project files when conditions specified', function () {
+            it('Test #032 : should remove from correct project files when conditions specified', function () {
                 var resourcefiles = copyArray(valid_resourceFiles);
 
                 resourcefiles.forEach(function(resourceFile) {
@@ -529,21 +590,44 @@
                 var incText = resourcefiles[0].target;
                 var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x86'};
                 validateUninstalledProjects('resource-file', resourcefiles[0], path, incText, targetConditions, ['all']);
+            });
 
-                incText = resourcefiles[1].target;
-                targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
+            it('Test #033 : should remove from correct project files when conditions specified', function () {
+                var resourcefiles = copyArray(valid_resourceFiles);
+
+                resourcefiles.forEach(function(resourceFile) {
+                    install(resourceFile, dummyPluginInfo, dummyProject);
+                });
+                var path = 'ItemGroup/Content';
+                var incText = resourcefiles[1].target;
+                var targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
                 validateUninstalledProjects('resource-file', resourcefiles[1], path, incText, targetConditions, ['windows', 'phone', 'windows10']);
+            });
 
-                incText = resourcefiles[2].target;
-                targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
+            it('Test #034 : should remove from correct project files when conditions specified', function () {
+                var resourcefiles = copyArray(valid_resourceFiles);
+
+                resourcefiles.forEach(function(resourceFile) {
+                    install(resourceFile, dummyPluginInfo, dummyProject);
+                });
+                var path = 'ItemGroup/Content';
+                var incText = resourcefiles[2].target;
+                var targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
                 validateUninstalledProjects('resource-file', resourcefiles[2], path, incText, targetConditions, ['phone']);
+            });
 
-                incText = resourcefiles[3].target;
-                targetConditions = {versions: '8.0', deviceTarget: 'windows', arch: 'x64'};
+            it('Test #035 : should remove from correct project files when conditions specified', function () {
+                var resourcefiles = copyArray(valid_resourceFiles);
+                resourcefiles.forEach(function(resourceFile) {
+                    install(resourceFile, dummyPluginInfo, dummyProject);
+                });
+                var path = 'ItemGroup/Content';
+                var incText = resourcefiles[3].target;
+                var targetConditions = {versions: '8.0', deviceTarget: 'windows', arch: 'x64'};
                 validateUninstalledProjects('resource-file', resourcefiles[3], path, incText, targetConditions, ['windows8']);
             });
 
-            it('should remove from correct project files when conditions specified with reference', function () {
+            it('Test #036 : should remove from correct project files when conditions specified with reference', function () {
                 var resourcereferencefiles = copyArray(valid_resourcereferenceFiles);
 
                 resourcereferencefiles.forEach(function(resourceFile) {
@@ -553,17 +637,40 @@
                 var incText = computeResourcePath(resourcereferencefiles[0]);
                 var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x86'};
                 validateUninstalledProjects('resource-file', resourcereferencefiles[0], path, incText, targetConditions, ['all']);
+            });
+            it('Test #036 : should remove from correct project files when conditions specified with reference', function () {
+                var resourcereferencefiles = copyArray(valid_resourcereferenceFiles);
 
-                incText = computeResourcePath(resourcereferencefiles[1]);
-                targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
+                resourcereferencefiles.forEach(function(resourceFile) {
+                    install(resourceFile, resourcePluginInfo, dummyProject);
+                });
+                var path = 'ItemGroup/Content';
+                var incText = computeResourcePath(resourcereferencefiles[1]);
+                var targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
                 validateUninstalledProjects('resource-file', resourcereferencefiles[1], path, incText, targetConditions, ['windows', 'phone', 'windows10']);
+            });
 
-                incText = computeResourcePath(resourcereferencefiles[2]);
-                targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
+            it('Test #036 : should remove from correct project files when conditions specified with reference', function () {
+                var resourcereferencefiles = copyArray(valid_resourcereferenceFiles);
+
+                resourcereferencefiles.forEach(function(resourceFile) {
+                    install(resourceFile, resourcePluginInfo, dummyProject);
+                });
+                var path = 'ItemGroup/Content';
+                var incText = computeResourcePath(resourcereferencefiles[2]);
+                var targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
                 validateUninstalledProjects('resource-file', resourcereferencefiles[2], path, incText, targetConditions, ['phone']);
+            });
 
-                incText = computeResourcePath(resourcereferencefiles[3]);
-                targetConditions = {versions: '8.0', deviceTarget: 'windows', arch: 'x64'};
+            it('Test #036 : should remove from correct project files when conditions specified with reference', function () {
+                var resourcereferencefiles = copyArray(valid_resourcereferenceFiles);
+
+                resourcereferencefiles.forEach(function(resourceFile) {
+                    install(resourceFile, resourcePluginInfo, dummyProject);
+                });
+                var path = 'ItemGroup/Content';
+                var incText = computeResourcePath(resourcereferencefiles[3]);
+                var targetConditions = {versions: '8.0', deviceTarget: 'windows', arch: 'x64'};
                 validateUninstalledProjects('resource-file', resourcereferencefiles[3], path, incText, targetConditions, ['windows8']);
             });
         });
@@ -571,9 +678,8 @@
         describe('of <lib-file> elements', function () {
             // This could be separated into individual specs, but that results in a lot of copying and deleting the
             // project files, which is not needed.
-            it('should remove from correct project files when conditions specified', function () {
+            it('Test #033 : should remove from correct project files when conditions specified', function () {
                 var libfiles = copyArray(valid_libfiles);
-
                 libfiles.forEach(function(libfile) {
                     PluginHandler.getInstaller('lib-file')(libfile, dummyPluginInfo, dummyProject);
                 });
@@ -582,17 +688,41 @@
                 var incText = 'TestSDK1, Version=1.0';
                 var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x86'};
                 validateUninstalledProjects('lib-file', libfiles[0], path, incText, targetConditions, ['all']);
+            });
 
-                incText = 'TestSDK2, Version=1.0';
-                targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
+            it('Test #034 : should remove from correct project files when conditions specified', function () {
+                var libfiles = copyArray(valid_libfiles);
+                libfiles.forEach(function(libfile) {
+                    PluginHandler.getInstaller('lib-file')(libfile, dummyPluginInfo, dummyProject);
+                });
+
+                var path = 'ItemGroup/SDKReference';
+                var incText = 'TestSDK2, Version=1.0';
+                var targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
                 validateUninstalledProjects('lib-file', libfiles[1], path, incText, targetConditions, ['windows', 'phone', 'windows10']);
+            });
 
-                incText = 'TestSDK3, Version=1.0';
-                targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
+            it('Test #035 : should remove from correct project files when conditions specified', function () {
+                var libfiles = copyArray(valid_libfiles);
+                libfiles.forEach(function(libfile) {
+                    PluginHandler.getInstaller('lib-file')(libfile, dummyPluginInfo, dummyProject);
+                });
+
+                var path = 'ItemGroup/SDKReference';
+                var incText = 'TestSDK3, Version=1.0';
+                var targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
                 validateUninstalledProjects('lib-file', libfiles[2], path, incText, targetConditions, ['phone']);
+            });
 
-                incText = 'TestSDK4, Version=1.0';
-                targetConditions = {versions: '8.0', deviceTarget: 'windows', arch: 'x86'};
+            it('Test #036 : should remove from correct project files when conditions specified', function () {
+                var libfiles = copyArray(valid_libfiles);
+                libfiles.forEach(function(libfile) {
+                    PluginHandler.getInstaller('lib-file')(libfile, dummyPluginInfo, dummyProject);
+                });
+
+                var path = 'ItemGroup/SDKReference';
+                var incText = 'TestSDK4, Version=1.0';
+                var targetConditions = {versions: '8.0', deviceTarget: 'windows', arch: 'x86'};
                 validateUninstalledProjects('lib-file', libfiles[3], path, incText, targetConditions, ['windows8']);
             });
         });
@@ -600,7 +730,7 @@
        describe('of <framework> elements', function () {
             // This could be separated into individual specs, but that results in a lot of copying and deleting the
             // project files, which is not needed.
-            it('should remove from correct project files when conditions specified', function () {
+            it('Test #037 : should remove from correct project files when conditions specified', function () {
                 var curDir;
                 curDir = __dirname;
                 process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
@@ -611,30 +741,100 @@
                     PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
                 });
 
-
                 var path2 = 'ItemGroup/Reference';
                 var incText = 'dummy1';
                 var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x64'};
                 validateUninstalledProjects('framework', frameworks[0], path2, incText, targetConditions, ['all']);
 
-                incText = 'dummy2';
-                targetConditions = {versions: '>=8.0', deviceTarget: undefined, arch: undefined};
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
+
+            it('Test #038 : should remove from correct project files when conditions specified', function () {
+                var curDir;
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
+
+                var frameworks = copyArray(valid_frameworks);
+
+                frameworks.forEach(function(framework) {
+                    PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
+                });
+
+                var path2 = 'ItemGroup/Reference';
+                var incText = 'dummy2';
+                var targetConditions = {versions: '>=8.0', deviceTarget: undefined, arch: undefined};
                 validateUninstalledProjects('framework', frameworks[1], path2, incText, targetConditions, ['all']);
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
 
-                incText = 'dummy3';
-                targetConditions = {versions: undefined, deviceTarget: 'windows', arch: undefined};
+            it('Test #039 : should remove from correct project files when conditions specified', function () {
+                var curDir;
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
+
+                var frameworks = copyArray(valid_frameworks);
+
+                frameworks.forEach(function(framework) {
+                    PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
+                });
+
+                var path2 = 'ItemGroup/Reference';
+                var incText = 'dummy3';
+                var targetConditions = {versions: undefined, deviceTarget: 'windows', arch: undefined};
                 validateUninstalledProjects('framework', frameworks[2], path2, incText, targetConditions, ['windows', 'windows8', 'windows10']);
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
 
-                incText = 'dummy4';
-                targetConditions = {versions: '8.1', deviceTarget: 'phone', arch: 'ARM'};
+            it('Test #040 : should remove from correct project files when conditions specified', function () {
+                var curDir;
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
+
+                var frameworks = copyArray(valid_frameworks);
+
+                frameworks.forEach(function(framework) {
+                    PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
+                });
+
+                var path2 = 'ItemGroup/Reference';
+                var incText = 'dummy4';
+                var targetConditions = {versions: '8.1', deviceTarget: 'phone', arch: 'ARM'};
                 validateUninstalledProjects('framework', frameworks[3], path2, incText, targetConditions, ['phone']);
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
 
-                incText = 'dummy5';
-                targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
+            it('Test #041 : should remove from correct project files when conditions specified', function () {
+                var curDir;
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
+
+                var frameworks = copyArray(valid_frameworks);
+
+                frameworks.forEach(function(framework) {
+                    PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
+                });
+
+                var path2 = 'ItemGroup/Reference';
+                var incText = 'dummy5';
+                var targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
                 validateUninstalledProjects('framework', frameworks[4], path2, incText, targetConditions, ['phone']);
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
 
-                incText = 'dummy6';
-                targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
+            it('Test #042 : should remove from correct project files when conditions specified', function () {
+                var curDir;
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
+
+                var frameworks = copyArray(valid_frameworks);
+
+                frameworks.forEach(function(framework) {
+                    PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
+                });
+
+                var path2 = 'ItemGroup/Reference';
+                var incText = 'dummy6';
+                var targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
                 validateUninstalledProjects('framework', frameworks[5], path2, incText, targetConditions, ['windows', 'windows10', 'phone']);
 
                 process.chdir(path.join(curDir, '..', '..', '..'));
@@ -644,7 +844,7 @@
         describe('of <framework> elements of type \'projectReference\'', function () {
             // This could be separated into individual specs, but that results in a lot of copying and deleting the
             // project files, which is not needed.
-            it('should remove from correct project files when conditions specified', function () {
+            it('Test #043 :should remove from correct project files when conditions specified', function () {
                 var curDir;
                 curDir = __dirname;
                 process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
@@ -660,16 +860,63 @@
                 var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x64'};
                 validateUninstalledProjects('framework', frameworks[6], xmlPath, incText, targetConditions, ['all']);
 
-                incText = winJoin('..', '..', 'plugins', dummyPluginInfo.id, frameworks[7].src);
-                targetConditions = {versions: '<8.1', deviceTarget: undefined, arch: undefined};
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
+            it('Test #044 :should remove from correct project files when conditions specified', function () {
+                var curDir;
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
+
+                var frameworks = copyArray(valid_frameworks);
+
+                frameworks.forEach(function(framework) {
+                    PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
+                });
+
+                var xmlPath = 'ItemGroup/ProjectReference';
+
+                var incText = winJoin('..', '..', 'plugins', dummyPluginInfo.id, frameworks[7].src);
+                var targetConditions = {versions: '<8.1', deviceTarget: undefined, arch: undefined};
                 validateUninstalledProjects('framework', frameworks[7], xmlPath, incText, targetConditions, ['windows8']);
 
-                incText = winJoin('..', '..', 'plugins', dummyPluginInfo.id, frameworks[8].src);
-                targetConditions = {versions: undefined, deviceTarget: 'win', arch: undefined};
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
+
+            it('Test #045 :should remove from correct project files when conditions specified', function () {
+                var curDir;
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
+
+                var frameworks = copyArray(valid_frameworks);
+
+                frameworks.forEach(function(framework) {
+                    PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
+                });
+
+                var xmlPath = 'ItemGroup/ProjectReference';
+
+                var incText = winJoin('..', '..', 'plugins', dummyPluginInfo.id, frameworks[8].src);
+                var targetConditions = {versions: undefined, deviceTarget: 'win', arch: undefined};
                 validateUninstalledProjects('framework', frameworks[8], xmlPath, incText, targetConditions, ['windows', 'windows8', 'windows10']);
 
-                incText = winJoin('..', '..', 'plugins', dummyPluginInfo.id, frameworks[9].src);
-                targetConditions = {versions: '8.1', deviceTarget: 'all', arch: 'x86'};
+                process.chdir(path.join(curDir, '..', '..', '..'));
+            });
+
+            it('Test #046 :should remove from correct project files when conditions specified', function () {
+                var curDir;
+                curDir = __dirname;
+                process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
+
+                var frameworks = copyArray(valid_frameworks);
+
+                frameworks.forEach(function(framework) {
+                    PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
+                });
+
+                var xmlPath = 'ItemGroup/ProjectReference';
+
+                var incText = winJoin('..', '..', 'plugins', dummyPluginInfo.id, frameworks[9].src);
+                var targetConditions = {versions: '8.1', deviceTarget: 'all', arch: 'x86'};
                 validateUninstalledProjects('framework', frameworks[9], xmlPath, incText, targetConditions, ['windows', 'phone']);
 
                 process.chdir(path.join(curDir, '..', '..', '..'));
@@ -689,19 +936,19 @@
                 spyOn(shell, 'rm');
 
                 var existsSyncOrig = fs.existsSync;
-                spyOn(fs, 'existsSync').andCallFake(function (file) {
+                spyOn(fs, 'existsSync').and.callFake(function (file) {
                     if ([wwwDest, platformWwwDest].indexOf(file) >= 0 ) return true;
                     return existsSyncOrig.call(fs, file);
                 });
             });
 
-            it('should put module to both www and platform_www when options.usePlatformWww flag is specified', function () {
+            it('Test #047 : should put module to both www and platform_www when options.usePlatformWww flag is specified', function () {
                 uninstall(jsModule, dummyPluginInfo, dummyProject, {usePlatformWww: true});
                 expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), wwwDest);
                 expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), platformWwwDest);
             });
 
-            it('should put module to www only when options.usePlatformWww flag is not specified', function () {
+            it('Test #048 : should put module to www only when options.usePlatformWww flag is not specified', function () {
                 uninstall(jsModule, dummyPluginInfo, dummyProject);
                 expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), wwwDest);
                 expect(shell.rm).not.toHaveBeenCalledWith(jasmine.any(String), platformWwwDest);
@@ -720,19 +967,19 @@
                 spyOn(shell, 'rm');
 
                 var existsSyncOrig = fs.existsSync;
-                spyOn(fs, 'existsSync').andCallFake(function (file) {
+                spyOn(fs, 'existsSync').and.callFake(function (file) {
                     if ([wwwDest, platformWwwDest].indexOf(file) >= 0 ) return true;
                     return existsSyncOrig.call(fs, file);
                 });
             });
 
-            it('should put module to both www and platform_www when options.usePlatformWww flag is specified', function () {
+            it('Test #049 : should put module to both www and platform_www when options.usePlatformWww flag is specified', function () {
                 uninstall(asset, dummyPluginInfo, dummyProject, {usePlatformWww: true});
                 expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), wwwDest);
                 expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), platformWwwDest);
             });
 
-            it('should put module to www only when options.usePlatformWww flag is not specified', function () {
+            it('Test #050 : should put module to www only when options.usePlatformWww flag is not specified', function () {
                 uninstall(asset, dummyPluginInfo, dummyProject);
                 expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), wwwDest);
                 expect(shell.rm).not.toHaveBeenCalledWith(jasmine.any(String), platformWwwDest);
diff --git a/spec/unit/run.spec.js b/spec/unit/run.spec.js
index 6ffcda0..a17b58f 100644
--- a/spec/unit/run.spec.js
+++ b/spec/unit/run.spec.js
@@ -251,15 +251,15 @@
 
     it('spec.8 should accept --archs parameter either as cli or as platform arg', function(done) {
 
-        spyOn(utils, 'isCordovaProject').andReturn(true);
-        spyOn(packages, 'getPackage').andReturn(Q({ arch: 'arm' }));
-        spyOn(packages, 'deployToDesktop').andReturn(Q());
+        spyOn(utils, 'isCordovaProject').and.returnValue(true);
+        spyOn(packages, 'getPackage').and.returnValue(Q({ arch: 'arm' }));
+        spyOn(packages, 'deployToDesktop').and.returnValue(Q());
 
         var anyString = jasmine.any(String);
         var expectedDeployOptions = jasmine.objectContaining({arch: 'arm'});
 
         var fail = jasmine.createSpy('fail')
-        .andCallFake(function (err) {
+        .and.callFake(function (err) {
             console.error(err);
         });
 
@@ -284,9 +284,9 @@
 
     it('spec.9 should fall back to anycpu if --archs parameter is not specified', function(done) {
 
-        spyOn(utils, 'isCordovaProject').andReturn(true);
-        spyOn(packages, 'getPackage').andReturn(Q({ arch: 'anycpu' }));
-        spyOn(packages, 'deployToDesktop').andReturn(Q());
+        spyOn(utils, 'isCordovaProject').and.returnValue(true);
+        spyOn(packages, 'getPackage').and.returnValue(Q({ arch: 'anycpu' }));
+        spyOn(packages, 'deployToDesktop').and.returnValue(Q());
 
         var anyString = jasmine.any(String);
         var expectedDeployOptions = jasmine.objectContaining({arch: 'anycpu'});
