diff --git a/.eslintrc.yml b/.eslintrc.yml
index 0cccb8c..f2e63b6 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -1,10 +1,30 @@
-root: true
-extends: semistandard
-rules:
-  indent:
-    - error
-    - 4
-  camelcase: off
-  padded-blocks: off
-  operator-linebreak: off
-  no-throw-literal: off
\ No newline at end of file
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+extends: '@cordova/eslint-config/node'
+
+overrides:
+  - files: [spec/**/*.js]
+    extends: '@cordova/eslint-config/node-tests'
+
+  - files: [cordova-js-src/**/*.js]
+    extends: '@cordova/eslint-config/browser'
+
+    globals:
+      cordova: readonly
+      WinJS: readonly
+      Windows: readonly
diff --git a/.travis.yml b/.travis.yml
index a8cff29..84dd5fe 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,7 +13,7 @@
   - npm install -g codecov
 
 script:
-  - npm run eslint
+  - npm run lint
   - npm run cover
 
 after_script:
diff --git a/bin/create b/bin/create
index 9af5b0a..c0b229f 100755
--- a/bin/create
+++ b/bin/create
@@ -24,11 +24,11 @@
 var Api = require('../template/cordova/Api');
 
 var argv = require('nopt')({
-    'help': Boolean,
-    'guid': String,
-    'silent': Boolean,
-    'verbose': Boolean
-}, { 'd': '--verbose' });
+    help: Boolean,
+    guid: String,
+    silent: Boolean,
+    verbose: Boolean
+}, { d: '--verbose' });
 
 if (argv.help || argv.argv.remain.length === 0) {
     console.log('Usage: create PathToProject [ PackageName [ AppName [ CustomTemplate ] ] ] [--guid=<GUID string>]');
diff --git a/bin/lib/check_reqs.js b/bin/lib/check_reqs.js
index 5006f34..e3d9b5e 100644
--- a/bin/lib/check_reqs.js
+++ b/bin/lib/check_reqs.js
@@ -41,7 +41,7 @@
 // reference: https://msdn.microsoft.com/en-us/library/bb164659(v=vs.120).aspx
 var VS2013_UPDATE2_RC = new Version(12, 0, 30324);
 var REQUIRED_VERSIONS = {
-    '8.1': {
+    '8.1': { // eslint-disable-line quote-props
         os: '6.3',
         msbuild: '12.0',
         visualstudio: '12.0',
@@ -220,8 +220,8 @@
 
 function mapWindowsVersionToName (version) {
     var map = {
-        '6.2': 'Windows 8',
-        '6.3': 'Windows 8.1',
+        '6.2': 'Windows 8', // eslint-disable-line quote-props
+        '6.3': 'Windows 8.1', // eslint-disable-line quote-props
         '10.0': 'Windows 10'
     };
     var majorMinor = shortenVersion(version);
diff --git a/bin/lib/create.js b/bin/lib/create.js
index 6919145..ccbd33c 100644
--- a/bin/lib/create.js
+++ b/bin/lib/create.js
@@ -73,7 +73,7 @@
     shell.cp('-rf', path.join(root, 'VERSION'), projectPath);
 
     // copy node_modules to cordova directory
-    let nodeModulesDir = path.join(root, 'node_modules');
+    const nodeModulesDir = path.join(root, 'node_modules');
     if (fs.existsSync(nodeModulesDir)) {
         events.emit('verbose', 'Copying node_modules to ' + projectPath);
         shell.cp('-r', nodeModulesDir, path.join(projectPath, 'cordova'));
@@ -101,8 +101,8 @@
 
     // replace specific values in manifests' templates
     events.emit('verbose', 'Updating manifest files with project configuration.');
-    [ 'package.windows.appxmanifest', 'package.phone.appxmanifest',
-        'package.windows10.appxmanifest' ]
+    ['package.windows.appxmanifest', 'package.phone.appxmanifest',
+        'package.windows10.appxmanifest']
         .forEach(function (item) {
             var manifest = AppxManifest.get(path.join(projectPath, item));
             if (manifest.hasPhoneIdentity) {
diff --git a/bin/update b/bin/update
index 13e1c6e..0133ce9 100755
--- a/bin/update
+++ b/bin/update
@@ -21,10 +21,10 @@
 
 var Api = require('../template/cordova/Api');
 var args = require('nopt')({
-    'help': Boolean,
-    'silent': Boolean,
-    'verbose': Boolean
-}, { 'd': '--verbose' });
+    help: Boolean,
+    silent: Boolean,
+    verbose: Boolean
+}, { d: '--verbose' });
 
 if (args.help || args.argv.remain.length === 0) {
     console.log('WARNING : Make sure to back up your project before updating!');
diff --git a/cordova-js-src/.eslintrc.yml b/cordova-js-src/.eslintrc.yml
deleted file mode 100644
index 472e887..0000000
--- a/cordova-js-src/.eslintrc.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-env:
-    node: false
-    commonjs: true
-    browser: true
-
-globals:
-    cordova: readonly
-    WinJS: readonly
-    Windows: readonly
diff --git a/cordova-js-src/confighelper.js b/cordova-js-src/confighelper.js
index 0bc8c4a..2310857 100644
--- a/cordova-js-src/confighelper.js
+++ b/cordova-js-src/confighelper.js
@@ -110,11 +110,11 @@
  * @param {String} preferenceName Preference name to read */
 Config.prototype.getPreferenceValue = function (preferenceName) {
     var preferenceItem = this.preferences && this.preferences.filter(function (item) {
-        return item.attributes['name'].value === preferenceName;
+        return item.attributes.name.value === preferenceName;
     });
 
-    if (preferenceItem && preferenceItem[0] && preferenceItem[0].attributes && preferenceItem[0].attributes['value']) {
-        return preferenceItem[0].attributes['value'].value;
+    if (preferenceItem && preferenceItem[0] && preferenceItem[0].attributes && preferenceItem[0].attributes.value) {
+        return preferenceItem[0].attributes.value.value;
     }
 };
 
@@ -122,7 +122,7 @@
  * Reads SplashScreen image path
  */
 Manifest.prototype.getSplashScreenImagePath = function () {
-    return this.splashScreen.attributes['Image'].value;
+    return this.splashScreen.attributes.Image.value;
 };
 
 exports.readConfig = readConfig;
diff --git a/cordova-js-src/exec.js b/cordova-js-src/exec.js
index eb41bf9..23b2a17 100644
--- a/cordova-js-src/exec.js
+++ b/cordova-js-src/exec.js
@@ -40,7 +40,6 @@
  * @param {String[]} [args]     Zero or more arguments to pass to the method
  */
 module.exports = function (success, fail, service, action, args) {
-
     // Handle the case when we have an old version of splashscreen plugin to avoid the API calls failures
     if (service === 'SplashScreen') {
         var pluginsVersions = require('cordova/plugin_list').metadata;
@@ -111,7 +110,6 @@
                     });
             };
             proxy(onSuccess, onError, args);
-
         } catch (e) {
             console.log('Exception calling native with command :: ' + service + ' :: ' + action + ' ::exception=' + e);
         }
diff --git a/cordova-js-src/platform.js b/cordova-js-src/platform.js
index a3f2aca..d27edcb 100644
--- a/cordova-js-src/platform.js
+++ b/cordova-js-src/platform.js
@@ -71,8 +71,8 @@
                     });
                 }
 
-                if (e.detail.previousExecutionState === Windows.ApplicationModel.Activation.ApplicationExecutionState.running
-                        || e.detail.previousExecutionState === Windows.ApplicationModel.Activation.ApplicationExecutionState.suspended) {
+                if (e.detail.previousExecutionState === Windows.ApplicationModel.Activation.ApplicationExecutionState.running ||
+                        e.detail.previousExecutionState === Windows.ApplicationModel.Activation.ApplicationExecutionState.suspended) {
                     cordova.fireDocumentEvent('activated', platform.activationContext, true);
                     return;
                 }
@@ -133,7 +133,6 @@
 };
 
 function injectBackButtonHandler () {
-
     var app = WinJS.Application;
 
     // create document event handler for backbutton
@@ -167,9 +166,9 @@
         backButtonChannel.onHasSubscribersChange = function () {
             // If we just attached the first handler or detached the last handler,
             // let native know we need to override the back button.
-            navigationManager.appViewBackButtonVisibility = (this.numHandlers > 0) ?
-                Windows.UI.Core.AppViewBackButtonVisibility.visible :
-                Windows.UI.Core.AppViewBackButtonVisibility.collapsed;
+            navigationManager.appViewBackButtonVisibility = (this.numHandlers > 0)
+                ? Windows.UI.Core.AppViewBackButtonVisibility.visible
+                : Windows.UI.Core.AppViewBackButtonVisibility.collapsed;
         };
 
         navigationManager.addEventListener('backrequested', backRequestedHandler, false);
diff --git a/package.json b/package.json
index 49b90b5..cc85299 100644
--- a/package.json
+++ b/package.json
@@ -12,11 +12,11 @@
     "apache"
   ],
   "scripts": {
-    "test": "npm run eslint && npm run test-unit && npm run test-e2e",
+    "test": "npm run lint && npm run test-unit && npm run test-e2e",
     "test-unit": "jasmine",
     "test-e2e": "jasmine spec/e2e/endtoend.spec.js",
     "cover": "nyc jasmine",
-    "eslint": "eslint . \"+(bin|template)/**/!(*.*)\""
+    "lint": "eslint . \"+(bin|template)/**/!(*.*|gitignore)\""
   },
   "dependencies": {
     "cordova-common": "^3.2.0",
@@ -30,13 +30,7 @@
     "winjs": "^4.4.3"
   },
   "devDependencies": {
-    "eslint": "^5.12.0",
-    "eslint-config-semistandard": "^13.0.0",
-    "eslint-config-standard": "^12.0.0",
-    "eslint-plugin-import": "^2.14.0",
-    "eslint-plugin-node": "^8.0.1",
-    "eslint-plugin-promise": "^4.0.1",
-    "eslint-plugin-standard": "^4.0.0",
+    "@cordova/eslint-config": "^3.0.0",
     "jasmine": "^3.5.0",
     "nyc": "^15.0.1",
     "rewire": "^5.0.0"
diff --git a/spec/.eslintrc.yml b/spec/.eslintrc.yml
deleted file mode 100644
index 6afba65..0000000
--- a/spec/.eslintrc.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-env:
-    jasmine: true
\ No newline at end of file
diff --git a/spec/e2e/endtoend.spec.js b/spec/e2e/endtoend.spec.js
index b33e013..0e6ba81 100644
--- a/spec/e2e/endtoend.spec.js
+++ b/spec/e2e/endtoend.spec.js
@@ -29,7 +29,6 @@
 var PluginInfo = require('cordova-common').PluginInfo;
 
 describe('Cordova create and build', function () {
-
     var templateDir = path.join(__dirname, '../../template');
     var projectFolder = 'testcreate 応用';
     var workingDirectory = path.join(__dirname, '../../temp');
@@ -79,7 +78,6 @@
     });
 
     describe('Windows 10', function () {
-
         // default
 
         it('spec.2a should build default (win10) project', function () {
@@ -157,11 +155,9 @@
             _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_x64_Test', 'CordovaApp.Windows10_1.0.0.0_x64.appx');
             _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_x86_Test', 'CordovaApp.Windows10_1.0.0.0_x86.appx');
         });
-
     });
 
     describe('Windows 8.1', function () {
-
         beforeEach(function () {
             if (process.env.APPVEYOR_BUILD_WORKER_IMAGE === 'Visual Studio 2017' && process.env.MSBUILDDIR !== 'C:\\Program Files (x86)\\MSBuild\\14.0\\bin\\') {
                 pending('Windows 8.1 builds are not supported by Visual Studio 2017: https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2017-compatibility-vs#windows-store-and-windows-phone-apps');
@@ -254,7 +250,5 @@
             _expectSubdirAndFileExist('CordovaApp.Phone_1.0.0.0_arm_Test', 'CordovaApp.Phone_1.0.0.0_arm.appx');
             _expectSubdirAndFileExist('CordovaApp.Phone_1.0.0.0_x86_Test', 'CordovaApp.Phone_1.0.0.0_x86.appx');
         });
-
     });
-
 });
diff --git a/spec/unit/AppxManifest.spec.js b/spec/unit/AppxManifest.spec.js
index 882b1d3..51bc71d 100644
--- a/spec/unit/AppxManifest.spec.js
+++ b/spec/unit/AppxManifest.spec.js
@@ -30,7 +30,6 @@
 var CSS_COLOR_NAME = 'turquoise';
 
 describe('AppxManifest', function () {
-
     var XMLS = {
         '/no/prefixed': new et.ElementTree(et.XML('<?xml version="1.0" encoding="UTF-8"?><Package/>')),
         '/uap/prefixed': new et.ElementTree(et.XML('<?xml version="1.0" encoding="UTF-8"?><Package xmlns:uap=""/>'))
@@ -46,7 +45,6 @@
     });
 
     describe('constructor', function () {
-
         it('Test #000 : should create a new AppxManifest instance', function () {
             var manifest;
             expect(function () { manifest = new AppxManifest(WINDOWS_MANIFEST); }).not.toThrow();
@@ -103,7 +101,6 @@
     });
 
     describe('static get() method', function () {
-
         it('Test #008 : should return an AppxManifest instance', function () {
             expect(AppxManifest.get(WINDOWS_MANIFEST) instanceof AppxManifest).toBe(true);
         });
@@ -174,8 +171,8 @@
         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' }));
-            capabilities.append(new et.Element('uap:Capability', { 'Name': 'enterpriseAuthentication' }));
+            capabilities.append(new et.Element('uap:Capability', { Name: 'enterpriseAuthentication' }));
+            capabilities.append(new et.Element('uap:Capability', { Name: 'enterpriseAuthentication' }));
 
             var xml = manifest.writeToString();
 
diff --git a/spec/unit/ConfigChanges.spec.js b/spec/unit/ConfigChanges.spec.js
index 05f5ede..face9b5 100644
--- a/spec/unit/ConfigChanges.spec.js
+++ b/spec/unit/ConfigChanges.spec.js
@@ -48,9 +48,13 @@
 
     beforeEach(function () {
         shell.mkdir('-p', tempDir);
-        munge = { parents: { 'foo/bar': [
-            { before: undefined, count: 1, xml: '<DummyElement name="Dummy" />' }
-        ] } };
+        munge = {
+            parents: {
+                'foo/bar': [
+                    { before: undefined, count: 1, xml: '<DummyElement name="Dummy" />' }
+                ]
+            }
+        };
         munger = new PlatformMunger('windows', tempDir);
         spyOn(BaseMunger.prototype, 'apply_file_munge').and.callThrough();
     });
@@ -60,7 +64,6 @@
     });
 
     describe('apply_file_munge method', function () {
-
         it('should call parent\'s method with the same parameters', function () {
             munger.apply_file_munge(WINDOWS_MANIFEST, munge, false);
             expect(BaseMunger.prototype.apply_file_munge).toHaveBeenCalledWith(WINDOWS_MANIFEST, munge, false);
@@ -73,16 +76,24 @@
 
         it('should remove uap: capabilities added by windows prepare step', function () {
             // Generate a munge that contain non-prefixed capabilities changes
-            var baseMunge = { parents: { '/Package/Capabilities': [
-                // Emulate capability that was initially added with uap prefix
-                { before: undefined, count: 1, xml: '<uap:Capability Name=\"privateNetworkClientServer\">' }, /* eslint no-useless-escape : 0 */
-                { before: undefined, count: 1, xml: '<Capability Name=\"enterpriseAuthentication\">' } /* eslint no-useless-escape : 0 */
-            ] } };
+            var baseMunge = {
+                parents: {
+                    '/Package/Capabilities': [
+                        // Emulate capability that was initially added with uap prefix
+                        { before: undefined, count: 1, xml: '<uap:Capability Name=\"privateNetworkClientServer\">' }, /* eslint no-useless-escape : 0 */
+                        { before: undefined, count: 1, xml: '<Capability Name=\"enterpriseAuthentication\">' } /* eslint no-useless-escape : 0 */
+                    ]
+                }
+            };
 
-            var capabilitiesMunge = { parents: { '/Package/Capabilities': [
-                { before: undefined, count: 1, xml: '<uap:Capability Name=\"privateNetworkClientServer\">' },
-                { before: undefined, count: 1, xml: '<uap:Capability Name=\"enterpriseAuthentication\">' }
-            ] } };
+            var capabilitiesMunge = {
+                parents: {
+                    '/Package/Capabilities': [
+                        { before: undefined, count: 1, xml: '<uap:Capability Name=\"privateNetworkClientServer\">' },
+                        { before: undefined, count: 1, xml: '<uap:Capability Name=\"enterpriseAuthentication\">' }
+                    ]
+                }
+            };
             munger.apply_file_munge(WINDOWS10_MANIFEST, baseMunge, /* remove= */true);
             expect(BaseMunger.prototype.apply_file_munge).toHaveBeenCalledWith(WINDOWS10_MANIFEST, capabilitiesMunge, true);
         });
@@ -90,7 +101,6 @@
 });
 
 describe('Capabilities within package.windows.appxmanifest', function () {
-
     var testDir, windowsPlatform, windowsManifest, windowsManifest10, dummyPluginInfo, api;
 
     beforeEach(function () {
diff --git a/spec/unit/JsprojManager.spec.js b/spec/unit/JsprojManager.spec.js
index 936034e..f1a3ba6 100644
--- a/spec/unit/JsprojManager.spec.js
+++ b/spec/unit/JsprojManager.spec.js
@@ -35,12 +35,10 @@
     '</Package>'));
 
 describe('JsprojManager', function () {
-
     var project;
     var origProj = JsprojManager.__get__('proj');
 
     beforeEach(function () {
-
         JsprojManager.__set__('proj', jasmine.createSpy('proj'));
 
         spyOn(shell, 'ls').and.returnValue([PROJECT_PATH + '/CordovaApp.projitems']);
diff --git a/spec/unit/MRTImage.spec.js b/spec/unit/MRTImage.spec.js
index 2d5c050..1a07bb0 100644
--- a/spec/unit/MRTImage.spec.js
+++ b/spec/unit/MRTImage.spec.js
@@ -20,7 +20,6 @@
 var MRTImage = require('../../template/cordova/lib/MRTImage');
 
 describe('MRTImage class', function () {
-
     it('should be constructable', function () {
         expect(new MRTImage('some/path/Image.scale-240.png')).toBeDefined();
     });
diff --git a/spec/unit/MSBuildTools.spec.js b/spec/unit/MSBuildTools.spec.js
index 94c99ba..47ee796 100644
--- a/spec/unit/MSBuildTools.spec.js
+++ b/spec/unit/MSBuildTools.spec.js
@@ -143,18 +143,18 @@
     var availableVersions = ['10.0.10030.0', '10.0.10166.0', '10.0.10078.0'];
     var shellTest, shellLs;
     var programFilesx86Orig = process.env['ProgramFiles(x86)'];
-    var programFilesOrig = process.env['ProgramFiles'];
+    var programFilesOrig = process.env.ProgramFiles;
 
     beforeEach(function () {
         shellTest = spyOn(shell, 'test').and.returnValue(true);
         shellLs = spyOn(shell, 'ls').and.returnValue(availableVersions);
         process.env['ProgramFiles(x86)'] = '/';
-        process.env['ProgramFiles'] = '/';
+        process.env.ProgramFiles = '/';
     });
 
     afterEach(function () {
         process.env['ProgramFiles(x86)'] = programFilesx86Orig;
-        process.env['ProgramFiles'] = programFilesOrig;
+        process.env.ProgramFiles = programFilesOrig;
     });
 
     it('should return list of available versions', function () {
@@ -172,7 +172,7 @@
 
     it('should return empty array if it isn\'t able to detect SDK location', function () {
         delete process.env['ProgramFiles(x86)'];
-        delete process.env['ProgramFiles'];
+        delete process.env.ProgramFiles;
         expect(buildTools.getAvailableUAPVersions().length).toEqual(0);
     });
 
@@ -191,7 +191,6 @@
 });
 
 describe('getMSBuildToolsAt method', function () {
-
     var fakePath = '/some/fake/path';
     var messyPath = '/another/fake/path';
     var fakeVersion = '22.0.12635.5';
diff --git a/spec/unit/Prepare.Win10.spec.js b/spec/unit/Prepare.Win10.spec.js
index 847ed01..0740251 100644
--- a/spec/unit/Prepare.Win10.spec.js
+++ b/spec/unit/Prepare.Win10.spec.js
@@ -93,11 +93,9 @@
 }
 
 describe('Windows 8.1 project', function () {
-
     it('should not have an HTTP or HTTPS scheme for its startup URI.', function () {
-
         // arrange
-        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('index.html', { 'WindowsDefaultUriPrefix': 'http://' }, false);
+        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('index.html', { WindowsDefaultUriPrefix: 'http://' }, false);
 
         // act
         applyCoreProperties(mockConfig.config, mockConfig.manifest, 'fake-path', 'm2:', false);
@@ -107,9 +105,8 @@
     });
 
     it('should not have any scheme for its startup URI.', function () {
-
         // arrange
-        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('index.html', { 'WindowsDefaultUriPrefix': 'ms-appx://' }, false);
+        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('index.html', { WindowsDefaultUriPrefix: 'ms-appx://' }, false);
 
         // act
         applyCoreProperties(mockConfig.config, mockConfig.manifest, 'fake-path', 'm2:', false);
@@ -121,7 +118,6 @@
 
 describe('Windows 10 project', function () {
     it('should default to ms-appx-web for its startup URI.', function () {
-
         // arrange
         var mockConfig = createMockConfigAndManifestForApplyCoreProperties('index.html', { }, true);
 
@@ -137,9 +133,8 @@
     });
 
     it('should allow ms-appx as its startup URI, and it gets removed from the final output.', function () {
-
         // arrange
-        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('index.html', { 'WindowsDefaultUriPrefix': 'ms-appx://' }, true);
+        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('index.html', { WindowsDefaultUriPrefix: 'ms-appx://' }, true);
 
         // act
         applyStartPage(mockConfig.config, mockConfig.manifest, true);
@@ -149,9 +144,8 @@
     });
 
     it('should allow an HTTP or HTTPS scheme for its startup URI.', function () {
-
         // arrange
-        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('www.contoso.com/', { 'WindowsDefaultUriPrefix': 'http://' }, true);
+        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('www.contoso.com/', { WindowsDefaultUriPrefix: 'http://' }, true);
 
         // act
         applyStartPage(mockConfig.config, mockConfig.manifest, true);
@@ -162,11 +156,9 @@
 });
 
 describe('Windows Store preference', function () {
-
     it('"WindowsStoreDisplayName" should be reflected in the manifest.', function () {
-
         // arrange
-        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('www.contoso.com/', { 'WindowsDefaultUriPrefix': 'http://', 'WindowsStoreDisplayName': 'ContosoApp' }, true);
+        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('www.contoso.com/', { WindowsDefaultUriPrefix: 'http://', WindowsStoreDisplayName: 'ContosoApp' }, true);
 
         // act
         applyCoreProperties(mockConfig.config, mockConfig.manifest, 'fake-path', 'uap:', true);
@@ -176,9 +168,8 @@
     });
 
     it('"WindowsStorePublisherName" should be reflected in the manifest.', function () {
-
         // arrange
-        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('www.contoso.com/', { 'WindowsDefaultUriPrefix': 'http://', 'WindowsStorePublisherName': 'Contoso Inc' }, true);
+        var mockConfig = createMockConfigAndManifestForApplyCoreProperties('www.contoso.com/', { WindowsDefaultUriPrefix: 'http://', WindowsStorePublisherName: 'Contoso Inc' }, true);
 
         // act
         applyCoreProperties(mockConfig.config, mockConfig.manifest, 'fake-path', 'uap:', true);
@@ -189,7 +180,6 @@
 });
 
 describe('A Windows 10 project should warn if it supports remote mode and restricted capabilities.', function () {
-
     // arrange
     var mockConfig;
     var stringFound = false;
@@ -262,14 +252,14 @@
         }
 
         return rules.map(function (rule) {
-            return { 'origin': rule };
+            return { origin: rule };
         });
     };
 
     config.getAllowNavigations = function () {
         if (isWin10) {
             return rules.map(function (rule) {
-                return { 'href': rule };
+                return { href: rule };
             });
         }
 
@@ -286,7 +276,6 @@
 describe('Access rules management', function () {
     // body...
     it('A Windows 8.1 project should not have WindowsRuntimeAccess attributes in access rules.', function () {
-
         var mockConfig = createMockConfigAndManifestForApplyAccessRules(false, 'https://www.contoso.com');
 
         applyAccessRules(mockConfig.config, mockConfig.manifest);
@@ -300,11 +289,9 @@
         var rule = accessRules.getItem(0);
         expect(rule).toBeDefined();
         expect(rule.attrib.WindowsRuntimeAccess).toBeUndefined();
-
     });
 
     it('A Windows 10 project should have WindowsRuntimeAccess attributes in access rules.', function () {
-
         var mockConfig = createMockConfigAndManifestForApplyAccessRules(true, 'https://www.contoso.com');
 
         applyNavigationWhitelist(mockConfig.config, mockConfig.manifest, true);
@@ -319,11 +306,9 @@
         expect(rule).toBeDefined();
         expect(rule.attrib.WindowsRuntimeAccess).toBeDefined();
         expect(rule.attrib.WindowsRuntimeAccess).toBe('all');
-
     });
 
     describe('A Windows 8.1 project should reject http:// URI scheme rules.', function () {
-
         var stringIndex = -1;
         var searchStr = 'Access rules must begin with "https://", the following rule will be ignored: ';
 
@@ -342,7 +327,6 @@
     });
 
     describe('A Windows 10 project should accept http:// URI access rules.', function () {
-
         var stringIndex = -1;
         var searchStr = 'The following navigation rule had an invalid URI scheme and is ignored:';
         beforeEach(function () {
@@ -361,7 +345,6 @@
 });
 
 describe('A Windows 10 project should apply the uap: namespace prefix to certain capabilities.', function () {
-
     var manifest;
 
     beforeEach(function () {
diff --git a/spec/unit/Version.spec.js b/spec/unit/Version.spec.js
index e33702f..b33083e 100644
--- a/spec/unit/Version.spec.js
+++ b/spec/unit/Version.spec.js
@@ -20,7 +20,6 @@
 var Version = require('../../template/cordova/lib/Version.js');
 
 describe('Version constructor', function () {
-
     it('Test #000 : should behave correctly', function () {
         var v1 = new Version(1);
         expect(v1.major).toBe(1);
@@ -46,7 +45,6 @@
 });
 
 describe('Version parse functions work as expected.', function () {
-
     it('Test #001 : should behave correctly', function () {
         var version = Version.fromString('1.2.4.7');
         expect(version.major).toBe(1);
diff --git a/spec/unit/WindowsConfigParser.spec.js b/spec/unit/WindowsConfigParser.spec.js
index 926e03a..bae7059 100644
--- a/spec/unit/WindowsConfigParser.spec.js
+++ b/spec/unit/WindowsConfigParser.spec.js
@@ -38,7 +38,6 @@
  **/
 
 describe('getAllMinMaxUAPVersions method', function () {
-
     var mockConfig;
     beforeEach(function () {
         spyOn(xml, 'parseElementtreeSync').and.returnValue(new et.ElementTree(et.XML(TEST_XML)));
@@ -84,7 +83,6 @@
         expect(versionSet[0].Name).toBe('Windows.Universal');
         expect(versionSet[0].MinVersion).toBe(verBaseline);
         expect(versionSet[0].MaxVersionTested).toBe(verBaseline);
-
     });
 
     it('should fail with a RangeError if version specified incorrectly', function () {
diff --git a/spec/unit/build.spec.js b/spec/unit/build.spec.js
index 4023ea1..b703c9a 100644
--- a/spec/unit/build.spec.js
+++ b/spec/unit/build.spec.js
@@ -115,7 +115,7 @@
         utils.isCordovaProject.and.returnValue(false);
         createFindAllAvailableVersionsMock([{ version: '14.0', buildProject: buildSpy, path: testPath }]);
 
-        return build.run([ 'node', buildPath, '--release', '--debug' ]).then(
+        return build.run(['node', buildPath, '--release', '--debug']).then(
             () => fail('Expected promise to be rejected'),
             () => expect(buildSpy).not.toHaveBeenCalled()
         );
@@ -137,12 +137,11 @@
         createFindAvailableVersionMock('14.0', testPath, buildSpy);
 
         expect(function () {
-            build.run({ argv: [ '--phone', '--win' ] });
+            build.run({ argv: ['--phone', '--win'] });
         }).toThrow();
     });
 
     it('should respect build configuration from \'buildConfig\' option', function () {
-
         createFindAllAvailableVersionsMock([{ version: '14.0', buildProject: jasmine.createSpy(), path: testPath }]);
         var buildConfigPath = path.resolve(__dirname, 'fixtures/fakeBuildConfig.json');
 
@@ -182,7 +181,7 @@
 
         createFindAllAvailableVersionsMock([{ version: '14.0', buildProject: buildSpy, path: testPath }]);
 
-        return build.run([ 'node', buildPath ])
+        return build.run(['node', buildPath])
             .finally(function () {
                 expect(buildSpy).toHaveBeenCalled();
             });
@@ -422,7 +421,6 @@
 });
 
 describe('buildFlags', function () {
-
     describe('parseAndValidateArgs method', function () {
         var parseAndValidateArgs;
         var readFileSync;
@@ -441,7 +439,7 @@
                 argv: ['--buildFlag', 'foo=bar', '--buildFlag', 'bar=baz', '--buildConfig', 'buildConfig.json']
             };
 
-            expect(parseAndValidateArgs(buildOptions).buildFlags).toEqual([ 'baz="quux"', 'foo=bar', 'bar=baz' ]);
+            expect(parseAndValidateArgs(buildOptions).buildFlags).toEqual(['baz="quux"', 'foo=bar', 'bar=baz']);
         });
     });
 
@@ -472,7 +470,7 @@
                 .then(() => {
                     // CB-12416 AppxBundle=Never is present because we are not building a bundle
                     expect(buildTools.buildProject).toHaveBeenCalledWith(jasmine.any(String),
-                        jasmine.any(String), jasmine.any(String), [ 'foo=bar', '/p:AppxBundle=Never' ]);
+                        jasmine.any(String), jasmine.any(String), ['foo=bar', '/p:AppxBundle=Never']);
                 });
         });
     });
diff --git a/spec/unit/check_reqs.spec.js b/spec/unit/check_reqs.spec.js
index e7a65a1..e288406 100644
--- a/spec/unit/check_reqs.spec.js
+++ b/spec/unit/check_reqs.spec.js
@@ -28,7 +28,6 @@
 var check_reqs = rewire(path.join(binPath, 'lib/check_reqs.js'));
 
 describe('check_reqs module', function () {
-
     describe('has Requirement object', function () {
         var Requirement;
         beforeEach(function () {
@@ -145,5 +144,4 @@
                 });
         });
     });
-
 });
diff --git a/spec/unit/deployment.spec.js b/spec/unit/deployment.spec.js
index a93b63f..8c4517a 100644
--- a/spec/unit/deployment.spec.js
+++ b/spec/unit/deployment.spec.js
@@ -28,7 +28,6 @@
 var TEST_APP_PACKAGE_ID = '12121212-3434-3434-3434-567856785678';
 
 describe('The correct version of the app deployment tool is obtained.', function () {
-
     var mockedProgramFiles = process.env['ProgramFiles(x86)'];
 
     beforeEach(function () {
@@ -44,22 +43,17 @@
     });
 
     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('Test #001 : Provides a WinAppDeployCmdTool when 10.0 is requested.', function () {
-
         var tool = deployment.getDeploymentTool('10.0');
         expect(tool instanceof WinAppDeployCmdTool).toBe(true);
-
     });
 });
 
 describe('Windows 10 deployment interacts with the file system as expected.', function () {
-
     function fakeSpawn (cmd, args, cwd) {
         expect(cmd).toBe(path.join('c:/Program Files (x86)/Windows Kits/10/bin/x86/WinAppDeployCmd.exe'));
         switch (args[0]) {
@@ -77,7 +71,6 @@
             expect(args[2]).toBe(TEST_APP_PACKAGE_ID);
             expect(args[4]).toBe('10.120.68.150');
             return Q('');
-
         }
     }
 
@@ -135,7 +128,6 @@
 });
 
 describe('Windows 8.1 deployment interacts with the file system as expected.', function () {
-
     function fakeSpawn (cmd, args, cwd) {
         expect(cmd).toBe(path.join('c:/Program Files (x86)/Microsoft SDKs/Windows Phone/v8.1/Tools/AppDeploy/AppDeployCmd.exe'));
         switch (args[0]) {
@@ -158,7 +150,6 @@
 
         default:
             throw new Error('Unrecognized AppDeployCmd parameter "' + args[0] + '"');
-
         }
     }
 
diff --git a/spec/unit/pluginHandler/windows.spec.js b/spec/unit/pluginHandler/windows.spec.js
index a22c9ab..530db7f 100644
--- a/spec/unit/pluginHandler/windows.spec.js
+++ b/spec/unit/pluginHandler/windows.spec.js
@@ -128,7 +128,6 @@
         });
 
         function validateInstalledProjects (tag, elementToInstall, xpath, supportedPlatforms) {
-
             var projects = copyArray(dummyProject.projects);
             projects.push(dummyProject.master);
 
@@ -196,7 +195,6 @@
         }
 
         describe('of <source-file> elements', function () {
-
             var install = PluginHandler.getInstaller('source-file');
 
             it('Test #000 : should copy stuff from one location to another by calling common.copyFile', function () {
@@ -251,7 +249,6 @@
             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']);
-
             });
 
             it('Test #007 : should write to correct project files when conditions are specified with reference', function () {
@@ -526,7 +523,6 @@
         });
 
         function validateUninstalledProjects (tag, elementToUninstall, xmlPath, incText, targetConditions, supportedPlatforms) {
-
             var projects = copyArray(dummyProject.projects);
             projects.push(dummyProject.master);
 
diff --git a/spec/unit/run.spec.js b/spec/unit/run.spec.js
index 9b85396..c8c729f 100644
--- a/spec/unit/run.spec.js
+++ b/spec/unit/run.spec.js
@@ -77,7 +77,7 @@
             return Q.reject(); // rejecting to break run chain
         });
 
-        return run.run([ 'node', buildPath ]).then(
+        return run.run(['node', buildPath]).then(
             () => fail('Expected promise to be rejected'),
             () => expect(buildRun).not.toHaveBeenCalled()
         );
@@ -162,7 +162,7 @@
             return Q();
         });
 
-        return run.run([ 'node', buildPath, '--phone', '--break' ])
+        return run.run(['node', buildPath, '--phone', '--break'])
             .then(() => {
                 expect(build).toHaveBeenCalled();
                 expect(deployToPhone).toHaveBeenCalled();
@@ -204,7 +204,7 @@
             return Q();
         });
 
-        return run.run([ 'node', buildPath ])
+        return run.run(['node', buildPath])
             .finally(function () {
                 expect(build).toHaveBeenCalled();
                 expect(deployToDesktop).toHaveBeenCalled();
@@ -240,7 +240,6 @@
     });
 
     it('spec.8 should accept --archs parameter either as cli or as platform arg', function () {
-
         spyOn(utils, 'isCordovaProject').and.returnValue(true);
         spyOn(packages, 'getPackage').and.returnValue(Q({ arch: 'arm' }));
         spyOn(packages, 'deployToDesktop').and.returnValue(Q());
@@ -263,7 +262,6 @@
     });
 
     it('spec.9 should fall back to anycpu if --archs parameter is not specified', function () {
-
         spyOn(utils, 'isCordovaProject').and.returnValue(true);
         spyOn(packages, 'getPackage').and.returnValue(Q({ arch: 'anycpu' }));
         spyOn(packages, 'deployToDesktop').and.returnValue(Q());
diff --git a/template/cordova/Api.js b/template/cordova/Api.js
index b8103ca..c316444 100644
--- a/template/cordova/Api.js
+++ b/template/cordova/Api.js
@@ -147,7 +147,6 @@
  *   platform's file structure and other properties of platform.
  */
 Api.prototype.getPlatformInfo = function () {
-
     var result = {};
     result.locations = this.locations;
     result.root = this.root;
@@ -199,7 +198,6 @@
  *   CordovaError instance.
  */
 Api.prototype.addPlugin = function (plugin, installOptions) {
-
     var self = this;
 
     // We need to use custom PluginInfo to trigger windows-specific processing
diff --git a/template/cordova/build b/template/cordova/build
index 5ed8a3c..0d5137c 100644
--- a/template/cordova/build
+++ b/template/cordova/build
@@ -68,13 +68,13 @@
 
 // Do some basic argument parsing
 var buildOpts = nopt({
-    'silent': Boolean,
-    'verbose': Boolean,
-    'debug': Boolean,
-    'release': Boolean,
-    'nobuild': Boolean,
-    'buildConfig': path,
-    'buildFlag': [String, Array]
+    silent: Boolean,
+    verbose: Boolean,
+    debug: Boolean,
+    release: Boolean,
+    nobuild: Boolean,
+    buildConfig: path,
+    buildFlag: [String, Array]
 }, { d: '--verbose', r: '--release' });
 
 // Make buildOptions compatible with PlatformApi build method spec
diff --git a/template/cordova/clean b/template/cordova/clean
index fd283db..9480719 100644
--- a/template/cordova/clean
+++ b/template/cordova/clean
@@ -31,9 +31,9 @@
 
 // Do some basic argument parsing
 var opts = nopt({
-    'verbose': Boolean,
-    'silent': Boolean
-}, { 'd': '--verbose' });
+    verbose: Boolean,
+    silent: Boolean
+}, { d: '--verbose' });
 
 // Make buildOptions compatible with PlatformApi clean method spec
 opts.argv = opts.argv.original;
diff --git a/template/cordova/lib/AppxManifest.js b/template/cordova/lib/AppxManifest.js
index b2b7e90..372fb41 100644
--- a/template/cordova/lib/AppxManifest.js
+++ b/template/cordova/lib/AppxManifest.js
@@ -36,21 +36,21 @@
     'phoneCall', 'blockedChatMessages', 'objects3D'];
 
 var KNOWN_ORIENTATIONS = {
-    'default': ['portrait', 'landscape', 'landscapeFlipped'],
-    'portrait': ['portrait'],
-    'landscape': ['landscape', 'landscapeFlipped']
+    default: ['portrait', 'landscape', 'landscapeFlipped'],
+    portrait: ['portrait'],
+    landscape: ['landscape', 'landscapeFlipped']
 };
 
 var MANIFESTS = {
-    'windows': {
+    windows: {
         '8.1.0': 'package.windows.appxmanifest',
         '10.0.0': 'package.windows10.appxmanifest'
     },
-    'phone': {
+    phone: {
         '8.1.0': 'package.phone.appxmanifest',
         '10.0.0': 'package.windows10.appxmanifest'
     },
-    'all': {
+    all: {
         '8.1.0': ['package.windows.appxmanifest', 'package.phone.appxmanifest'],
         '10.0.0': 'package.windows10.appxmanifest'
     }
@@ -113,7 +113,6 @@
  * @return  {AppxManifest|Win10AppxManifest}  Manifest instance
  */
 AppxManifest.get = function (fileName, ignoreCache) {
-
     if (!ignoreCache && manifestCache[fileName]) {
         return manifestCache[fileName];
     }
@@ -289,7 +288,6 @@
             return description && description.text;
         },
         setDescription: function (text) {
-
             var description = properties.find('./Description');
 
             if (!text || text.length === 0) {
@@ -617,7 +615,6 @@
  *   appxmanifest
  */
 function sortCapabilities (manifest) {
-
     // removes namespace prefix (m3:Capability -> Capability)
     // this is required since elementtree returns qualified name with namespace
     function extractLocalName (tag) {
diff --git a/template/cordova/lib/ConfigChanges.js b/template/cordova/lib/ConfigChanges.js
index c6f7e21..1723f22 100644
--- a/template/cordova/lib/ConfigChanges.js
+++ b/template/cordova/lib/ConfigChanges.js
@@ -39,7 +39,6 @@
  *   need to be removed or added to the file
  */
 PlatformMunger.prototype.apply_file_munge = function (file, munge, remove) {
-
     // Create a copy to avoid modification of original munge
     var mungeCopy = cloneObject(munge);
     var capabilities = mungeCopy.parents[CAPS_SELECTOR];
@@ -93,7 +92,6 @@
  */
 function getUniqueCapabilities (capabilities) {
     return capabilities.reduce(function (uniqueCaps, currCap) {
-
         var isRepeated = uniqueCaps.some(function (cap) {
             return getCapabilityName(cap) === getCapabilityName(currCap);
         });
@@ -133,7 +131,6 @@
  * @return {Object} A list with 'uap'-prefixed capabilities
  */
 function generateUapCapabilities (capabilities) {
-
     function hasCapabilityChange (change) {
         return /^\s*<(\w+:)?(Device)?Capability\s/.test(change.xml);
     }
@@ -157,7 +154,6 @@
         .filter(hasCapabilityChange)
         // ... and create a duplicate with 'uap:' prefix
         .map(createPrefixedCapabilityChange);
-
 }
 
 exports.PlatformMunger = PlatformMunger;
diff --git a/template/cordova/lib/ConfigParser.js b/template/cordova/lib/ConfigParser.js
index e80521c..2dd6101 100644
--- a/template/cordova/lib/ConfigParser.js
+++ b/template/cordova/lib/ConfigParser.js
@@ -171,7 +171,7 @@
 
 // Returns the widget defaultLocale
 WindowsConfigParser.prototype.defaultLocale = function () {
-    return this.doc.getroot().attrib['defaultlocale'];
+    return this.doc.getroot().attrib.defaultlocale;
 };
 
 /**
diff --git a/template/cordova/lib/MSBuildTools.js b/template/cordova/lib/MSBuildTools.js
index b522609..625379d 100644
--- a/template/cordova/lib/MSBuildTools.js
+++ b/template/cordova/lib/MSBuildTools.js
@@ -227,7 +227,6 @@
 
     return this.findAllAvailableVersions()
         .then(function (allMsBuildVersions) {
-
             var availableVersions = allMsBuildVersions
                 .filter(function (buildTools) {
                     // Sanitize input - filter out tools w/ invalid versions
@@ -290,7 +289,7 @@
         '12.0': msBuild12TargetsFilter,
         '14.0': msBuild14TargetsFilter,
         '15.x': msBuild15TargetsFilter,
-        '15.5': msBuild155TargetsFilter,
+        '15.5': msBuild155TargetsFilter, // eslint-disable-line quote-props
         get: function (version) {
             // Apart from exact match also try to get filter for version range
             // so we can find for example targets for version '15.1'
@@ -367,7 +366,7 @@
 // returns an array of available UAP Versions
 // prepare.js
 module.exports.getAvailableUAPVersions = function () {
-    var programFilesFolder = process.env['ProgramFiles(x86)'] || process.env['ProgramFiles'];
+    var programFilesFolder = process.env['ProgramFiles(x86)'] || process.env.ProgramFiles;
     // No Program Files folder found, so we won't be able to find UAP SDK
     if (!programFilesFolder) return [];
 
diff --git a/template/cordova/lib/PluginHandler.js b/template/cordova/lib/PluginHandler.js
index 2231d46..f058c94 100644
--- a/template/cordova/lib/PluginHandler.js
+++ b/template/cordova/lib/PluginHandler.js
@@ -94,7 +94,7 @@
             project.removeSDKRef(inc, getTargetConditions(obj));
         }
     },
-    'framework': {
+    framework: {
         install: function (obj, plugin, project, options) {
             events.emit('verbose', 'windows framework install :: ' + plugin.id);
 
@@ -116,7 +116,6 @@
                 }
                 project.addReference(dest, getTargetConditions(obj), implementPath);
             }
-
         },
         uninstall: function (obj, plugin, project, options) {
             events.emit('verbose', 'windows framework uninstall :: ' + plugin.id);
diff --git a/template/cordova/lib/build.js b/template/cordova/lib/build.js
index eccb5c8..e40deda 100644
--- a/template/cordova/lib/build.js
+++ b/template/cordova/lib/build.js
@@ -48,7 +48,6 @@
 // builds cordova-windows application with parameters provided.
 // See 'help' function for args list
 module.exports.run = function run (buildOptions) {
-
     ROOT = this.root || ROOT;
 
     if (!utils.isCordovaProject(this.root)) {
@@ -62,7 +61,6 @@
 
     return MSBuildTools.getLatestMatchingMSBuild(selectedBuildTargets) // get latest msbuild tools
         .then(function (result) {
-
             var msbuild = result[0];
             var myBuildTargets = result[1];
 
@@ -192,16 +190,16 @@
 function parseAndValidateArgs (options) {
     // parse and validate args
     var args = nopt({
-        'archs': [String],
-        'appx': String,
-        'phone': Boolean,
-        'win': Boolean,
-        'bundle': Boolean,
-        'packageCertificateKeyFile': String,
-        'packageThumbprint': String,
-        'publisherId': String,
-        'buildConfig': String,
-        'buildFlag': [String, Array]
+        archs: [String],
+        appx: String,
+        phone: Boolean,
+        win: Boolean,
+        bundle: Boolean,
+        packageCertificateKeyFile: String,
+        packageThumbprint: String,
+        publisherId: String,
+        buildConfig: String,
+        buildFlag: [String, Array]
     }, {}, options.argv, 0);
 
     var config = {};
@@ -327,7 +325,6 @@
 }
 
 function buildTargets (config, myBuildTargets, msbuild) {
-
     var buildConfigs = [];
     var bundleTerms = '';
     var hasAnyCpu = false;
diff --git a/template/cordova/lib/deployment.js b/template/cordova/lib/deployment.js
index 080f936..ba9ace0 100644
--- a/template/cordova/lib/deployment.js
+++ b/template/cordova/lib/deployment.js
@@ -121,7 +121,7 @@
     DeploymentTool.call(this);
     this.targetOsVersion = targetOsVersion;
 
-    var programFilesPath = process.env['ProgramFiles(x86)'] || process.env['ProgramFiles'];
+    var programFilesPath = process.env['ProgramFiles(x86)'] || process.env.ProgramFiles;
     this.path = path.join(programFilesPath, 'Microsoft SDKs', 'Windows Phone', 'v' + this.targetOsVersion, 'Tools', 'AppDeploy', 'AppDeployCmd.exe');
 }
 
@@ -210,7 +210,7 @@
 
     DeploymentTool.call(this);
     this.targetOsVersion = targetOsVersion;
-    var programFilesPath = process.env['ProgramFiles(x86)'] || process.env['ProgramFiles'];
+    var programFilesPath = process.env['ProgramFiles(x86)'] || process.env.ProgramFiles;
     this.path = path.join(programFilesPath, 'Windows Kits', '10', 'bin', 'x86', 'WinAppDeployCmd.exe');
 }
 
diff --git a/template/cordova/lib/log.js b/template/cordova/lib/log.js
index ea88d55..a2ca51d 100644
--- a/template/cordova/lib/log.js
+++ b/template/cordova/lib/log.js
@@ -24,6 +24,7 @@
 var nopt = require('nopt');
 
 var spawn = require('cordova-common').superspawn.spawn;
+const { CordovaError } = require('cordova-common');
 var execSync = require('child_process').execSync;
 
 // paths
@@ -50,8 +51,8 @@
  * and prints them to console
  */
 module.exports.run = function (args) {
-    var knownOpts = { 'minutes': Number, 'dump': Boolean, 'help': Boolean };
-    var shortHands = { 'mins': ['--minutes'], 'h': ['--help'] };
+    var knownOpts = { minutes: Number, dump: Boolean, help: Boolean };
+    var shortHands = { mins: ['--minutes'], h: ['--help'] };
     var parsedOpts = nopt(knownOpts, shortHands, args, 0);
 
     if (parsedOpts.help) {
@@ -88,7 +89,7 @@
         }
     }).then(function () {
         if (!adminCurrentState && !appTracingCurrentState) {
-            throw 'No log channels enabled. Exiting...';
+            throw new CordovaError('No log channels enabled. Exiting...');
         }
         try {
             var config = new ConfigParser(configPath);
@@ -289,7 +290,7 @@
         multiLineWhitespace += ' ';
     }
 
-    if (event.hasOwnProperty(fieldName) && (typeof event[fieldName] !== 'undefined')) {
+    if (Object.prototype.hasOwnProperty.call(event, fieldName) && (typeof event[fieldName] !== 'undefined')) {
         event[fieldName] = event[fieldName].replace(/\n\s*/g, '\n' + multiLineWhitespace);
         return ('\n' + fieldShownName + ':' + whitespace + event[fieldName]).replace(/\n$/m, '');
     }
diff --git a/template/cordova/lib/package.js b/template/cordova/lib/package.js
index 5386074..a097884 100644
--- a/template/cordova/lib/package.js
+++ b/template/cordova/lib/package.js
@@ -166,12 +166,10 @@
 
 // returns array of available devices names
 module.exports.listDevices = function (deploymentTool) {
-
     return deploymentTool.enumerateDevices().then(function (deviceList) {
         return deviceList.map(function (device) {
             return device.toString();
         });
-
     }, function (e) {
         events.emit('error', new Error('Failed to list devices: ' + e));
     });
@@ -223,7 +221,6 @@
 
     return utils.getAppStoreUtils().then(function (appStoreUtils) {
         return getPackageName(path.join(__dirname, '..', '..')).then(function (pkgname) {
-
             var oldArch;
             // uninstalls previous application instance (if exists)
             events.emit('log', 'Attempting to uninstall previous application version...');
diff --git a/template/cordova/lib/prepare.js b/template/cordova/lib/prepare.js
index f09d08e..1538848 100644
--- a/template/cordova/lib/prepare.js
+++ b/template/cordova/lib/prepare.js
@@ -98,7 +98,7 @@
     certificatePropertyElement.text = packageCertificateKeyFile;
     propertyGroup.append(certificatePropertyElement);
 
-    var certificateItemElement = new et.Element('None', { 'Include': packageCertificateKeyFile });
+    var certificateItemElement = new et.Element('None', { Include: packageCertificateKeyFile });
     itemGroup.append(certificateItemElement);
 
     // packageThumbprint
@@ -114,9 +114,9 @@
     defaultLocaleElement.text = defaultLocale;
     propertyGroup.append(defaultLocaleElement);
 
-    var buildConfigFileName = buildConfig.buildType === 'release' ?
-        path.join(projectRoot, 'CordovaAppRelease.projitems') :
-        path.join(projectRoot, 'CordovaAppDebug.projitems');
+    var buildConfigFileName = buildConfig.buildType === 'release'
+        ? path.join(projectRoot, 'CordovaAppRelease.projitems')
+        : path.join(projectRoot, 'CordovaAppDebug.projitems');
 
     fs.writeFileSync(buildConfigFileName, TEMPLATE + buildConfigXML.write({ indent: 2, xml_declaration: false }), 'utf-8');
 };
@@ -273,7 +273,6 @@
  * Allows WinRT access to origins specified by <allow-navigation href="origin" /> elements.
  */
 function applyNavigationWhitelist (config, manifest) {
-
     if (manifest.prefix !== 'uap:') {
         // This never should happen, but to be sure let's check
         throw new Error('AllowNavigation whitelist rules must be applied to Windows 10 appxmanifest only.');
@@ -525,13 +524,12 @@
 
 // Updates manifests to match the app splash screen image types (PNG/JPG/JPEG)
 function updateSplashScreenImageExtensions (cordovaProject, locations) {
-
     // Saving all extensions used for targets to verify them later
     var extensionsUsed = {};
 
     function checkThatExtensionsAreNotMixed () {
         for (var target in extensionsUsed) {
-            if (extensionsUsed.hasOwnProperty(target)) {
+            if (Object.prototype.hasOwnProperty.call(extensionsUsed, target)) {
                 var extensionsUsedForTarget = extensionsUsed[target];
 
                 // Check that extensions are not mixed:
@@ -584,7 +582,7 @@
     manifestSplashScreenMap[MANIFEST_PHONE] = phoneSplashScreen;
 
     for (var manifest in manifestSplashScreenMap) {
-        if (manifestSplashScreenMap.hasOwnProperty(manifest)) {
+        if (Object.prototype.hasOwnProperty.call(manifestSplashScreenMap, manifest)) {
             var splashScreen = manifestSplashScreenMap[manifest];
             if (!splashScreen) {
                 return;
diff --git a/template/cordova/lib/run.js b/template/cordova/lib/run.js
index a0ac238..5e7f148 100644
--- a/template/cordova/lib/run.js
+++ b/template/cordova/lib/run.js
@@ -40,12 +40,12 @@
 
     // parse arg
     var args = nopt({
-        'archs': [String],
-        'phone': Boolean,
-        'win': Boolean,
-        'appx': String,
-        'win10tools': Boolean
-    }, { 'r': '--release' }, options.argv, 0);
+        archs: [String],
+        phone: Boolean,
+        win: Boolean,
+        appx: String,
+        win10tools: Boolean
+    }, { r: '--release' }, options.argv, 0);
 
     // Validate args
     if (options.debug && options.release) {
@@ -131,7 +131,7 @@
     try {
         // Check if ran from admin prompt and fail quickly if CLI has administrative permissions
         // http://stackoverflow.com/a/11995662/64949
-        execSync('net session', { 'stdio': 'ignore' });
+        execSync('net session', { stdio: 'ignore' });
         return true;
     } catch (e) {
         return false;
diff --git a/template/cordova/lib/target-list.js b/template/cordova/lib/target-list.js
index 616e944..87ac566 100644
--- a/template/cordova/lib/target-list.js
+++ b/template/cordova/lib/target-list.js
@@ -35,14 +35,12 @@
     console.log('    node target-list.js --started_emulators');
     console.log('    node target-list.js --all');
     console.log('');
-
 }
 
 // Handle help flag
 if (['--help', '/?', '-h', 'help', '-help', '/help'].indexOf(args[0]) > -1) {
     help();
 } else {
-
     var version = '8.1';
     if (args.indexOf('--win10') >= 0) {
         version = '10.0';
diff --git a/template/cordova/prebuild.js b/template/cordova/prebuild.js
index 0204424..ecf021b 100644
--- a/template/cordova/prebuild.js
+++ b/template/cordova/prebuild.js
@@ -30,20 +30,20 @@
     var url = require('url');
 
     var basejsSrcMap = {
-        '10': '/www/WinJS/js/base.js',
-        '8.1': '//Microsoft.WinJS.2.0/js/base.js',
+        '10': '/www/WinJS/js/base.js', // eslint-disable-line quote-props
+        '8.1': '//Microsoft.WinJS.2.0/js/base.js', // eslint-disable-line quote-props
         'phone-8.1': '//Microsoft.Phone.WinJS.2.1/js/base.js'
     };
     var escapedBasejsSrcMap = {
-        '10': '\/www\/WinJS\/js\/base\.js',
-        '8.1': '\/\/Microsoft\.WinJS\.2\.0\/js\/base\.js',
+        '10': '\/www\/WinJS\/js\/base\.js', // eslint-disable-line quote-props
+        '8.1': '\/\/Microsoft\.WinJS\.2\.0\/js\/base\.js', // eslint-disable-line quote-props
         'phone-8.1': '\/\/Microsoft\.Phone\.WinJS\.2\.1\/js\/base\.js'
     };
     var basejsSrc = basejsSrcMap[platform];
 
     var appxmanifestMap = {
-        '10': 'package.windows10.appxmanifest',
-        '8.1': 'package.windows.appxmanifest',
+        '10': 'package.windows10.appxmanifest', // eslint-disable-line quote-props
+        '8.1': 'package.windows.appxmanifest', // eslint-disable-line quote-props
         'phone-8.1': 'package.phone.appxmanifest'
     };
 
diff --git a/template/cordova/prepare b/template/cordova/prepare
index d042f00..1fc1edf 100644
--- a/template/cordova/prepare
+++ b/template/cordova/prepare
@@ -32,9 +32,9 @@
 
 // Do some basic argument parsing
 var opts = nopt({
-    'verbose': Boolean,
-    'silent': Boolean
-}, { 'd': '--verbose' });
+    verbose: Boolean,
+    silent: Boolean
+}, { d: '--verbose' });
 
 // Make buildOptions compatible with PlatformApi clean method spec
 opts.argv = opts.argv.original;
diff --git a/template/cordova/run b/template/cordova/run
index 704b37f..52cdcd5 100644
--- a/template/cordova/run
+++ b/template/cordova/run
@@ -63,15 +63,15 @@
 
 // Do some basic argument parsing
 var runOpts = nopt({
-    'silent': Boolean,
-    'verbose': Boolean,
-    'debug': Boolean,
-    'release': Boolean,
-    'nobuild': Boolean,
-    'device': Boolean,
-    'emulator': Boolean,
-    'target': String,
-    'buildConfig': path
+    silent: Boolean,
+    verbose: Boolean,
+    debug: Boolean,
+    release: Boolean,
+    nobuild: Boolean,
+    device: Boolean,
+    emulator: Boolean,
+    target: String,
+    buildConfig: path
 }, { d: '--verbose', r: '--release' });
 
 // Make buildOptions compatible with PlatformApi build method spec
