diff --git a/.jshintrc b/.jshintrc
deleted file mode 100644
index b5f288c..0000000
--- a/.jshintrc
+++ /dev/null
@@ -1,141 +0,0 @@
-// Defaults as of jshint edition 2011-04-16
-{
-  // If the scan should stop on first error.
-  "passfail": false,
-  // Maximum errors before stopping.
-  "maxerr": 50,
-
-
-  // Predefined globals
-  // If the standard browser globals should be predefined.
-  "browser": true,
-  // If the Node.js environment globals should be predefined.
-  "node": true,
-  // If the Rhino environment globals should be predefined.
-  "rhino": false,
-  // If CouchDB globals should be predefined.
-  "couch": false,
-  // If the Windows Scripting Host environment globals should be predefined.
-  "wsh": false,
-
-  // If jQuery globals should be predefined.
-  "jquery": false,
-  // If Prototype and Scriptaculous globals should be predefined.
-  "prototypejs": false,
-  // If MooTools globals should be predefined.
-  "mootools": false,
-  // If Dojo Toolkit globals should be predefined.
-  "dojo": false,
-
-  // Custom predefined globals.
-  "predef": ["jasmine", "blackberry", "define", "alert", "prompt", "org", "deviceapis", "Osp", "_cordovaExec", "WinJS", "Windows", "MSApp", "PalmSystem", "PalmServiceBridge", "Acceleration", "webworks", "CORDOVA_JS_BUILD_LABEL", "PLATFORM_VERSION_BUILD_LABEL"],
-
-
-  // Development
-  // If debugger statements should be allowed.
-  "debug": false,
-  // If logging globals should be predefined (console, alert, etc.).
-  "devel": false,
-
-
-  // ECMAScript 5
-  // If ES5 syntax should be allowed.
-  "es5": false,
-  // Require the "use strict"; pragma.
-  "strict": false,
-  // If global "use strict"; should be allowed (also enables strict).
-  "globalstrict": false,
-
-
-  // The Good Parts
-  // If automatic semicolon insertion should be tolerated.
-  "asi": false,
-  // If line breaks should not be checked, e.g. `return [\n] x`.
-  "laxbreak": false,
-  // If bitwise operators (&, |, ^, etc.) should not be allowed.
-  "bitwise": false,
-  // If assignments inside if, for and while should be allowed. Usually
-  // conditions and loops are for comparison, not assignments.
-  "boss": true,
-  // If curly braces around all blocks should be required.
-  "curly": false,
-  // If === should be required.
-  "eqeqeq": false,
-  // If == null comparisons should be tolerated.
-  "eqnull": false,
-  // If eval should be allowed.
-  "evil": true,
-  // If ExpressionStatement should be allowed as Programs.
-  "expr": true,
-  // If `for in` loops must filter with `hasOwnPrototype`.
-  "forin": false,
-  // If immediate invocations must be wrapped in parens, e.g.
-  // `( function(){}() );`.
-  "immed": false,
-  // If use before define should not be tolerated.
-  "latedef": false,
-  // If functions should be allowed to be defined within loops.
-  "loopfunc": true,
-  // If arguments.caller and arguments.callee should be disallowed.
-  "noarg": false,
-  // If the . should not be allowed in regexp literals.
-  "regexp": false,
-  // If unescaped first/last dash (-) inside brackets should be tolerated.
-  "regexdash": false,
-  // If script-targeted URLs should be tolerated.
-  "scripturl": false,
-  // If variable shadowing should be tolerated.
-  "shadow": false,
-  // If `new function () { ... };` and `new Object;` should be tolerated.
-  "supernew": false,
-  // If variables should be declared before used.
-  "undef": true,
-  // If `this` inside a non-constructor function is valid.
-  "validthis": false,
-  // If smarttabs should be tolerated
-  // (http://www.emacswiki.org/emacs/SmartTabs).
-  "smarttabs": false,
-  // If the `__proto__` property should be allowed.
-  "proto": false,
-  // If one case switch statements should be allowed.
-  "onecase": false,
-  // If non-standard (but widely adopted) globals should be predefined.
-  "nonstandard": false,
-  // Allow multiline strings.
-  "multistr": false,
-  // If line breaks should not be checked around commas.
-  "laxcomma": false,
-  // If semicolons may be omitted for the trailing statements inside of a
-  // one-line blocks.
-  "lastsemic": false,
-  // If the `__iterator__` property should be allowed.
-  "iterator": false,
-  // If only function scope should be used for scope tests.
-  "funcscope": false,
-  // If es.next specific syntax should be allowed.
-  "esnext": false,
-
-
-  // Style preferences
-  // If constructor names must be capitalized.
-  "newcap": false,
-  // If empty blocks should be disallowed.
-  "noempty": false,
-  // If using `new` for side-effects should be disallowed.
-  "nonew": false,
-  // If names should be checked for leading or trailing underscores
-  // (object._attribute would be disallowed).
-  "nomen": false,
-  // If only one var statement per function should be allowed.
-  "onevar": false,
-  // If increment and decrement (`++` and `--`) should not be allowed.
-  "plusplus": false,
-  // If all forms of subscript notation are tolerated.
-  "sub": false,
-  // If trailing whitespace rules apply.
-  "trailing": true,
-  // Specify indentation.
-  "indent": 4,
-  // If strict whitespace rules apply.
-  "white": false
-}
diff --git a/.travis.yml b/.travis.yml
index 6dee84f..cad87e2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -12,13 +12,7 @@
   - cd ..
   - git clone https://github.com/apache/cordova-android --depth 10
   - git clone https://github.com/apache/cordova-ios --depth 10
-  - git clone https://github.com/apache/cordova-blackberry --depth 10
   - git clone https://github.com/apache/cordova-windows --depth 10
-  - git clone https://github.com/apache/cordova-wp8 --depth 10
-  - git clone https://github.com/apache/cordova-firefoxos --depth 10
-  - git clone https://github.com/apache/cordova-ubuntu --depth 10
   - git clone https://github.com/apache/cordova-browser --depth 10
-  - git clone https://github.com/apache/cordova-amazon-fireos --depth 10
-  - git clone https://github.com/apache/cordova-webos --depth 10
   - cd cordova-js
   - npm install
diff --git a/Gruntfile.js b/Gruntfile.js
index ceda0f7..b99ade3 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -21,17 +21,11 @@
     grunt.initConfig({
         pkg: grunt.file.readJSON('package.json'),
         compile: {
-            "amazon-fireos": {},
             "android": {},
-            "blackberry10": {},
             "ios": {},
             "osx": {},
             "test": {},
             "windows": { useWindowsLineEndings: true },
-            "wp8": { useWindowsLineEndings: true },
-            "firefoxos": {},
-            "webos": {},
-            "ubuntu": {},
             "browser": {}
         },
         clean: ['pkg'],
@@ -44,8 +38,7 @@
     grunt.loadTasks('tasks');
 
     // defaults
-    grunt.registerTask('default', ['build', 'test']);
-    grunt.registerTask('build', ['compile', 'whitespace-check']);
+    grunt.registerTask('default', ['compile', 'test']);
     grunt.registerTask('test', ['compile:test', '_test']);
     grunt.registerTask('cover', ['compile', '_cover']);
 };
diff --git a/appveyor.yml b/appveyor.yml
index a6f74de..954f4d1 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -15,13 +15,8 @@
   - cd ..
   - git clone https://github.com/apache/cordova-android --depth 10
   - git clone https://github.com/apache/cordova-ios --depth 10
-  - git clone https://github.com/apache/cordova-blackberry --depth 10
   - git clone https://github.com/apache/cordova-windows --depth 10
-  - git clone https://github.com/apache/cordova-wp8 --depth 10
-  - git clone https://github.com/apache/cordova-ubuntu --depth 10
   - git clone https://github.com/apache/cordova-browser --depth 10
-  - git clone https://github.com/apache/cordova-amazon-fireos --depth 10
-  - git clone https://github.com/apache/cordova-webos --depth 10
   - cd cordova-js
   - npm install --msvs_version=2013
 
diff --git a/package.json b/package.json
index 2bc6b7a..71598cc 100644
--- a/package.json
+++ b/package.json
@@ -75,7 +75,6 @@
     "eslint-plugin-node": "^5.1.1",
     "eslint-plugin-promise": "^3.5.0",
     "eslint-plugin-standard": "^3.0.1",
-    "express": "^4.16.3",
     "grunt": "^1.0.1",
     "grunt-contrib-clean": "^1.0.0",
     "istanbul": "^0.4.5",
@@ -86,14 +85,8 @@
   "cordova-platforms": {
     "cordova-android": "../cordova-android",
     "cordova-ios": "../cordova-ios",
-    "cordova-blackberry10": "../cordova-blackberry",
-    "cordova-firefoxos": "../cordova-firefoxos",
-    "cordova-ubuntu": "../cordova-ubuntu",
-    "cordova-amazon-fireos": "../cordova-amazon-fireos",
-    "cordova-wp8": "../cordova-wp8",
     "cordova-windows": "../cordova-windows",
     "cordova-osx": "../cordova-osx",
-    "cordova-browser": "../cordova-browser",
-    "cordova-webos": "../cordova-webos"
+    "cordova-browser": "../cordova-browser"
   }
 }
diff --git a/src/legacy-exec/test/test/mockxhr.js b/src/legacy-exec/test/test/mockxhr.js
index c016523..b0a001d 100644
--- a/src/legacy-exec/test/test/mockxhr.js
+++ b/src/legacy-exec/test/test/mockxhr.js
@@ -19,8 +19,6 @@
  *
 */
 
-/* jshint -W020 */
-
 var utils = require('cordova/utils');
 var activeXhrs = [];
 var isInstalled = false;
diff --git a/src/legacy-exec/test/test/modulereplacer.js b/src/legacy-exec/test/test/modulereplacer.js
deleted file mode 100644
index cc3abd7..0000000
--- a/src/legacy-exec/test/test/modulereplacer.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *
- * 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.
- *
-*/
-
-/* eslint-disable no-undef */
-var propertyreplacer = require('cordova/test/propertyreplacer');
-
-exports.replace = function (moduleName, newValue) {
-    propertyreplacer.stub(define.moduleMap, moduleName, null);
-    define.remove(moduleName);
-    define(moduleName, function (require, exports, module) {
-        module.exports = newValue;
-    });
-};
-/* eslint-enable no-undef */
diff --git a/src/scripts/require.js b/src/scripts/require.js
index 5c9bcd2..24c6a16 100644
--- a/src/scripts/require.js
+++ b/src/scripts/require.js
@@ -19,9 +19,6 @@
  *
 */
 
-/* jshint -W079 */
-/* jshint -W020 */
-
 var require;
 var define;
 
diff --git a/tasks/lib/gv-requires.js b/tasks/lib/gv-requires.js
deleted file mode 100755
index 46d9bed..0000000
--- a/tasks/lib/gv-requires.js
+++ /dev/null
@@ -1,133 +0,0 @@
-#!/usr/bin/env node
-
-/*
- * 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.
- */
-
-fs   = require('fs')
-path = require('path')
-
-//------------------------------------------------------------------------------
-//process.chdir(path.join(__dirname, ".."))
-
-var platforms = getPlatforms()
-
-console.log("//-------------------------------------------------------")
-console.log("// graphviz .dot file for Cordova requires by platform")
-console.log("// http://www.graphviz.org/")
-console.log("// ")
-console.log("//   - ./build/gv-requires.js > ~/tmp/requires.dot")
-console.log("//   - [edit dot file to leave just one digraph]")
-console.log("//   - dot -Tsvg ~/tmp/requires.dot > ~/tmp/requires.svg")
-console.log("//   - [open svg file in a browser]")
-console.log("//-------------------------------------------------------")
-console.log("")
-
-for (var i=0; i<platforms.length; i++) {
-    var platform = platforms[i]
-    
-    generateGraph(platform)
-}
-
-//------------------------------------------------------------------------------
-function getPlatforms() {
-    var entries = fs.readdirSync(path.join(__dirname, '..', '..', "pkg"))
-    
-    var platforms = []
-    
-    for (var i=0; i<entries.length; i++) {
-        var entry = entries[i]
-        
-        var match = entry.match(/^cordova\.(.*)\.js$/)
-        if (match)
-            platforms.push(match[1])
-    }
-    
-    return platforms
-}
-
-//------------------------------------------------------------------------------
-function generateGraph(platform) {
-    var modules = {}
-    
-    var jsFile = path.join("pkg", "cordova." + platform + ".js")
-    
-    contents = fs.readFileSync(jsFile, 'utf-8')
-    contents = contents.replace(/\n/g, ' ')
-    
-    modulesSource = contents.split(/define\(/)
-    
-    console.log("//--------------------------------------------------")
-    console.log("// graphviz .dot file for " + platform)
-    console.log("//--------------------------------------------------")
-    console.log("digraph G {")
-    
-    for (var i=0; i< modulesSource.length; i++) {
-        var moduleSource = modulesSource[i];
-        
-        var match = moduleSource.match(/'(.*?)'(.*)/)
-        if (!match) continue
-        
-        var moduleName = match[1]
-        moduleSource   = match[2]
-        
-        if (moduleName.match(/\s/)) continue
-        if (moduleName   == "")     continue
-        if (moduleSource == "")     continue
-
-        modules[moduleName] = modules[moduleName] || []
-        // console.log("   found module " + moduleName)
-        
-        var requires = getRequires(moduleSource, modules[moduleName])
-        
-        for (var j=0; j < requires.length; j++) {
-            var gvModule  =  moduleName.replace(/\//g, '\\n')
-            var gvRequire = requires[j].replace(/\//g, '\\n')
-            
-            console.log('   "' + gvModule + '" -> "' + gvRequire + '";')
-        }
-        
-    }
-
-    console.log("}")
-    console.log("")
-}
-
-//------------------------------------------------------------------------------
-function getRequires(moduleSource, requires) {
-    var pattern = /.*?require\((.*?)\)(.*)/
-
-    var result = []
-//    console.log(moduleSource)
-    
-    var match = moduleSource.match(pattern)
-    
-    while (match) {
-        var require  = match[1]
-        moduleSource = match[2]
-        
-        require = require.replace(/'|"/g, '')
-        result.push(require)
-        
-        match = moduleSource.match(pattern)
-    }
-    
-    return result
-}
-
-    
diff --git a/tasks/lib/process-white-space.js b/tasks/lib/process-white-space.js
deleted file mode 100644
index 11fb316..0000000
--- a/tasks/lib/process-white-space.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF
- * or more contributor license agreements.  See th
- * distributed with this work for additional infor
- * regarding copyright ownership.  The ASF license
- * to you under the Apache License, Version 2.0 (t
- * "License"); you may not use this file except in
- * with the License.  You may obtain a copy of the
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to 
- * software distributed under the License is distr
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
- * KIND, either express or implied.  See the Licen
- * specific language governing permissions and lim
- * under the License.
- */
-
-var fs = require('fs');
-var path = require('path');
-
-// Iterates over a directory
-function forEachFile(root, cbFile, cbDone) {
-    var count = 0;
-
-    function scan(name) {
-        ++count;
-
-        fs.stat(name, function (err, stats) {
-            if (err) cbFile(err);
-
-            if (stats.isDirectory()) {
-                fs.readdir(name, function (err, files) {
-                    if (err) cbFile(err);
-
-                    files.forEach(function (file) {
-                        scan(path.join(name, file));
-                    });
-                    done();
-                });
-            } else if (stats.isFile()) {
-                cbFile(null, name, stats, done);
-            } else {
-                done();
-            }
-        });
-    }
-
-    function done() {
-        --count;
-        if (count === 0 && cbDone) cbDone();
-    }
-
-    scan(root);
-}
-
-module.exports = function processWhiteSpace(processor, callback) {
-
-    var rexp_minified = new RegExp("\\.min\\.js$");
-    var rexp_src = new RegExp('\\.js$');
-    
-    forEachFile('src', function(err, file, stats, cbDone) {
-        //if (err) throw err;
-        if (rexp_minified.test(file) || !rexp_src.test(file)) {
-            cbDone();
-        } else {
-            var origsrc = src = fs.readFileSync(file, 'utf8');
-
-            // tabs -> four spaces
-            if (src.indexOf('\t') >= 0) {
-                src = src.split('\t').join('    ');
-            }
-
-            // eliminate trailing white space
-            src = src.replace(/ +\n/g, '\n');
-
-            if (origsrc !== src) {
-                // write it out yo
-                processor(file, src);
-            }
-            cbDone();
-        }
-    }, callback);
-}
diff --git a/tasks/templates/suite.html b/tasks/templates/suite.html
deleted file mode 100644
index 7444a82..0000000
--- a/tasks/templates/suite.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!--
-
- 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.
-
--->
-
-<!DOCTYPE HTML>
-<html>
-<head>
-  <title>EXTERMINATE!</title>
-
-  <link rel="stylesheet" type="text/css" href="jasmine/jasmine.css">
-  <script type="text/javascript" src="jasmine-1.3.1.js"></script>
-  <script type="text/javascript" src="jasmine/jasmine-html.js"></script>
-
-  <script type="text/javascript">
-    (function() {
-      var jasmineEnv = jasmine.getEnv();
-      jasmineEnv.updateInterval = 1000;
-
-      var trivialReporter = new jasmine.TrivialReporter();
-
-      jasmineEnv.addReporter(trivialReporter);
-
-      jasmineEnv.specFilter = function(spec) {
-        return trivialReporter.specFilter(spec);
-      };
-
-      window.global = window;
-
-      window.addEventListener("load", function () {
-          jasmineEnv.execute();
-      });
-
-    })();
-  </script>
-
-  <script type="text/javascript" src="cordova.test.js"></script>
-
-  <script type="text/javascript">
-      var require = cordova.require;
-      var define = cordova.define;
-  </script>
-
-	<!-- ##TESTS## -->
-
-	<!-- Note: if you want to run individual tests, remove the tests placeholder above and include the individual tests yourself -->
-	<!-- <script src="test.accelerometer.js" type="text/javascript" charset="utf-8"></script> -->
-</head>
-
-<body>
-</body>
-</html>
diff --git a/tasks/vendor/jasmine/MIT.LICENSE b/tasks/vendor/jasmine/MIT.LICENSE
deleted file mode 100644
index 7c435ba..0000000
--- a/tasks/vendor/jasmine/MIT.LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2008-2011 Pivotal Labs
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/tasks/vendor/jasmine/jasmine-html.js b/tasks/vendor/jasmine/jasmine-html.js
deleted file mode 100644
index 423d3ea..0000000
--- a/tasks/vendor/jasmine/jasmine-html.js
+++ /dev/null
@@ -1,190 +0,0 @@
-jasmine.TrivialReporter = function(doc) {
-  this.document = doc || document;
-  this.suiteDivs = {};
-  this.logRunningSpecs = false;
-};
-
-jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
-  var el = document.createElement(type);
-
-  for (var i = 2; i < arguments.length; i++) {
-    var child = arguments[i];
-
-    if (typeof child === 'string') {
-      el.appendChild(document.createTextNode(child));
-    } else {
-      if (child) { el.appendChild(child); }
-    }
-  }
-
-  for (var attr in attrs) {
-    if (attr == "className") {
-      el[attr] = attrs[attr];
-    } else {
-      el.setAttribute(attr, attrs[attr]);
-    }
-  }
-
-  return el;
-};
-
-jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
-  var showPassed, showSkipped;
-
-  this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
-      this.createDom('div', { className: 'banner' },
-        this.createDom('div', { className: 'logo' },
-            this.createDom('span', { className: 'title' }, "Jasmine"),
-            this.createDom('span', { className: 'version' }, runner.env.versionString())),
-        this.createDom('div', { className: 'options' },
-            "Show ",
-            showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
-            this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
-            showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
-            this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
-            )
-          ),
-
-      this.runnerDiv = this.createDom('div', { className: 'runner running' },
-          this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
-          this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
-          this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
-      );
-
-  this.document.body.appendChild(this.outerDiv);
-
-  var suites = runner.suites();
-  for (var i = 0; i < suites.length; i++) {
-    var suite = suites[i];
-    var suiteDiv = this.createDom('div', { className: 'suite' },
-        this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
-        this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
-    this.suiteDivs[suite.id] = suiteDiv;
-    var parentDiv = this.outerDiv;
-    if (suite.parentSuite) {
-      parentDiv = this.suiteDivs[suite.parentSuite.id];
-    }
-    parentDiv.appendChild(suiteDiv);
-  }
-
-  this.startedAt = new Date();
-
-  var self = this;
-  showPassed.onclick = function(evt) {
-    if (showPassed.checked) {
-      self.outerDiv.className += ' show-passed';
-    } else {
-      self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
-    }
-  };
-
-  showSkipped.onclick = function(evt) {
-    if (showSkipped.checked) {
-      self.outerDiv.className += ' show-skipped';
-    } else {
-      self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
-    }
-  };
-};
-
-jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
-  var results = runner.results();
-  var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
-  this.runnerDiv.setAttribute("class", className);
-  //do it twice for IE
-  this.runnerDiv.setAttribute("className", className);
-  var specs = runner.specs();
-  var specCount = 0;
-  for (var i = 0; i < specs.length; i++) {
-    if (this.specFilter(specs[i])) {
-      specCount++;
-    }
-  }
-  var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
-  message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
-  this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
-
-  this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
-};
-
-jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
-  var results = suite.results();
-  var status = results.passed() ? 'passed' : 'failed';
-  if (results.totalCount === 0) { // todo: change this to check results.skipped
-    status = 'skipped';
-  }
-  this.suiteDivs[suite.id].className += " " + status;
-};
-
-jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
-  if (this.logRunningSpecs) {
-    this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
-  }
-};
-
-jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
-  var results = spec.results();
-  var status = results.passed() ? 'passed' : 'failed';
-  if (results.skipped) {
-    status = 'skipped';
-  }
-  var specDiv = this.createDom('div', { className: 'spec '  + status },
-      this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
-      this.createDom('a', {
-        className: 'description',
-        href: '?spec=' + encodeURIComponent(spec.getFullName()),
-        title: spec.getFullName()
-      }, spec.description));
-
-
-  var resultItems = results.getItems();
-  var messagesDiv = this.createDom('div', { className: 'messages' });
-  for (var i = 0; i < resultItems.length; i++) {
-    var result = resultItems[i];
-
-    if (result.type == 'log') {
-      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
-    } else if (result.type == 'expect' && result.passed && !result.passed()) {
-      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
-
-      if (result.trace.stack) {
-        messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
-      }
-    }
-  }
-
-  if (messagesDiv.childNodes.length > 0) {
-    specDiv.appendChild(messagesDiv);
-  }
-
-  this.suiteDivs[spec.suite.id].appendChild(specDiv);
-};
-
-jasmine.TrivialReporter.prototype.log = function() {
-  var console = jasmine.getGlobal().console;
-  if (console && console.log) {
-    if (console.log.apply) {
-      console.log.apply(console, arguments);
-    } else {
-      console.log(arguments); // IE fix: console.log.apply doesn't exist in IE
-    }
-  }
-};
-
-jasmine.TrivialReporter.prototype.getLocation = function() {
-  return this.document.location;
-};
-
-jasmine.TrivialReporter.prototype.specFilter = function(spec) {
-  var paramMap = {};
-  var params = this.getLocation().search.substring(1).split('&');
-  for (var i = 0; i < params.length; i++) {
-    var p = params[i].split('=');
-    paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
-  }
-
-  if (!paramMap.spec) {
-    return true;
-  }
-  return spec.getFullName().indexOf(paramMap.spec) === 0;
-};
diff --git a/tasks/vendor/jasmine/jasmine.css b/tasks/vendor/jasmine/jasmine.css
deleted file mode 100644
index 6583fe7..0000000
--- a/tasks/vendor/jasmine/jasmine.css
+++ /dev/null
@@ -1,166 +0,0 @@
-body {
-  font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
-}
-
-
-.jasmine_reporter a:visited, .jasmine_reporter a {
-  color: #303; 
-}
-
-.jasmine_reporter a:hover, .jasmine_reporter a:active {
-  color: blue; 
-}
-
-.run_spec {
-  float:right;
-  padding-right: 5px;
-  font-size: .8em;
-  text-decoration: none;
-}
-
-.jasmine_reporter {
-  margin: 0 5px;
-}
-
-.banner {
-  color: #303;
-  background-color: #fef;
-  padding: 5px;
-}
-
-.logo {
-  float: left;
-  font-size: 1.1em;
-  padding-left: 5px;
-}
-
-.logo .version {
-  font-size: .6em;
-  padding-left: 1em;
-}
-
-.runner.running {
-  background-color: yellow;
-}
-
-
-.options {
-  text-align: right;
-  font-size: .8em;
-}
-
-
-
-
-.suite {
-  border: 1px outset gray;
-  margin: 5px 0;
-  padding-left: 1em;
-}
-
-.suite .suite {
-  margin: 5px; 
-}
-
-.suite.passed {
-  background-color: #dfd;
-}
-
-.suite.failed {
-  background-color: #fdd;
-}
-
-.spec {
-  margin: 5px;
-  padding-left: 1em;
-  clear: both;
-}
-
-.spec.failed, .spec.passed, .spec.skipped {
-  padding-bottom: 5px;
-  border: 1px solid gray;
-}
-
-.spec.failed {
-  background-color: #fbb;
-  border-color: red;
-}
-
-.spec.passed {
-  background-color: #bfb;
-  border-color: green;
-}
-
-.spec.skipped {
-  background-color: #bbb;
-}
-
-.messages {
-  border-left: 1px dashed gray;
-  padding-left: 1em;
-  padding-right: 1em;
-}
-
-.passed {
-  background-color: #cfc;
-  display: none;
-}
-
-.failed {
-  background-color: #fbb;
-}
-
-.skipped {
-  color: #777;
-  background-color: #eee;
-  display: none;
-}
-
-
-/*.resultMessage {*/
-  /*white-space: pre;*/
-/*}*/
-
-.resultMessage span.result {
-  display: block;
-  line-height: 2em;
-  color: black;
-}
-
-.resultMessage .mismatch {
-  color: black;
-}
-
-.stackTrace {
-  white-space: pre;
-  font-size: .8em;
-  margin-left: 10px;
-  max-height: 5em;
-  overflow: auto;
-  border: 1px inset red;
-  padding: 1em;
-  background: #eef;
-}
-
-.finished-at {
-  padding-left: 1em;
-  font-size: .6em;
-}
-
-.show-passed .passed,
-.show-skipped .skipped {
-  display: block;
-}
-
-
-#jasmine_content {
-  position:fixed;
-  right: 100%;
-}
-
-.runner {
-  border: 1px solid gray;
-  display: block;
-  margin: 5px 0;
-  padding: 2px 0 2px 10px;
-}
diff --git a/tasks/whitespace.js b/tasks/whitespace.js
deleted file mode 100644
index e5dfa89..0000000
--- a/tasks/whitespace.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.
-*/
-var processWhiteSpace = require('./lib/process-white-space');
-var fs = require('fs');
-
-module.exports = function(grunt) {
-
-    grunt.registerTask('whitespace-check', 'Check for whitespace issues.', function() {
-        var done = this.async();
-        var complainedAboutWhitespace = false;
-        processWhiteSpace(function(file, newSource) {
-            if (!complainedAboutWhitespace) {
-                grunt.log.writeln("files with whitespace issues: (to fix: `grunt whitespace-fix`)");
-                complainedAboutWhitespace = true;
-            }
-            grunt.log.writeln("   " + file);
-        }, done);
-    });
-    
-    grunt.registerTask('whitespace-fix', 'Convert tabs to four spaces, eliminate trailing whitespace, convert newlines to proper form.', function() {
-        var done = this.async();
-        var complainedAboutWhitespace = false;
-        processWhiteSpace(function(file, newSource) {
-            if (!complainedAboutWhitespace) {
-                grunt.log.writeln("Fixed whitespace issues in:");
-                complainedAboutWhitespace = true;
-            }
-            fs.writeFileSync(file, newSource, 'utf8');
-            grunt.log.writeln("   " + file);
-        }, done);
-    });
-}
diff --git a/test/ios/test.exec.js b/test/ios/test.exec.js
index 984a1bf..828f89c 100644
--- a/test/ios/test.exec.js
+++ b/test/ios/test.exec.js
@@ -19,8 +19,6 @@
  *
 */
 
-/* jshint jasmine:true */
-
 describe('iOS exec', function () {
     var exec = require('cordova/ios/exec');
     var winSpy = jasmine.createSpy('win');
