diff --git a/tasks/lib/bundle-browserify.js b/tasks/lib/bundle-browserify.js
index 668d1e9..a6b8687 100644
--- a/tasks/lib/bundle-browserify.js
+++ b/tasks/lib/bundle-browserify.js
@@ -30,11 +30,18 @@
     // XXX plugin_list is not present at this stage 
     b.ignore(path.join(root, 'src', 'common', 'plugin_list'));
 
-    b.transform(require_tr.transform);
+    b.transform(require_tr.transform, {'platform': platform});
 
-    b.add(path.join(root, 'src', platform, 'exec.js'));
-    
-    b.add(path.join(root, 'src', platform, 'platform.js'));
+    var cordovajssrc = path.join(process.cwd(), 'platforms', platform, 'platform_www', 'cordova-js-src');
+    //checks to see if browserify is run in a cli project and
+    //if the platform has a cordova-js-src to build cordova.js with
+    if(fs.existsSync(cordovajssrc)){ 
+        b.add(path.join(cordovajssrc, 'exec.js'));
+        b.add(path.join(cordovajssrc, 'platform.js'));
+    } else {
+        b.add(path.join(root, 'src', 'legacy-exec', platform, 'exec.js'));
+        b.add(path.join(root, 'src', 'legacy-exec', platform, 'platform.js'));
+    }
 
     b.add(path.join(root, 'src', 'scripts', 'bootstrap.js'));
 
diff --git a/tasks/lib/require-tr.js b/tasks/lib/require-tr.js
index a433b30..d8e1ff1 100644
--- a/tasks/lib/require-tr.js
+++ b/tasks/lib/require-tr.js
@@ -37,10 +37,11 @@
 
   init: function(platform) {
     this.platform = platform;
-    this.modules = [];
+    this.modules[platform] = [];
   },
 
-  transform: function(file) {
+  transform: function(file, platObj) {
+    this.platform = platObj.platform;
     var data = '';
 
     function write(buf) {
@@ -48,17 +49,18 @@
     }
 
     function end() {
-        // SOME BS pre-transforms
+      var platform = platObj.platform;
+      // SOME BS pre-transforms
       if(data.match(/clobbers\('cordova\/plugin\/android\/app/)) {
         // Checking for '\' from the windows path
         root = root.replace(/\\/g, '/');
 
         if(file.match(/android\/platform.js$/) || file.match(/android\\platform.js$/)) {
           data = data.replace(/modulemapper\.clobbers.*\n/,
-                              util.format('navigator.app = require("%s/src/android/plugin/android/app")', root));
+                              util.format('navigator.app = require("%s/src/legacy-exec/android/plugin/android/app")', root));
         } else if (file.match(/amazon-fireos\/platform.js$/) || file.match(/amazon-fireos\\platform.js$/)) {
           data = data.replace(/modulemapper\.clobbers.*\n/,
-                              util.format('navigator.app = require("%s/src/amazon-fireos/plugin/android/app")', root));
+                              util.format('navigator.app = require("%s/src/legacy-exec/amazon-fireos/plugin/android/app")', root));
         }
       }
 
@@ -75,40 +77,42 @@
                             'getOriginalSymbol(window');
       }
      
-      this.queue(_updateRequires(data));
+      this.queue(_updateRequires(data, platform));
       this.queue(null);
     }
    
     return through(write, end);
   },
-  hasModule: function(module) {
-    for(var i = 0, j = this.modules.length ; i < j ; i++) {
-      if(this.modules[i].symbol === module) {
+  hasModule: function(module, platform) {
+    if(this.modules[platform] === undefined) {
+      this.modules[platform] = [];
+    }
+    var platformModules = this.modules[platform];
+
+    for(var i = 0, j = platformModules.length ; i < j ; i++) {
+      if(platformModules[i].symbol === module) {
         return true;
       }
     }
     return false;
   },
-  getModules: function() {
-    return this.modules;
+  getModules: function(platform) {
+    return this.modules[platform];
   },
-  getPlatform: function() {
-    return this.platform;
-  },
-  addModule: function(module) {
+  addModule: function(module, platform) {
     if(!module || !module.symbol || !module.path) {
       throw new Error("Can't add module without a symbol and a path");
     }
-    this.modules.push(module);
+    this.modules[platform].push(module);
   },
-  modules:[],
+  modules:{},
   platform: null
 }
 
 /*
  * visits AST and modifies all the require('cordova/*') and require('org.apache.cordova.*')
  */
-function _updateRequires(code) {
+function _updateRequires(code, platform) {
   var ast = UglifyJS.parse(code);
 
   var before = new UglifyJS.TreeTransformer(function(node, descend) {
@@ -131,6 +135,8 @@
            module.indexOf("cordova") === 0) {
 
           var scriptpath;
+          var cordovajssrc = path.join(process.cwd(), "platforms", platform, "platform_www", "cordova-js-src")
+
 
           // require('cordova') -> cordova.js
           if(module === "cordova") {
@@ -141,24 +147,35 @@
                                     path.join(root, "src", "common", "init_b"));
           // android and amazon-fireos have some special require's
           } else if(module.match(/cordova\/(android|amazon-fireos)\/(.+)/)) {
-            scriptPath = node.args[0].value = module.replace(/cordova\/(android|amazon-fireos)\/(.+)/,
-                                    path.join(root, "src", "$1", "android", "$2"));
+                if(fs.existsSync(cordovajssrc)) {
+                    //cordova cli project with cordova-js-src in platform
+                    scriptPath = node.args[0].value = module.replace(/cordova\/(android|amazon-fireos)\/(.+)/, path.join(cordovajssrc, "android", "$2"));
+                } else {
+                    //non cli or no cordova-js-src directory
+                    scriptPath = node.args[0].value = module.replace(/cordova\/(android|amazon-fireos)\/(.+)/, path.join(root, "src", "legacy-exec", "$1", "android", "$2"));
+                }
           // require('cordova/exec') and require('cordova/platform') -> platform's exec/platform
-          } else if(module.match(/cordova\/(platform|exec)$/)) {
-            scriptPath = node.args[0].value = module.replace(/cordova\/(platform|exec)/,
-                                                path.join(root, "src", requireTr.getPlatform(), "$1"));
+          } else if(module.match(/cordova\/(platform|exec)$/)) {                
+                if(fs.existsSync(cordovajssrc)) {
+                    //cordova cli project with cordova-js-src in platform
+                    scriptPath = node.args[0].value = module.replace(/cordova\/(platform|exec)/, path.join(cordovajssrc, "$1"));
+                } else {
+                    //non cli or no cordova-js-src directory
+                    scriptPath = node.args[0].value = module.replace(/cordova\/(platform|exec)/, path.join(root, "src", "legacy-exec", platform, "$1"));
+                }
+            
           // require('cordova/anything') should be under common/
           } else if(module.match(/cordova\/(.+)/)) {
             scriptPath = node.args[0].value = module.replace(/cordova\/(.+)/,
                                     path.join(root, "src", "common", "$1"));
           }
-          if(requireTr.hasModule(module) === false) {
-            requireTr.addModule({symbol: module, path: scriptPath});
+          if(requireTr.hasModule(module, platform) === false) {
+            requireTr.addModule({symbol: module, path: scriptPath}, platform);
           }
         }
         else if(module !== undefined && ( module.indexOf("org.apache.cordova") !== -1 ||
                                           module.indexOf("./") === 0 || module.indexOf("../") === 0 ) ) {
-          var modules = requireTr.getModules();
+          var modules = requireTr.getModules(platform);
 
           if(module.indexOf("../") === 0){
             module = module.replace('../', '');
diff --git a/tasks/lib/write-license-header.js b/tasks/lib/write-license-header.js
index e736011..f9a394b 100644
--- a/tasks/lib/write-license-header.js
+++ b/tasks/lib/write-license-header.js
@@ -34,6 +34,6 @@
   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');
+  //outStream.write(util.format("var symbolList = %s", JSON.stringify(symbolList)), 'utf8');
 
 }
