diff --git a/Gruntfile.js b/Gruntfile.js
index ebf9a19..eee5161 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -34,20 +34,6 @@
             "ubuntu": {},
             "browser": {}
         },
-        "compile-browserify": {
-            "amazon-fireos": {},
-            "android": {},
-            "blackberry10": {},
-            "ios": {},
-            "osx": {},
-            "test": {},
-            "windows": { useWindowsLineEndings: true },
-            "wp8": { useWindowsLineEndings: true },
-            "firefoxos": {},
-            "webos": {},
-            "ubuntu": {},
-            "browser": {}
-        },
         clean: ['pkg'],
     });
 
@@ -63,6 +49,4 @@
     grunt.registerTask('test', ['compile:test', '_test']);
     grunt.registerTask('btest', ['compile:test', '_btest']);
     grunt.registerTask('cover', ['compile', '_cover']);
-    grunt.registerTask('test-browserify', ['compile-browserify:test', '_test']);
-    grunt.registerTask('btest-browserify', ['compile-browserify:test', '_btest']);
 };
diff --git a/README.md b/README.md
index 71ef136..d46fbbc 100644
--- a/README.md
+++ b/README.md
@@ -78,16 +78,6 @@
 
     grunt compile --android='../custompath/cordova-android' --ios='../custompath/cordova-ios'
 
-To create the browserify version of the js, run:
-
-    grunt compile-browserify --platformVersion=4.0.0
-
-To compile the browserify version of the js for just one platform, run:
-
-    grunt compile-browserify:android --platformVersion=4.0.0
-
-NOTE: browserify method does not support custom paths for platform repos.
-
 For integration, see the 'Integration' section below.
 
 ## Known Issues
diff --git a/package.json b/package.json
index b1faaae..f7843ff 100644
--- a/package.json
+++ b/package.json
@@ -18,8 +18,7 @@
     "eslint": "eslint src test pkg",
     "test": "grunt test && npm run eslint",
     "btest": "grunt btest && npm run eslint",
-    "build": "grunt compile",
-    "build-browserify": "grunt compile-browserify"
+    "build": "grunt compile"
   },
   "license": "Apache-2.0",
   "contributors": [
@@ -68,6 +67,7 @@
       "email": "stevengill97@gmail.com"
     }
   ],
+  "dependencies": {},
   "devDependencies": {
     "eslint": "^4.7.2",
     "eslint-config-semistandard": "^11.0.0",
@@ -84,9 +84,6 @@
     "jsdom-no-contextify": "^3.1.0",
     "mkdirp": "^0.5.0"
   },
-  "dependencies": {
-    "browserify": "14.4.0"
-  },
   "cordova-platforms": {
     "cordova-android": "../cordova-android",
     "cordova-ios": "../cordova-ios",
diff --git a/src/common/init_b.js b/src/common/init_b.js
deleted file mode 100644
index 336f098..0000000
--- a/src/common/init_b.js
+++ /dev/null
@@ -1,139 +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 channel = require('cordova/channel');
-var cordova = require('cordova');
-var modulemapper = require('cordova/modulemapper');
-var platform = require('cordova/platform');
-var pluginloader = require('cordova/pluginloader');
-var utils = require('cordova/utils');
-
-var platformInitChannelsArray = [channel.onDOMContentLoaded, channel.onNativeReady, channel.onPluginsReady];
-
-// setting exec
-cordova.exec = require('cordova/exec');
-
-function logUnfiredChannels (arr) {
-    for (var i = 0; i < arr.length; ++i) {
-        if (arr[i].state !== 2) {
-            console.log('Channel not fired: ' + arr[i].type);
-        }
-    }
-}
-
-window.setTimeout(function () {
-    if (channel.onDeviceReady.state !== 2) {
-        console.log('deviceready has not fired after 5 seconds.');
-        logUnfiredChannels(platformInitChannelsArray);
-        logUnfiredChannels(channel.deviceReadyChannelsArray);
-    }
-}, 5000);
-
-// Replace navigator before any modules are required(), to ensure it happens as soon as possible.
-// We replace it so that properties that can't be clobbered can instead be overridden.
-function replaceNavigator (origNavigator) {
-    var CordovaNavigator = function () {};
-    CordovaNavigator.prototype = origNavigator;
-    var newNavigator = new CordovaNavigator();
-    // This work-around really only applies to new APIs that are newer than Function.bind.
-    // Without it, APIs such as getGamepads() break.
-    if (CordovaNavigator.bind) {
-        for (var key in origNavigator) {
-            if (typeof origNavigator[key] === 'function') {
-                newNavigator[key] = origNavigator[key].bind(origNavigator);
-            } else {
-                (function (k) {
-                    utils.defineGetterSetter(newNavigator, key, function () {
-                        return origNavigator[k];
-                    });
-                })(key);
-            }
-        }
-    }
-    return newNavigator;
-}
-if (window.navigator) {
-    window.navigator = replaceNavigator(window.navigator);
-}
-
-if (!window.console) {
-    window.console = {
-        log: function () {}
-    };
-}
-if (!window.console.warn) {
-    window.console.warn = function (msg) {
-        this.log('warn: ' + msg);
-    };
-}
-
-// Register pause, resume and deviceready channels as events on document.
-channel.onPause = cordova.addDocumentEventHandler('pause');
-channel.onResume = cordova.addDocumentEventHandler('resume');
-channel.onActivated = cordova.addDocumentEventHandler('activated');
-channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready');
-
-// Listen for DOMContentLoaded and notify our channel subscribers.
-if (document.readyState === 'complete' || document.readyState === 'interactive') {
-    channel.onDOMContentLoaded.fire();
-} else {
-    document.addEventListener('DOMContentLoaded', function () {
-        channel.onDOMContentLoaded.fire();
-    }, false);
-}
-
-// _nativeReady is global variable that the native side can set
-// to signify that the native code is ready. It is a global since
-// it may be called before any cordova JS is ready.
-if (window._nativeReady) {
-    channel.onNativeReady.fire();
-}
-
-// Call the platform-specific initialization.
-platform.bootstrap && platform.bootstrap();
-
-// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js.
-// The delay allows the attached modules to be defined before the plugin loader looks for them.
-setTimeout(function () {
-    pluginloader.load(function () {
-        channel.onPluginsReady.fire();
-    });
-}, 0);
-
-/**
- * Create all cordova objects once native side is ready.
- */
-channel.join(function () {
-    modulemapper.mapModules(window);
-
-    platform.initialize && platform.initialize();
-
-    // Fire event to notify that all objects are created
-    channel.onCordovaReady.fire();
-
-    // Fire onDeviceReady event once page has fully loaded, all
-    // constructors have run and cordova info has been received from native
-    // side.
-    channel.join(function () {
-        require('cordova').fireDocumentEvent('deviceready');
-    }, channel.deviceReadyChannelsArray);
-
-}, platformInitChannelsArray);
diff --git a/src/common/modulemapper_b.js b/src/common/modulemapper_b.js
deleted file mode 100644
index 46dd1d3..0000000
--- a/src/common/modulemapper_b.js
+++ /dev/null
@@ -1,110 +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 builder = require('cordova/builder');
-var symbolList = [];
-var deprecationMap;
-
-exports.reset = function () {
-    symbolList = [];
-    deprecationMap = {};
-};
-
-function addEntry (strategy, moduleName, symbolPath, opt_deprecationMessage) {
-    symbolList.push(strategy, moduleName, symbolPath);
-    if (opt_deprecationMessage) {
-        deprecationMap[symbolPath] = opt_deprecationMessage;
-    }
-}
-
-// Note: Android 2.3 does have Function.bind().
-exports.clobbers = function (moduleName, symbolPath, opt_deprecationMessage) {
-    addEntry('c', moduleName, symbolPath, opt_deprecationMessage);
-};
-
-exports.merges = function (moduleName, symbolPath, opt_deprecationMessage) {
-    addEntry('m', moduleName, symbolPath, opt_deprecationMessage);
-};
-
-exports.defaults = function (moduleName, symbolPath, opt_deprecationMessage) {
-    addEntry('d', moduleName, symbolPath, opt_deprecationMessage);
-};
-
-exports.runs = function (moduleName) {
-    addEntry('r', moduleName, null);
-};
-
-function prepareNamespace (symbolPath, context) {
-    if (!symbolPath) {
-        return context;
-    }
-    var parts = symbolPath.split('.');
-    var cur = context;
-    for (var i = 0, part; part = parts[i]; ++i) { // eslint-disable-line no-cond-assign
-        cur = cur[part] = cur[part] || {};
-    }
-    return cur;
-}
-
-exports.mapModules = function (context) {
-    var origSymbols = {};
-    context.CDV_origSymbols = origSymbols;
-    for (var i = 0, len = symbolList.length; i < len; i += 3) {
-        var strategy = symbolList[i];
-        var moduleName = symbolList[i + 1];
-        var module = require(moduleName);
-        // <runs/>
-        if (strategy === 'r') {
-            continue;
-        }
-        var symbolPath = symbolList[i + 2];
-        var lastDot = symbolPath.lastIndexOf('.');
-        var namespace = symbolPath.substr(0, lastDot);
-        var lastName = symbolPath.substr(lastDot + 1);
-
-        var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;
-        var parentObj = prepareNamespace(namespace, context);
-        var target = parentObj[lastName];
-
-        if (strategy === 'm' && target) {
-            builder.recursiveMerge(target, module);
-        } else if ((strategy === 'd' && !target) || (strategy !== 'd')) {
-            if (!(symbolPath in origSymbols)) {
-                origSymbols[symbolPath] = target;
-            }
-            builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);
-        }
-    }
-};
-
-exports.getOriginalSymbol = function (context, symbolPath) {
-    var origSymbols = context.CDV_origSymbols;
-    if (origSymbols && (symbolPath in origSymbols)) {
-        return origSymbols[symbolPath];
-    }
-    var parts = symbolPath.split('.');
-    var obj = context;
-    for (var i = 0; i < parts.length; ++i) {
-        obj = obj && obj[parts[i]];
-    }
-    return obj;
-};
-
-exports.reset();
diff --git a/src/common/pluginloader_b.js b/src/common/pluginloader_b.js
deleted file mode 100644
index 418dc54..0000000
--- a/src/common/pluginloader_b.js
+++ /dev/null
@@ -1,62 +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 modulemapper = require('cordova/modulemapper');
-
-// Handler for the cordova_plugins.js content.
-// See plugman's plugin_loader.js for the details of this object.
-function handlePluginsObject (moduleList) {
-    // if moduleList is not defined or empty, we've nothing to do
-    if (!moduleList || !moduleList.length) {
-        return;
-    }
-
-    // Loop through all the modules and then through their clobbers and merges.
-    for (var i = 0, module; module = moduleList[i]; i++) { // eslint-disable-line no-cond-assign
-        if (module.clobbers && module.clobbers.length) {
-            for (var j = 0; j < module.clobbers.length; j++) {
-                modulemapper.clobbers(module.id, module.clobbers[j]);
-            }
-        }
-
-        if (module.merges && module.merges.length) {
-            for (var k = 0; k < module.merges.length; k++) {
-                modulemapper.merges(module.id, module.merges[k]);
-            }
-        }
-
-        // Finally, if runs is truthy we want to simply require() the module.
-        if (module.runs) {
-            modulemapper.runs(module.id);
-        }
-    }
-}
-
-// Loads all plugins' js-modules. Plugin loading is syncronous in browserified bundle
-// but the method accepts callback to be compatible with non-browserify flow.
-// onDeviceReady is blocked on onPluginsReady. onPluginsReady is fired when there are
-// no plugins to load, or they are all done.
-exports.load = function (callback) {
-    var moduleList = require('cordova/plugin_list');
-    handlePluginsObject(moduleList);
-
-    callback();
-};
diff --git a/src/cordova_b.js b/src/cordova_b.js
deleted file mode 100644
index 4e918f5..0000000
--- a/src/cordova_b.js
+++ /dev/null
@@ -1,242 +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.
- *
-*/
-
-// Workaround for Windows 10 in hosted environment case
-// http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object
-if (window.cordova && !(window.cordova instanceof HTMLElement)) { // eslint-disable-line no-undef
-    throw new Error('cordova already defined');
-}
-
-var channel = require('cordova/channel');
-var platform = require('cordova/platform');
-
-/**
- * Intercept calls to addEventListener + removeEventListener and handle deviceready,
- * resume, and pause events.
- */
-var m_document_addEventListener = document.addEventListener;
-var m_document_removeEventListener = document.removeEventListener;
-var m_window_addEventListener = window.addEventListener;
-var m_window_removeEventListener = window.removeEventListener;
-
-/**
- * Houses custom event handlers to intercept on document + window event listeners.
- */
-var documentEventHandlers = {};
-var windowEventHandlers = {};
-
-document.addEventListener = function (evt, handler, capture) {
-    var e = evt.toLowerCase();
-    if (typeof documentEventHandlers[e] !== 'undefined') {
-        documentEventHandlers[e].subscribe(handler);
-    } else {
-        m_document_addEventListener.call(document, evt, handler, capture);
-    }
-};
-
-window.addEventListener = function (evt, handler, capture) {
-    var e = evt.toLowerCase();
-    if (typeof windowEventHandlers[e] !== 'undefined') {
-        windowEventHandlers[e].subscribe(handler);
-    } else {
-        m_window_addEventListener.call(window, evt, handler, capture);
-    }
-};
-
-document.removeEventListener = function (evt, handler, capture) {
-    var e = evt.toLowerCase();
-    // If unsubscribing from an event that is handled by a plugin
-    if (typeof documentEventHandlers[e] !== 'undefined') {
-        documentEventHandlers[e].unsubscribe(handler);
-    } else {
-        m_document_removeEventListener.call(document, evt, handler, capture);
-    }
-};
-
-window.removeEventListener = function (evt, handler, capture) {
-    var e = evt.toLowerCase();
-    // If unsubscribing from an event that is handled by a plugin
-    if (typeof windowEventHandlers[e] !== 'undefined') {
-        windowEventHandlers[e].unsubscribe(handler);
-    } else {
-        m_window_removeEventListener.call(window, evt, handler, capture);
-    }
-};
-
-function createEvent (type, data) {
-    var event = document.createEvent('Events');
-    event.initEvent(type, false, false);
-    if (data) {
-        for (var i in data) {
-            if (data.hasOwnProperty(i)) {
-                event[i] = data[i];
-            }
-        }
-    }
-    return event;
-}
-
-/* eslint-disable no-undef */
-var cordova = {
-    platformVersion: PLATFORM_VERSION_BUILD_LABEL,
-    version: PLATFORM_VERSION_BUILD_LABEL,
-    require: require,
-    platformId: platform.id,
-
-    /* eslint-enable no-undef */
-
-    /**
-     * Methods to add/remove your own addEventListener hijacking on document + window.
-     */
-    addWindowEventHandler: function (event) {
-        return (windowEventHandlers[event] = channel.create(event));
-    },
-    addStickyDocumentEventHandler: function (event) {
-        return (documentEventHandlers[event] = channel.createSticky(event));
-    },
-    addDocumentEventHandler: function (event) {
-        return (documentEventHandlers[event] = channel.create(event));
-    },
-    removeWindowEventHandler: function (event) {
-        delete windowEventHandlers[event];
-    },
-    removeDocumentEventHandler: function (event) {
-        delete documentEventHandlers[event];
-    },
-    /**
-     * Retrieve original event handlers that were replaced by Cordova
-     *
-     * @return object
-     */
-    getOriginalHandlers: function () {
-        return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},
-            'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};
-    },
-    /**
-     * Method to fire event from native code
-     * bNoDetach is required for events which cause an exception which needs to be caught in native code
-     */
-    fireDocumentEvent: function (type, data, bNoDetach) {
-        var evt = createEvent(type, data);
-        if (typeof documentEventHandlers[type] !== 'undefined') {
-            if (bNoDetach) {
-                documentEventHandlers[type].fire(evt);
-            } else {
-                setTimeout(function () {
-                    // Fire deviceready on listeners that were registered before cordova.js was loaded.
-                    if (type === 'deviceready') {
-                        document.dispatchEvent(evt);
-                    }
-                    documentEventHandlers[type].fire(evt);
-                }, 0);
-            }
-        } else {
-            document.dispatchEvent(evt);
-        }
-    },
-    fireWindowEvent: function (type, data) {
-        var evt = createEvent(type, data);
-        if (typeof windowEventHandlers[type] !== 'undefined') {
-            setTimeout(function () {
-                windowEventHandlers[type].fire(evt);
-            }, 0);
-        } else {
-            window.dispatchEvent(evt);
-        }
-    },
-
-    /**
-     * Plugin callback mechanism.
-     */
-    // Randomize the starting callbackId to avoid collisions after refreshing or navigating.
-    // This way, it's very unlikely that any new callback would get the same callbackId as an old callback.
-    callbackId: Math.floor(Math.random() * 2000000000),
-    callbacks: {},
-    callbackStatus: {
-        NO_RESULT: 0,
-        OK: 1,
-        CLASS_NOT_FOUND_EXCEPTION: 2,
-        ILLEGAL_ACCESS_EXCEPTION: 3,
-        INSTANTIATION_EXCEPTION: 4,
-        MALFORMED_URL_EXCEPTION: 5,
-        IO_EXCEPTION: 6,
-        INVALID_ACTION: 7,
-        JSON_EXCEPTION: 8,
-        ERROR: 9
-    },
-    /**
-     * Called by native code when returning successful result from an action.
-     */
-    callbackSuccess: function (callbackId, args) {
-        this.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback);
-    },
-    /**
-     * Called by native code when returning error result from an action.
-     */
-    callbackError: function (callbackId, args) {
-        // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.
-        // Derive success from status.
-        this.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback);
-    },
-    /**
-     * Called by native code when returning the result from an action.
-     */
-    callbackFromNative: function (callbackId, isSuccess, status, args, keepCallback) {
-        try {
-            var callback = cordova.callbacks[callbackId];
-            if (callback) {
-                if (isSuccess && status === cordova.callbackStatus.OK) {
-                    callback.success && callback.success.apply(null, args);
-                } else if (!isSuccess) {
-                    callback.fail && callback.fail.apply(null, args);
-                }
-                /*
-                else
-                    Note, this case is intentionally not caught.
-                    this can happen if isSuccess is true, but callbackStatus is NO_RESULT
-                    which is used to remove a callback from the list without calling the callbacks
-                    typically keepCallback is false in this case
-                */
-
-                // Clear callback if not expecting any more results
-                if (!keepCallback) {
-                    delete cordova.callbacks[callbackId];
-                }
-            }
-        } catch (err) {
-            var msg = 'Error in ' + (isSuccess ? 'Success' : 'Error') + ' callbackId: ' + callbackId + ' : ' + err;
-            console && console.log && console.log(msg);
-            this.fireWindowEvent('cordovacallbackerror', { 'message': msg });
-            throw err;
-        }
-    },
-    addConstructor: function (func) {
-        channel.onCordovaReady.subscribe(function () {
-            try {
-                func();
-            } catch (e) {
-                console.log('Failed to run constructor: ' + e);
-            }
-        });
-    }
-};
-
-window.cordova = module.exports = cordova;
diff --git a/tasks/compile-browserify.js b/tasks/compile-browserify.js
deleted file mode 100644
index cfafff2..0000000
--- a/tasks/compile-browserify.js
+++ /dev/null
@@ -1,60 +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 fs = require('fs');
-var path = require('path');
-var pkgJson = require(process.cwd() + '/package.json');
-
-try {
-    require('browserify');
-} catch (e) {
-    console.error("\nbrowserify is not installed, you need to:\n\trun `npm install` from " + require('path').dirname(__dirname)+"\n");
-    process.exit(1);
-}
-
-var generate = require('./lib/packager-browserify');
-
-module.exports = function(grunt) {
-    grunt.registerMultiTask('compile-browserify', 'Packages cordova.js browserify style', function() {
-        var done = this.async();
-        var platformName = this.target;
-        var useWindowsLineEndings = this.data.useWindowsLineEndings;
-
-        //grabs --platformVersion flag
-        var flags = grunt.option.flags();
-        var platformVersion;
-        flags.forEach(function(flag) {
-            if (flag.indexOf('platformVersion') > -1) {
-                var equalIndex = flag.indexOf('=');
-                platformVersion = flag.slice(equalIndex + 1);
-            }
-        });
-        if(!platformVersion){
-            var platformPath = pkgJson['cordova-platforms']['cordova-'+platformName];
-            if(platformPath && fs.existsSync(platformPath)) {
-                var platformPkgJson = require('../' + platformPath +'/package.json');
-                platformVersion = platformPkgJson.version;
-            } else {
-                console.log('platformVersion not supplied. Setting platformVersion to N/A');
-                console.log('ex: grunt compile-browserify --platformVersion=3.6.0');
-                platformVersion = 'N/A';
-            }
-        }
-        generate(platformName, useWindowsLineEndings, platformVersion, platformPath, done);
-    });
-}
diff --git a/tasks/lib/bundle-browserify.js b/tasks/lib/bundle-browserify.js
deleted file mode 100644
index 8eaecb8..0000000
--- a/tasks/lib/bundle-browserify.js
+++ /dev/null
@@ -1,92 +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');
-var browserify   = require('browserify');
-var root         = path.join(__dirname, '..', '..');
-var pkgJson      = require('../../package.json');
-var collectFiles = require('./collect-files');
-var copyProps    = require('./copy-props');
-
-module.exports = function bundle(platform, debug, commitId, platformVersion, platformPath) {
-
-    if (fs.existsSync(platformPath) && fs.existsSync(path.join(platformPath, 'cordova-js-src'))) {
-        platformPath = path.join(platformPath, 'cordova-js-src');   
-    } else {
-        if(platform === 'test') {
-            platformPath = path.resolve(root, 'src', 'legacy-exec', platform);
-        } else {
-            console.log('Your version of '  + platform + ' does not contain cordova-js-src. Update to a newer version of ' + platform + '.');
-        }
-    }    
-
-    var platformDirname = platform === 'amazon-fireos' ? 'android' : platform;
-
-    var modules = {'cordova': path.resolve(root, 'src', 'cordova_b.js')};
-    copyProps(modules, collectFiles(path.resolve(root, 'src', 'common'), 'cordova'));
-    copyProps(modules, collectFiles(platformPath, 'cordova'));
-
-    // Replace standart initialization script with browserify's one
-    delete modules['cordova/init_b'];
-    delete modules['cordova/modulemapper_b'];
-    delete modules['cordova/pluginloader_b'];
-    modules['cordova/init'] = path.resolve(root, 'src', 'common', 'init_b.js');
-    modules['cordova/modulemapper'] = path.resolve(root, 'src', 'common', 'modulemapper_b.js');
-    modules['cordova/pluginloader'] = path.resolve(root, 'src', 'common', 'pluginloader_b.js');
-
-    // test doesn't support custom paths
-    if (platform === 'test') {
-        var androidPath = path.resolve(pkgJson['cordova-platforms']['cordova-android']);
-        var iosPath = path.resolve(pkgJson['cordova-platforms']['cordova-ios']);
-        var testFilesPath = path.resolve(androidPath, 'cordova-js-src', 'android');
-        // Add android platform-specific modules that have tests to the test bundle.
-        if(fs.existsSync(androidPath)) {
-            
-            modules['cordova/android/exec'] = path.resolve(androidPath, 'cordova-js-src', 'exec.js');
-        } else {
-            //testFilesPath = path.resolve('src', 'legacy-exec', 'android', 'android');
-            //modules['cordova/android/exec'] = path.resolve(root, 'src', 'legacy-exec', 'android', 'exec.js');
-            console.log('Couldn\'t add android test files.');
-            throw 'Stopped process';
-        }
-        copyProps(modules, collectFiles(testFilesPath, 'cordova/android'));
-
-        //Add iOS platform-specific modules that have tests for the test bundle.
-        if(fs.existsSync(iosPath)) {
-            modules['cordova/ios/exec'] = path.join(iosPath, 'cordova-js-src', 'exec.js');
-        } else {
-            //modules['cordova/ios/exec'] = path.resolve(root, 'src', 'legacy-exec', 'ios', 'exec.js');
-            console.log('Couldn\'t add iOS test files.');
-            throw 'Stopped process';
-        }
-        copyProps(modules, collectFiles(testFilesPath, 'cordova/ios'));
-    }
-
-    modules = Object.keys(modules)
-    .map(function (moduleId) {
-        return {
-            file: modules[moduleId],
-            expose: moduleId
-        };
-    });
-
-    return browserify({debug: !!debug, detectGlobals: false})
-        .require(modules)
-        .exclude('cordova/plugin_list');
-};
diff --git a/tasks/lib/packager-browserify.js b/tasks/lib/packager-browserify.js
deleted file mode 100644
index e5c8d41..0000000
--- a/tasks/lib/packager-browserify.js
+++ /dev/null
@@ -1,54 +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');
-var util               = require('util');
-var bundle             = require('./bundle-browserify');
-var computeCommitId    = require('./compute-commit-id');
-var writeLicenseHeader = require('./write-license-header');
-
-module.exports = function generate(platform, useWindowsLineEndings, platformVersion, platformPath, done) {
-    computeCommitId(function(commitId) {
-        var outReleaseFile, outReleaseFileStream,
-            outDebugFile, outDebugFileStream,
-            releaseBundle, debugBundle;
-        var time = new Date().valueOf();
-
-        if (!fs.existsSync('pkg')) {
-            fs.mkdirSync('pkg');
-        }
-
-        outReleaseFile = path.join('pkg', 'cordova.' + platform + '.js');
-        outReleaseFileStream = fs.createWriteStream(outReleaseFile);
-
-        // write license header
-        writeLicenseHeader(outReleaseFileStream, platform, commitId, platformVersion);
-
-        bundle(platform, false, commitId, platformVersion, platformPath)
-          .add(path.resolve(__dirname, '..', '..', 'src/scripts/bootstrap.js'))
-          .bundle()
-          .pipe(outReleaseFileStream);
-
-        outReleaseFileStream.on('finish', function() {
-          var newtime = new Date().valueOf() - time;
-          console.log('generated cordova.' + platform + '.js @ ' + commitId + ' in ' + newtime + 'ms');
-          done();
-        });
-    });
-};
diff --git a/tasks/lib/test-browser.js b/tasks/lib/test-browser.js
deleted file mode 100644
index 5933b9b..0000000
--- a/tasks/lib/test-browser.js
+++ /dev/null
@@ -1,92 +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 fs       = require('fs');
-var path     = require('path');
-
-var express  = require('express');
-
-var collect  = require('./collect');
-
-var testLibName    = path.join(__dirname, '..', '..', 'pkg', 'cordova.test.js');
-var testLib        = fs.readFileSync(testLibName, 'utf8');
-
-var pathToTemplate = path.join(__dirname, '..', 'templates', 'suite.html');
-var pathToVendor   = path.join(__dirname, '..', 'vendor');
-var pathToJasmine  = path.join(__dirname, '..', '..', 'node_modules', 'jasmine-node', 'lib', 'jasmine-node');
-var pathToTests    = path.join(__dirname, '..', '..', 'test');
-
-var template = fs.readFileSync(pathToTemplate, "utf-8");
-
-// middlewar for GET '/cordova.test.js'
-function cordovajs(req, res) {
-    res.writeHead(200, {
-        "Cache-Control": "no-cache",
-        "Content-Type": "text/javascript"
-    });
-    res.end(testLib);
-}
-
-// middleware for GET '/'
-function root(req, res) {
-    res.writeHead(200, {
-        "Cache-Control": "no-cache",
-        "Content-Type": "text/html"
-    });
-
-    //FIXME in place collect thing is atrocious
-    //create the script tags to include
-    var tests = [];
-    collect(path.join(__dirname, '..', '..', 'test'), tests);
-    var specs = tests.map(function (file, path) {
-        return '<script src="' + file.replace(/\\/g, '/').replace(/^.*\/test\//, "/") +
-            '" type="text/javascript" charset="utf-8"></script>';
-    }).join('\n');
-
-    template = template.replace(/<!-- ##TESTS## -->/g, specs);
-
-    // write the document
-    res.end(template);
-}
-
-// connect router defn
-function routes(app) {
-    app.get('/cordova.test.js', cordovajs);
-    app.get('/', root);
-}
-
-module.exports = function() {
-    console.log('starting browser-based tests');
-
-    var app = express();
-
-    app.set('port', 3000);
-
-    app.use(express.static(pathToVendor));
-    app.use(express.static(pathToJasmine));
-    app.use(express.static(pathToTests));
-
-    routes(app);
-
-    app.listen(3000, () => console.log('Test Server running on: http://localhost:3000'));
-};
-
diff --git a/tasks/lib/write-license-header.js b/tasks/lib/write-license-header.js
deleted file mode 100644
index f9a394b..0000000
--- a/tasks/lib/write-license-header.js
+++ /dev/null
@@ -1,39 +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 path        = require('path');
-var util        = require('util');
-var fs          = require('fs');
-var licensePath = path.join(__dirname, '..', 'templates', 'LICENSE-for-js-file.txt');
-
-module.exports = function(outStream, platform, commitId, platformVersion, symbolList) {
-  // some poppycock 
-  var licenseText = util.format("/*\n *%s\n */\n", fs.readFileSync(licensePath, 'utf8').replace(/\n/g, "\n *"));
-
-  outStream.write("// Platform: " + platform + "\n", 'utf8');
-  outStream.write("// "  + commitId + "\n", 'utf8');
-  outStream.write("// browserify" + "\n", 'utf8');
-  outStream.write(licenseText, 'utf8');
-  outStream.write("var PLATFORM_VERSION_BUILD_LABEL = '"  + platformVersion + "';\n", 'utf8');
-  outStream.write("var define = {moduleMap: []};\n", 'utf8');
-  //outStream.write(util.format("var symbolList = %s", JSON.stringify(symbolList)), 'utf8');
-
-}
