You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by an...@apache.org on 2013/05/10 01:00:13 UTC

[11/43] git commit: Move www/ and merges/ into app/.

Move www/ and merges/ into app/.

The structure is now:
app/
  merges/
    android/
    ios/
  www/
  config.xml

All code, tests and docs are updated and everything is still working. This
is a breaking change for old projects, but it's fairly easy to perform the
move manually:
$ mkdir app
$ mv www/config.xml app
$ mv www app
$ mv merges app


Project: http://git-wip-us.apache.org/repos/asf/cordova-cli/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-cli/commit/740ff28d
Tree: http://git-wip-us.apache.org/repos/asf/cordova-cli/tree/740ff28d
Diff: http://git-wip-us.apache.org/repos/asf/cordova-cli/diff/740ff28d

Branch: refs/heads/master
Commit: 740ff28d73e0275a47cb16ff86b2d8542b0662fa
Parents: 2f39840
Author: Braden Shepherdson <br...@gmail.com>
Authored: Tue Apr 9 10:12:56 2013 -0400
Committer: Braden Shepherdson <br...@gmail.com>
Committed: Tue Apr 9 11:11:34 2013 -0400

----------------------------------------------------------------------
 README.md                                          |   81 +-
 bootstrap.js                                       |    4 +-
 spec/config_parser.spec.js                         |    3 +-
 spec/create.spec.js                                |    5 +-
 spec/metadata/android_parser.spec.js               |    8 +-
 spec/metadata/blackberry_parser.spec.js            |   10 +-
 spec/metadata/ios_parser.spec.js                   |    8 +-
 spec/platform.spec.js                              |    4 +-
 spec/serve.spec.js                                 |    2 +-
 src/compile.js                                     |    3 +-
 src/create.js                                      |   10 +-
 src/emulate.js                                     |    2 +-
 src/metadata/android_parser.js                     |    6 +-
 src/metadata/blackberry_parser.js                  |   10 +-
 src/metadata/ios_parser.js                         |    4 +-
 src/platform.js                                    |    6 +-
 src/plugin.js                                      |    4 +-
 src/prepare.js                                     |    2 +-
 src/serve.js                                       |    2 +-
 src/util.js                                        |    9 +
 templates/app/config.xml                           |   49 +
 templates/app/www/css/index.css                    |  100 +
 templates/app/www/img/cordova.png                  |  Bin 0 -> 19932 bytes
 templates/app/www/index.html                       |   24 +
 templates/app/www/js/index.js                      |   20 +
 templates/app/www/res/icon/cordova_128.png         |  Bin 0 -> 11401 bytes
 templates/app/www/res/icon/cordova_16.png          |  Bin 0 -> 1699 bytes
 templates/app/www/res/icon/cordova_24.png          |  Bin 0 -> 2215 bytes
 templates/app/www/res/icon/cordova_256.png         |  Bin 0 -> 27408 bytes
 templates/app/www/res/icon/cordova_32.png          |  Bin 0 -> 2843 bytes
 templates/app/www/res/icon/cordova_48.png          |  Bin 0 -> 4111 bytes
 templates/app/www/res/icon/cordova_512.png         |  Bin 0 -> 39830 bytes
 templates/app/www/res/icon/cordova_64.png          |  Bin 0 -> 5463 bytes
 templates/app/www/res/icon/cordova_android_36.png  |  Bin 0 -> 3096 bytes
 templates/app/www/res/icon/cordova_android_48.png  |  Bin 0 -> 4090 bytes
 templates/app/www/res/icon/cordova_android_72.png  |  Bin 0 -> 6080 bytes
 templates/app/www/res/icon/cordova_android_96.png  |  Bin 0 -> 7685 bytes
 templates/app/www/res/icon/cordova_bb_80.png       |  Bin 0 -> 7287 bytes
 templates/app/www/res/icon/cordova_ios_114.png     |  Bin 0 -> 7869 bytes
 templates/app/www/res/icon/cordova_ios_144.png     |  Bin 0 -> 11706 bytes
 templates/app/www/res/icon/cordova_ios_57.png      |  Bin 0 -> 3908 bytes
 templates/app/www/res/icon/cordova_ios_72.png      |  Bin 0 -> 4944 bytes
 .../app/www/res/screen/android_hdpi_landscape.png  |  Bin 0 -> 218302 bytes
 .../app/www/res/screen/android_hdpi_portrait.png   |  Bin 0 -> 222148 bytes
 .../app/www/res/screen/android_ldpi_landscape.png  |  Bin 0 -> 42616 bytes
 .../app/www/res/screen/android_ldpi_portrait.png   |  Bin 0 -> 42034 bytes
 .../app/www/res/screen/android_mdpi_landscape.png  |  Bin 0 -> 92347 bytes
 .../app/www/res/screen/android_mdpi_portrait.png   |  Bin 0 -> 90555 bytes
 .../app/www/res/screen/android_xhdpi_landscape.png |  Bin 0 -> 489604 bytes
 .../app/www/res/screen/android_xhdpi_portrait.png  |  Bin 0 -> 504508 bytes
 .../www/res/screen/blackberry_transparent_300.png  |  Bin 0 -> 15823 bytes
 .../www/res/screen/blackberry_transparent_400.png  |  Bin 0 -> 11001 bytes
 templates/app/www/res/screen/ipad_landscape.png    |  Bin 0 -> 407370 bytes
 templates/app/www/res/screen/ipad_portrait.png     |  Bin 0 -> 422441 bytes
 .../app/www/res/screen/ipad_retina_landscape.png   |  Bin 0 -> 1534088 bytes
 .../app/www/res/screen/ipad_retina_portrait.png    |  Bin 0 -> 1610434 bytes
 templates/app/www/res/screen/iphone_landscape.png  |  Bin 0 -> 92301 bytes
 templates/app/www/res/screen/iphone_portrait.png   |  Bin 0 -> 93897 bytes
 .../app/www/res/screen/iphone_retina_landscape.png |  Bin 0 -> 339639 bytes
 .../app/www/res/screen/iphone_retina_portrait.png  |  Bin 0 -> 350593 bytes
 .../app/www/res/screen/windows_phone_portrait.jpg  |  Bin 0 -> 11483 bytes
 templates/app/www/spec.html                        |   50 +
 templates/app/www/spec/helper.js                   |   11 +
 templates/app/www/spec/index.js                    |   49 +
 .../app/www/spec/lib/jasmine-1.2.0/MIT.LICENSE     |   20 +
 .../app/www/spec/lib/jasmine-1.2.0/jasmine-html.js |  616 ++++
 .../app/www/spec/lib/jasmine-1.2.0/jasmine.css     |   81 +
 .../app/www/spec/lib/jasmine-1.2.0/jasmine.js      | 2529 +++++++++++++++
 templates/www/config.xml                           |   49 -
 templates/www/css/index.css                        |  100 -
 templates/www/img/cordova.png                      |  Bin 19932 -> 0 bytes
 templates/www/index.html                           |   24 -
 templates/www/js/index.js                          |   20 -
 templates/www/res/icon/cordova_128.png             |  Bin 11401 -> 0 bytes
 templates/www/res/icon/cordova_16.png              |  Bin 1699 -> 0 bytes
 templates/www/res/icon/cordova_24.png              |  Bin 2215 -> 0 bytes
 templates/www/res/icon/cordova_256.png             |  Bin 27408 -> 0 bytes
 templates/www/res/icon/cordova_32.png              |  Bin 2843 -> 0 bytes
 templates/www/res/icon/cordova_48.png              |  Bin 4111 -> 0 bytes
 templates/www/res/icon/cordova_512.png             |  Bin 39830 -> 0 bytes
 templates/www/res/icon/cordova_64.png              |  Bin 5463 -> 0 bytes
 templates/www/res/icon/cordova_android_36.png      |  Bin 3096 -> 0 bytes
 templates/www/res/icon/cordova_android_48.png      |  Bin 4090 -> 0 bytes
 templates/www/res/icon/cordova_android_72.png      |  Bin 6080 -> 0 bytes
 templates/www/res/icon/cordova_android_96.png      |  Bin 7685 -> 0 bytes
 templates/www/res/icon/cordova_bb_80.png           |  Bin 7287 -> 0 bytes
 templates/www/res/icon/cordova_ios_114.png         |  Bin 7869 -> 0 bytes
 templates/www/res/icon/cordova_ios_144.png         |  Bin 11706 -> 0 bytes
 templates/www/res/icon/cordova_ios_57.png          |  Bin 3908 -> 0 bytes
 templates/www/res/icon/cordova_ios_72.png          |  Bin 4944 -> 0 bytes
 .../www/res/screen/android_hdpi_landscape.png      |  Bin 218302 -> 0 bytes
 templates/www/res/screen/android_hdpi_portrait.png |  Bin 222148 -> 0 bytes
 .../www/res/screen/android_ldpi_landscape.png      |  Bin 42616 -> 0 bytes
 templates/www/res/screen/android_ldpi_portrait.png |  Bin 42034 -> 0 bytes
 .../www/res/screen/android_mdpi_landscape.png      |  Bin 92347 -> 0 bytes
 templates/www/res/screen/android_mdpi_portrait.png |  Bin 90555 -> 0 bytes
 .../www/res/screen/android_xhdpi_landscape.png     |  Bin 489604 -> 0 bytes
 .../www/res/screen/android_xhdpi_portrait.png      |  Bin 504508 -> 0 bytes
 .../www/res/screen/blackberry_transparent_300.png  |  Bin 15823 -> 0 bytes
 .../www/res/screen/blackberry_transparent_400.png  |  Bin 11001 -> 0 bytes
 templates/www/res/screen/ipad_landscape.png        |  Bin 407370 -> 0 bytes
 templates/www/res/screen/ipad_portrait.png         |  Bin 422441 -> 0 bytes
 templates/www/res/screen/ipad_retina_landscape.png |  Bin 1534088 -> 0 bytes
 templates/www/res/screen/ipad_retina_portrait.png  |  Bin 1610434 -> 0 bytes
 templates/www/res/screen/iphone_landscape.png      |  Bin 92301 -> 0 bytes
 templates/www/res/screen/iphone_portrait.png       |  Bin 93897 -> 0 bytes
 .../www/res/screen/iphone_retina_landscape.png     |  Bin 339639 -> 0 bytes
 .../www/res/screen/iphone_retina_portrait.png      |  Bin 350593 -> 0 bytes
 .../www/res/screen/windows_phone_portrait.jpg      |  Bin 11483 -> 0 bytes
 templates/www/spec.html                            |   50 -
 templates/www/spec/helper.js                       |   11 -
 templates/www/spec/index.js                        |   49 -
 templates/www/spec/lib/jasmine-1.2.0/MIT.LICENSE   |   20 -
 .../www/spec/lib/jasmine-1.2.0/jasmine-html.js     |  616 ----
 templates/www/spec/lib/jasmine-1.2.0/jasmine.css   |   81 -
 templates/www/spec/lib/jasmine-1.2.0/jasmine.js    | 2529 ---------------
 116 files changed, 3648 insertions(+), 3633 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index f177fbd..291c037 100644
--- a/README.md
+++ b/README.md
@@ -53,45 +53,47 @@ A Cordova application built with cordova-cli will have the following directory s
 
     myApp/
     |--.cordova/
-    |-- merges/
-    | |-- android/
-    | |-- blackberry/
-    | `-- ios/
+    |-- app/
+    | |-- merges/
+    | | |-- android/
+    | | |-- blackberry/
+    | | `-- ios/
+    | |-- www/
+    | `-- config.xml
     |-- platforms/
     | |-- android/
     | |-- blackberry/
     | `-- ios/
-    |-- plugins/
-    `-- www/
+    `-- plugins/
 
 ## .cordova/
 This directory identifies a tree as a cordova project. Simple configuration information is stored in here (such as BlackBerry environment variables).
 
 Commands other than `create` operate against the project directory itself, rather than the current directory - a search up the current directory's parents is made to find the project directory. Thus, any command (other than `create`) can be used from any subdirectory whose parent is a cordova project directory (same as git).
 
-## merges/
-Platform-specific web assets (HTML, CSS and JavaScript files) are contained within appropriate subfolders in this directory. These are deployed during a `prepare` to the appropriate native directory.  Files placed under `merges/` will override matching files in the `www/` folder for the relevant platform. A quick example, assuming a project structure of:
+## app/
 
-    merges/
-    |-- ios/
-    | `-- app.js
-    |-- android/
-    | `-- android.js
-    www/
-      `-- app.js
+Contains your app-specific content: its `www/` files, any `merges/`, and the `config.xml`. If you want to keep your app in source control, this directory should be the top of the repository.
 
-After building the Android and iOS projects, the Android application will contain both `app.js` and `android.js`. However, the iOS application will only contain an `app.js`, and it will override the "common" `app.js` located inside the `www/` folder above.
 
-## platforms/
-Platforms added to your application will have the native application project structures laid out within this directory.
+### app/merges/
+Platform-specific web assets (HTML, CSS and JavaScript files) are contained within appropriate subfolders in this directory. These are deployed during a `prepare` to the appropriate native directory.  Files placed under `app/merges/` will override matching files in the `app/www/` folder for the relevant platform. A quick example, assuming a project structure of:
 
-## plugins/
-Any added plugins will be extracted or copied into this directory.
+    app/
+    |-- merges/
+    | |-- ios/
+    | | `-- app.js
+    | `-- android/
+    |   `-- android.js
+    `--www/
+      `-- app.js
 
-## www/
-Contains the project's web artifacts, such as .html, .css and .js files. These are your main application assets. The config.xml file within this directory is very important; read on to the next section!
+After building the Android and iOS projects, the Android application will contain both `app.js` and `android.js`. However, the iOS application will only contain an `app.js`, and it will be the one from `app/merges/ios/app.js`, overriding the "common" `app.js` located inside `app/www/`.
 
-### Your Blanket: www/config.xml 
+### app/www/
+Contains the project's web artifacts, such as .html, .css and .js files. These are your main application assets. They will be copied on a `cordova prepare` to each platform's www directory.
+
+### Your Blanket: app/config.xml
 
 This file is what you should be editing to modify your application's metadata. Any time you run any cordova-cli commands, the tool will look at the contents of `config.xml` and use all relevant info from this file to define native application information. cordova-cli supports changing your application's data via the following elements inside the `config.xml` file:
 
@@ -100,6 +102,12 @@ This file is what you should be editing to modify your application's metadata. A
 - The whitelist can be modified using the `<access>` elements. Make sure the `origin` attribute of your `<access>` element points to a valid URL (you can use `*` as wildcard). For more information on the whitelisting syntax, see the [docs.phonegap.com](http://docs.phonegap.com/en/2.2.0/guide_whitelist_index.md.html#Domain%20Whitelist%20Guide). You can use either attribute `uri` ([BlackBerry-proprietary](https://developer.blackberry.com/html5/documentation/access_element_834677_11.html)) or `origin` ([standards-compliant](http://www.w3.org/TR/widgets-access/#attributes)) to denote the domain.
 - Platform-specific preferences can be customized via `<preference>` tags. See [docs.phonegap.com](http://docs.phonegap.com/en/2.3.0/guide_project-settings_index.md.html#Project%20Settings) for a list of preferences you can use.
 
+## platforms/
+Platforms added to your application will have the native application project structures laid out within this directory.
+
+## plugins/
+Any added plugins will be extracted or copied into this directory.
+
 # Hooks
 
 Projects created by cordova-cli have `before` and `after` hooks for each [project command](#project_commands). There are two types of hooks: project-specific ones and module-level ones.
@@ -130,19 +138,20 @@ This example shows how to create a project from scratch named KewlApp with iOS a
 The directory structure of KewlApp now looks like this:
 
     KewlApp/
-    |- .cordova/
-    |- mergess/
-       |- android/
-       `- ios/
-    |- platforms/
-       |- android/
-       |  `- …
-       `- ios/
-          `- …
-    |- plugins/
-       `- Kewlio/
-    `- www/
-       `- index.html
+    |-- .cordova/
+    |-- app/
+    | |-- merges/
+    | | |-- android/
+    | | `-- ios/
+    | `- www/
+    |    `-- index.html
+    |-- platforms/
+    | |-- android/
+    | | `-- …
+    | `-- ios/
+    |   `-- …
+    `-- plugins/
+      `-- Kewlio/
 
 # Contributing
 

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/bootstrap.js
----------------------------------------------------------------------
diff --git a/bootstrap.js b/bootstrap.js
index f96df76..2012bbd 100644
--- a/bootstrap.js
+++ b/bootstrap.js
@@ -50,7 +50,7 @@ shell.rm('-rf', cordovaDir);
 create(cordovaDir);
 var platformsDir = path.join(cordovaDir, 'platforms');
 // kill the stupid spec shit!
-shell.rm('-rf', path.join(cordovaDir, 'www', 'spec'));
+shell.rm('-rf', path.join(cordovaDir, 'app', 'www', 'spec'));
 
 var end = n(platforms.length, function() {
     // Check that we are installing globally into a root-only directory.
@@ -91,7 +91,7 @@ platforms.forEach(function(platform) {
                     // copy over to full cordova project test fixture
                     shell.mkdir('-p', platformDir);
                     shell.cp('-rf', path.join(fix_path, '*'), platformDir);
-                    shell.mkdir('-p',path.join(cordovaDir,'merges',platform));
+                    shell.mkdir('-p',path.join(util.appDir(cordovaDir),'merges',platform));
 
                     // set permissions on executables
                     var scripts_path = path.join(fix_path, 'cordova');

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/spec/config_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/config_parser.spec.js b/spec/config_parser.spec.js
index 99bc717..3745c90 100644
--- a/spec/config_parser.spec.js
+++ b/spec/config_parser.spec.js
@@ -24,7 +24,8 @@ var cordova = require('../cordova'),
     config_parser = require('../src/config_parser'),
     tempDir = path.join(__dirname, '..', 'temp'),
     et = require('elementtree'),
-    xml = path.join(tempDir, 'www', 'config.xml');
+    util = require('../src/util'),
+    xml = util.projectConfig(tempDir);
 
 
 describe('config.xml parser', function () {

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/spec/create.spec.js
----------------------------------------------------------------------
diff --git a/spec/create.spec.js b/spec/create.spec.js
index fcb3e76..da4e544 100644
--- a/spec/create.spec.js
+++ b/spec/create.spec.js
@@ -2,6 +2,7 @@ var cordova = require('../cordova'),
     path    = require('path'),
     shell   = require('shelljs'),
     fs      = require('fs'),
+    util    = require('../src/util'),
     tempDir = path.join(__dirname, '..', 'temp');
 
 describe('create command', function () {
@@ -54,14 +55,14 @@ describe('create command', function () {
 
         expect(fs.lstatSync(path.join(tempDir, '.cordova', 'config.json')).isFile()).toBe(true);
 
-        expect(fs.readFileSync(path.join(tempDir, 'www', 'config.xml')).toString('utf8')).toMatch(/<name>balls<\/name>/);
+        expect(fs.readFileSync(util.projectConfig(tempDir)).toString('utf8')).toMatch(/<name>balls<\/name>/);
     });
     it('should create a cordova project in the specified dir with specified name and id if provided', function() {
         cordova.create(tempDir, "birdy.nam.nam", "numnum");
 
         expect(fs.lstatSync(path.join(tempDir, '.cordova', 'config.json')).isFile()).toBe(true);
 
-        var config = fs.readFileSync(path.join(tempDir, 'www', 'config.xml')).toString('utf8');
+        var config = fs.readFileSync(util.projectConfig(tempDir)).toString('utf8');
         expect(config).toMatch(/<name>numnum<\/name>/);
         expect(config).toMatch(/id="birdy\.nam\.nam"/);
     });

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/spec/metadata/android_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/metadata/android_parser.spec.js b/spec/metadata/android_parser.spec.js
index d051c6f..b7d106c 100644
--- a/spec/metadata/android_parser.spec.js
+++ b/spec/metadata/android_parser.spec.js
@@ -30,7 +30,7 @@ var android_parser = require('../../src/metadata/android_parser'),
     project_path = path.join(projects_path, 'cordova'),
     android_project_path = path.join(project_path, 'platforms', 'android');
 
-var www_config = path.join(project_path, 'www', 'config.xml');
+var www_config = util.projectConfig(project_path);
 var original_www_config = fs.readFileSync(www_config, 'utf-8');
 
 describe('android project parser', function() {
@@ -158,7 +158,7 @@ describe('android project parser', function() {
         });
         describe('update_www method', function() {
             it('should update all www assets', function() {
-                var newFile = path.join(project_path, 'www', 'somescript.js');
+                var newFile = path.join(util.projectWww(project_path), 'somescript.js');
                 this.after(function() {
                     shell.rm('-f', newFile);
                 });
@@ -173,7 +173,7 @@ describe('android project parser', function() {
         });
 
         describe('update_overrides method',function() {
-            var mergesPath = path.join(project_path, 'merges', 'android');
+            var mergesPath = path.join(util.appDir(project_path), 'merges', 'android');
             var newFile = path.join(mergesPath, 'merge.js');
             beforeEach(function() {
                 shell.mkdir('-p', mergesPath);
@@ -188,7 +188,7 @@ describe('android project parser', function() {
             });
 
             it('should copy a file from merges over a file in www', function() {
-                var newFileWWW = path.join(project_path, 'www','merge.js');
+                var newFileWWW = path.join(util.projectWww(project_path), 'merge.js');
                 fs.writeFileSync(newFileWWW, 'var foo=1;', 'utf-8');
                 this.after(function() {
                     shell.rm('-rf', newFileWWW);

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/spec/metadata/blackberry_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/metadata/blackberry_parser.spec.js b/spec/metadata/blackberry_parser.spec.js
index 12d5294..ada1727 100644
--- a/spec/metadata/blackberry_parser.spec.js
+++ b/spec/metadata/blackberry_parser.spec.js
@@ -30,7 +30,7 @@ var blackberry_parser = require('../../src/metadata/blackberry_parser'),
     project_path = path.join(projects_path, 'cordova'),
     blackberry_project_path = path.join(project_path, 'platforms', 'blackberry');
 
-var www_config = path.join(project_path, 'www', 'config.xml');
+var www_config = util.projectConfig(project_path);
 var original_www_config = fs.readFileSync(www_config, 'utf-8');
 
 describe('blackberry project parser', function() {
@@ -128,7 +128,7 @@ describe('blackberry project parser', function() {
 
         describe('update_www method', function() {
             it('should update all www assets', function() {
-                var newFile = path.join(project_path, 'www', 'somescript.js');
+                var newFile = path.join(util.projectWww(project_path), 'somescript.js');
                 this.after(function() {
                     shell.rm('-f', newFile);
                 });
@@ -137,7 +137,7 @@ describe('blackberry project parser', function() {
                 expect(fs.existsSync(path.join(blackberry_project_path, 'www', 'somescript.js'))).toBe(true);
             });
             it('should not overwrite the blackberry-specific config.xml', function() {
-                var www_cfg = fs.readFileSync(path.join(project_path, 'www', 'config.xml'), 'utf-8');
+                var www_cfg = fs.readFileSync(util.projectConfig(project_path), 'utf-8');
                 parser.update_www();
                 var bb_cfg = fs.readFileSync(blackberry_config, 'utf-8');
                 expect(bb_cfg).not.toBe(www_cfg);
@@ -145,7 +145,7 @@ describe('blackberry project parser', function() {
         });
 
         describe('update_overrides method',function() {
-            var mergesPath = path.join(project_path, 'merges', 'blackberry');
+            var mergesPath = path.join(util.appDir(project_path), 'merges', 'blackberry');
             var newFile = path.join(mergesPath, 'merge.js');
             beforeEach(function() {
                 shell.mkdir('-p', mergesPath);
@@ -161,7 +161,7 @@ describe('blackberry project parser', function() {
             });
 
             it('should copy a file from merges over a file in www', function() {
-                var newFileWWW = path.join(project_path, 'www','merge.js');
+                var newFileWWW = path.join(util.projectWww(project_path), 'merge.js');
                 fs.writeFileSync(newFileWWW, 'var foo=1;', 'utf-8');
                 this.after(function() {
                     shell.rm('-rf', newFileWWW);

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/spec/metadata/ios_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/metadata/ios_parser.spec.js b/spec/metadata/ios_parser.spec.js
index dbd4816..e1f92a6 100644
--- a/spec/metadata/ios_parser.spec.js
+++ b/spec/metadata/ios_parser.spec.js
@@ -30,7 +30,7 @@ ios_path = path.join(projects_path, 'native', 'ios_fixture'),
     project_path = path.join(projects_path, 'cordova'),
     ios_project_path = path.join(project_path, 'platforms', 'ios');
 
-var www_config = path.join(project_path, 'www', 'config.xml');
+var www_config = util.projectConfig(project_path);
 var original_www_config = fs.readFileSync(www_config, 'utf-8');
 
 describe('ios project parser', function () {
@@ -147,7 +147,7 @@ describe('ios project parser', function () {
 
         describe('update_www method', function () {
             it('should update all www assets', function () {
-                var newFile = path.join(project_path, 'www', 'somescript.js');
+                var newFile = path.join(util.projectWww(project_path), 'somescript.js');
                 this.after(function () {
                     shell.rm('-f', newFile);
                 });
@@ -162,7 +162,7 @@ describe('ios project parser', function () {
         });
 
         describe('update_overrides method', function () {
-            var mergesPath = path.join(project_path, 'merges', 'ios');
+            var mergesPath = path.join(util.appDir(project_path), 'merges', 'ios');
             var newFile = path.join(mergesPath, 'merge.js');
             beforeEach(function() {
                 shell.mkdir('-p', mergesPath);
@@ -178,7 +178,7 @@ describe('ios project parser', function () {
             });
 
             it('should copy a file from merges over a file in www', function () {
-                var newFileWWW = path.join(project_path, 'www', 'merge.js');
+                var newFileWWW = path.join(util.projectWww(project_path), 'merge.js');
                 fs.writeFileSync(newFileWWW, 'var foo=1;', 'utf-8');
                 this.after(function () {
                     shell.rm('-rf', newFileWWW);

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/spec/platform.spec.js
----------------------------------------------------------------------
diff --git a/spec/platform.spec.js b/spec/platform.spec.js
index b8dedec..c2c173f 100644
--- a/spec/platform.spec.js
+++ b/spec/platform.spec.js
@@ -136,7 +136,7 @@ describe('platform command', function() {
                 shell.mkdir('-p', a_path);
                 fs.writeFileSync(path.join(a_path, 'poo.xcodeproj'), 'hi', 'utf-8');
                 shell.mkdir('-p', path.join(a_path, 'poo'));
-                shell.cp(path.join(cordova_project, 'www', 'config.xml'), path.join(a_path, 'poo', 'config.xml'));
+                shell.cp(util.projectConfig(cordova_project), path.join(a_path, 'poo', 'config.xml'));
                 sh.mostRecentCall.args[2](0, '');
             };
             beforeEach(function() {
@@ -166,7 +166,7 @@ describe('platform command', function() {
                 shell.mkdir('-p', path.join(a_path, 'www'));
                 fs.writeFileSync(path.join(a_path, 'project.properties'), 'hi', 'utf-8');
                 fs.writeFileSync(path.join(a_path, 'build.xml'), 'hi', 'utf-8');
-                shell.cp(path.join(cordova_project, 'www', 'config.xml'), path.join(a_path, 'www', 'config.xml'));
+                shell.cp(util.projectConfig(cordova_project), path.join(a_path, 'www', 'config.xml'));
                 sh.mostRecentCall.args[2](0, '');
             };
             beforeEach(function() {

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/spec/serve.spec.js
----------------------------------------------------------------------
diff --git a/spec/serve.spec.js b/spec/serve.spec.js
index 8d00cab..080c273 100644
--- a/spec/serve.spec.js
+++ b/spec/serve.spec.js
@@ -119,7 +119,7 @@ xdescribe('serve command', function() {
 
         it('should serve from top-level www if the file exists there', function() {
             var payload = 'This is test file.';
-            fs.writeFileSync(path.join(tempDir, 'www', 'test.html'), payload);
+            fs.writeFileSync(path.join(util.projectWww(tempDir), 'test.html'), payload);
             test_serve('android', '/test.html', payload)();
         });
 

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/compile.js
----------------------------------------------------------------------
diff --git a/src/compile.js b/src/compile.js
index 521451f..0e8951a 100644
--- a/src/compile.js
+++ b/src/compile.js
@@ -58,8 +58,7 @@ module.exports = function compile(platforms, callback) {
         throw new Error('Current working directory is not a Cordova-based project.');
     }
 
-    var xml = path.join(projectRoot, 'www', 'config.xml');
-    var assets = path.join(projectRoot, 'www');
+    var xml = cordova_util.projectConfig(projectRoot);
     var cfg = new config_parser(xml);
 
     if (arguments.length === 0 || (platforms instanceof Array && platforms.length === 0)) {

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/create.js
----------------------------------------------------------------------
diff --git a/src/create.js b/src/create.js
index 0f7c8a6..66ab225 100644
--- a/src/create.js
+++ b/src/create.js
@@ -21,7 +21,8 @@ var path          = require('path'),
     fs            = require('fs'),
     shell         = require('shelljs'),
     help          = require('./help'),
-    config_parser = require('./config_parser');
+    config_parser = require('./config_parser'),
+    util          = require('./util');
 
 var DEFAULT_NAME = "HelloCordova",
     DEFAULT_ID   = "io.cordova.hellocordova";
@@ -59,8 +60,9 @@ module.exports = function create (dir, id, name) {
     // Create basic project structure.
     shell.mkdir('-p', dotCordova);
     shell.mkdir('-p', path.join(dir, 'platforms'));
-    shell.mkdir('-p', path.join(dir, 'merges'));
     shell.mkdir('-p', path.join(dir, 'plugins'));
+    shell.mkdir('-p', path.join(dir, 'app'));
+    shell.mkdir('-p', path.join(dir, 'app', 'merges'));
     var hooks = path.join(dotCordova, 'hooks');
     shell.mkdir('-p', hooks);
 
@@ -95,10 +97,10 @@ module.exports = function create (dir, id, name) {
     }));
 
     // Copy in base template
-    shell.cp('-r', path.join(__dirname, '..', 'templates', 'www'), dir);
+    shell.cp('-r', path.join(__dirname, '..', 'templates', 'app'), dir);
 
     // Write out id and name to config.xml
-    var configPath = path.join(dir, 'www', 'config.xml');
+    var configPath = util.projectConfig(dir);
     var config = new config_parser(configPath);
     config.packageName(id);
     config.name(name);

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/emulate.js
----------------------------------------------------------------------
diff --git a/src/emulate.js b/src/emulate.js
index 7acb441..523b5e0 100644
--- a/src/emulate.js
+++ b/src/emulate.js
@@ -60,7 +60,7 @@ module.exports = function emulate (platforms, callback) {
         throw new Error('Current working directory is not a Cordova-based project.');
     }
 
-    var xml = path.join(projectRoot, 'www', 'config.xml');
+    var xml = cordova_util.projectConfig(projectRoot);
     var cfg = new config_parser(xml);
 
     if (arguments.length === 0 || (platforms instanceof Array && platforms.length === 0)) {

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/metadata/android_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/android_parser.js b/src/metadata/android_parser.js
index 3dfaf22..70e952a 100644
--- a/src/metadata/android_parser.js
+++ b/src/metadata/android_parser.js
@@ -90,7 +90,7 @@ module.exports.prototype = {
         var android_cfg_xml = new config_parser(this.android_config);
         // clean out all existing access elements first
         android_cfg_xml.access.remove();
-        // add only the ones specified in the www/config.xml file
+        // add only the ones specified in the app/config.xml file
         config.access.get().forEach(function(uri) {
             android_cfg_xml.access.add(uri);
         });
@@ -128,7 +128,7 @@ module.exports.prototype = {
 
     update_www:function() {
         var projectRoot = util.isCordova(this.path);
-        var www = path.join(projectRoot, 'www');
+        var www = util.projectWww(projectRoot);
         var platformWww = path.join(this.path, 'assets');
         // remove stock platform assets
         shell.rm('-rf', this.www_dir());
@@ -144,7 +144,7 @@ module.exports.prototype = {
     // update the overrides folder into the www folder
     update_overrides:function() {
         var projectRoot = util.isCordova(this.path);
-        var merges_path = path.join(projectRoot, 'merges', 'android');
+        var merges_path = path.join(util.appDir(projectRoot), 'merges', 'android');
         if (fs.existsSync(merges_path)) {
             var overrides = path.join(merges_path, '*');
             shell.cp('-rf', overrides, this.www_dir());

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/metadata/blackberry_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/blackberry_parser.js b/src/metadata/blackberry_parser.js
index b2cad4b..5bd6d84 100644
--- a/src/metadata/blackberry_parser.js
+++ b/src/metadata/blackberry_parser.js
@@ -91,7 +91,7 @@ module.exports.prototype = {
 
     update_www:function() {
         var projectRoot = util.isCordova(this.path);
-        var www = path.join(projectRoot, 'www');
+        var www = util.projectWww(projectRoot);
         var platformWww = this.www_dir();
 
         var finalWww = path.join(this.path, 'finalwww');
@@ -110,12 +110,8 @@ module.exports.prototype = {
         shell.cp('-rf', path.join(platformWww, 'ext*'), finalWww);
         shell.cp('-rf', path.join(platformWww, 'res'), finalWww);
 
-        // Copy everything over from platform-agnostic www, except config.xml
-        var cfg_www = path.join(www, 'config.xml');
-        var temp_cfg = path.join(projectRoot, 'config.xml');
-        shell.mv(cfg_www, temp_cfg);
+        // Copy everything over from platform-agnostic www.
         shell.cp('-rf', path.join(www, '*'), finalWww);
-        shell.mv(temp_cfg, cfg_www);
 
         // Delete the old platform www, and move the final project over
         shell.rm('-rf', platformWww);
@@ -126,7 +122,7 @@ module.exports.prototype = {
     // update the overrides folder into the www folder
     update_overrides:function() {
         var projectRoot = util.isCordova(this.path);
-        var merges_path = path.join(projectRoot, 'merges', 'blackberry');
+        var merges_path = path.join(util.appDir(projectRoot), 'merges', 'blackberry');
         if (fs.existsSync(merges_path)) {
             var overrides = path.join(merges_path, '*');
             shell.cp('-rf', overrides, this.www_dir());

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/metadata/ios_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/ios_parser.js b/src/metadata/ios_parser.js
index ee235dc..e3b19fd 100644
--- a/src/metadata/ios_parser.js
+++ b/src/metadata/ios_parser.js
@@ -139,7 +139,7 @@ module.exports.prototype = {
 
     update_www:function() {
         var projectRoot = util.isCordova(this.path);
-        var www = path.join(projectRoot, 'www');
+        var www = util.projectWww(projectRoot);
         var project_www = this.www_dir();
 
         // remove the stock www folder
@@ -156,7 +156,7 @@ module.exports.prototype = {
     // update the overrides folder into the www folder
     update_overrides:function() {
         var projectRoot = util.isCordova(this.path);
-        var merges_path = path.join(projectRoot, 'merges', 'ios');
+        var merges_path = path.join(util.appDir(projectRoot), 'merges', 'ios');
         if (fs.existsSync(merges_path)) {
             var overrides = path.join(merges_path, '*');
             shell.cp('-rf', overrides, this.www_dir());

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/platform.js
----------------------------------------------------------------------
diff --git a/src/platform.js b/src/platform.js
index 7044fb4..a5db481 100644
--- a/src/platform.js
+++ b/src/platform.js
@@ -45,7 +45,7 @@ module.exports = function platform(command, targets, callback) {
         end;
 
     var createOverrides = function(target) {
-        shell.mkdir('-p', path.join(projectRoot, 'merges', target));
+        shell.mkdir('-p', path.join(cordova_util.appDir(projectRoot), 'merges', target));
     };
 
     if (arguments.length === 0) command = 'ls';
@@ -56,7 +56,7 @@ module.exports = function platform(command, targets, callback) {
         });
     }
 
-    var xml = path.join(projectRoot, 'www', 'config.xml');
+    var xml = cordova_util.projectConfig(projectRoot);
     var cfg = new config_parser(xml);
 
     switch(command) {
@@ -125,7 +125,7 @@ module.exports = function platform(command, targets, callback) {
             targets.forEach(function(target) {
                 hooks.fire('before_platform_rm');
                 shell.rm('-rf', path.join(projectRoot, 'platforms', target));
-                shell.rm('-rf', path.join(projectRoot, 'merges', target));
+                shell.rm('-rf', path.join(cordova_util.appDir(projectRoot), 'merges', target));
                 hooks.fire('after_platform_rm');
             });
             break;

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/plugin.js
----------------------------------------------------------------------
diff --git a/src/plugin.js b/src/plugin.js
index bbe04b3..c2fdc02 100644
--- a/src/plugin.js
+++ b/src/plugin.js
@@ -39,10 +39,8 @@ module.exports = function plugin(command, targets, callback) {
 
     var hooks = new hooker(projectRoot);
 
-    var projectWww = path.join(projectRoot, 'www');
-
     // Grab config info for the project
-    var xml = path.join(projectWww, 'config.xml');
+    var xml = cordova_util.projectConfig(projectRoot);
     var cfg = new config_parser(xml);
     var platforms = cordova_util.listPlatforms(projectRoot);
 

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/prepare.js
----------------------------------------------------------------------
diff --git a/src/prepare.js b/src/prepare.js
index f5164eb..7b30c29 100644
--- a/src/prepare.js
+++ b/src/prepare.js
@@ -44,7 +44,7 @@ module.exports = function prepare(platforms, callback) {
         throw new Error('Current working directory is not a Cordova-based project.');
     }
 
-    var xml = path.join(projectRoot, 'www', 'config.xml');
+    var xml = cordova_util.projectConfig(projectRoot);
     var cfg = new config_parser(xml);
 
     if (arguments.length === 0 || (platforms instanceof Array && platforms.length === 0)) {

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/serve.js
----------------------------------------------------------------------
diff --git a/src/serve.js b/src/serve.js
index 1967628..771f64f 100644
--- a/src/serve.js
+++ b/src/serve.js
@@ -96,7 +96,7 @@ module.exports.config = function (platform, port, callback) {
         throw new Error('Current working directory is not a Cordova-based project.');
     }
 
-    var xml = path.join(projectRoot, 'www', 'config.xml');
+    var xml = cordova_util.projectConfig(projectRoot);
     var cfg = new config_parser(xml);
 
     // Retrieve the platforms.

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/src/util.js
----------------------------------------------------------------------
diff --git a/src/util.js b/src/util.js
index 6bd78da..4620e03 100644
--- a/src/util.js
+++ b/src/util.js
@@ -62,5 +62,14 @@ module.exports = {
         return fs.readdirSync(path.join(project_dir, 'platforms')).filter(function(p) {
             return core_platforms.indexOf(p) > -1;
         });
+    },
+    projectWww: function(projectDir) {
+        return path.join(projectDir, 'app', 'www');
+    },
+    appDir: function(projectDir) {
+        return path.join(projectDir, 'app');
+    },
+    projectConfig: function(projectDir) {
+        return path.join(projectDir, 'app', 'config.xml');
     }
 };

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/config.xml
----------------------------------------------------------------------
diff --git a/templates/app/config.xml b/templates/app/config.xml
new file mode 100644
index 0000000..206bc56
--- /dev/null
+++ b/templates/app/config.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns     = "http://www.w3.org/ns/widgets"
+        xmlns:gap = "http://phonegap.com/ns/1.0"
+        id        = "io.cordova.hello-cordova"
+        version   = "2.0.0">
+    <name>Hello Cordova</name>
+
+    <description>
+        A sample Apache Cordova application that responds to the deviceready event.
+    </description>
+
+    <author href="http://cordova.io" email="callback-dev@incubator.apache.org">
+        Apache Cordova Team
+    </author>
+
+    <icon src="res/icon/cordova_512.png"        width="512" height="512" />
+    <icon src="res/icon/cordova_android_96.png" width="96"  height="96"  gap:platform="android" />
+    <icon src="res/icon/cordova_bb_80.png"      width="80"  height="80"  gap:platform="blackberry" />
+    <icon src="res/icon/cordova_ios_144.png"    width="144" height="144" gap:platform="ios" />
+
+    <gap:splash src="res/screen/android_hdpi_landscape.png"      width="800"  height="480"  gap:platform="android" />
+    <gap:splash src="res/screen/android_hdpi_portrait.png"       width="480"  height="800"  gap:platform="android" />
+    <gap:splash src="res/screen/android_ldpi_landscape.png"      width="320"  height="200"  gap:platform="android" />
+    <gap:splash src="res/screen/android_ldpi_portrait.png"       width="200"  height="320"  gap:platform="android" />
+    <gap:splash src="res/screen/android_mdpi_landscape.png"      width="480"  height="320"  gap:platform="android" />
+    <gap:splash src="res/screen/android_mdpi_portrait.png"       width="320"  height="480"  gap:platform="android" />
+    <gap:splash src="res/screen/android_xhdpi_landscape.png"     width="1280" height="720"  gap:platform="android" />
+    <gap:splash src="res/screen/android_xhdpi_portrait.png"      width="720"  height="1280" gap:platform="android" />
+    <gap:splash src="res/screen/blackberry_transparent_300.png"  width="300"  height="300"  gap:platform="blackberry" />
+    <gap:splash src="res/screen/blackberry_transparent_400.png"  width="200"  height="200"  gap:platform="blackberry" />
+    <gap:splash src="res/screen/ipad_landscape.png"              width="1024" height="748"  gap:platform="ios" />
+    <gap:splash src="res/screen/ipad_portrait.png"               width="768"  height="1004" gap:platform="ios" />
+    <gap:splash src="res/screen/ipad_retina_landscape.png"       width="2048" height="1496" gap:platform="ios" />
+    <gap:splash src="res/screen/ipad_retina_portrait.png"        width="1536" height="2008" gap:platform="ios" />
+    <gap:splash src="res/screen/iphone_landscape.png"            width="480"  height="320"  gap:platform="ios" />
+    <gap:splash src="res/screen/iphone_portrait.png"             width="320"  height="480"  gap:platform="ios" />
+    <gap:splash src="res/screen/iphone_retina_landscape.png"     width="960"  height="640"  gap:platform="ios" />
+    <gap:splash src="res/screen/iphone_retina_portrait.png"      width="640"  height="960"  gap:platform="ios" />
+    <gap:splash src="res/screen/windows_phone_portrait.jpg"      width="480"  height="800"  gap:platform="winphone" />
+
+    <feature name="http://api.phonegap.com/1.0/device" />
+
+    <preference name="phonegap-version" value="1.9.0" />
+    <preference name="orientation"      value="default" />
+    <preference name="target-device"    value="universal" />
+    <preference name="fullscreen"       value="false" />
+
+    <access origin="*" />
+</widget>

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/css/index.css
----------------------------------------------------------------------
diff --git a/templates/app/www/css/index.css b/templates/app/www/css/index.css
new file mode 100644
index 0000000..c869f87
--- /dev/null
+++ b/templates/app/www/css/index.css
@@ -0,0 +1,100 @@
+html,
+body {
+    height:100%;
+    font-size:12px;
+    width:100%;
+}
+
+html {
+    display:table;
+}
+
+body {
+    background-color:#A7A7A7;
+    background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
+    background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
+    background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
+    background-image:-webkit-gradient(
+        linear,
+        left top,
+        left bottom,
+        color-stop(0, #A7A7A7),
+        color-stop(0.51, #E4E4E4)
+    );
+    display:table-cell;
+    font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif;
+    text-transform:uppercase;
+    vertical-align:middle;
+}
+
+.app {
+    background-image:url(../img/cordova.png);
+    background-repeat:no-repeat;
+    margin:0px auto;
+    width:275px;
+}
+
+h1 {
+    font-size:2em;
+    font-weight:300;
+    margin:0px;
+    overflow:visible;
+    padding:0px;
+    text-align:center;
+}
+
+.status {
+    background-color:#333333;
+    border-radius:4px;
+    -webkit-border-radius:4px;
+    color:#FFFFFF;
+    font-size:1em;
+    margin:0px auto;
+    padding:2px 10px;
+    text-align:center;
+    width:100%;
+    max-width:175px;
+}
+
+.status.complete {
+    background-color:#4B946A;
+}
+
+.hide {
+    display:none;
+}
+
+@keyframes fade {
+    from { opacity: 1.0; }
+    50% { opacity: 0.4; }
+    to { opacity: 1.0; }
+}
+ 
+@-webkit-keyframes fade {
+    from { opacity: 1.0; }
+    50% { opacity: 0.4; }
+    to { opacity: 1.0; }
+}
+ 
+.blink {
+    animation:fade 3000ms infinite;
+    -webkit-animation:fade 3000ms infinite;
+}
+
+/* portrait */
+/* @media screen and (max-aspect-ratio: 1/1) */
+.app {
+    background-position:center top;
+    height:100px;              /* adds enough room for text */
+    padding:180px 0px 0px 0px; /* background height - shadow offset */
+}
+
+/* lanscape (when wide enough) */
+@media screen and (min-aspect-ratio: 1/1) and (min-width:445px) {
+    .app {
+        background-position:left center;
+        height:140px;       /* height + padding = background image size */
+        padding-left:170px; /* background width */
+        padding-top:60px;   /* center the text */
+    }
+}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/img/cordova.png
----------------------------------------------------------------------
diff --git a/templates/app/www/img/cordova.png b/templates/app/www/img/cordova.png
new file mode 100644
index 0000000..e8169cf
Binary files /dev/null and b/templates/app/www/img/cordova.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/index.html
----------------------------------------------------------------------
diff --git a/templates/app/www/index.html b/templates/app/www/index.html
new file mode 100644
index 0000000..202af51
--- /dev/null
+++ b/templates/app/www/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <meta name = "format-detection" content = "telephone=no"/>
+        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width;" />
+        <link rel="stylesheet" type="text/css" href="css/index.css" />
+        <title>Hello Cordova</title>
+    </head>
+    <body>
+        <div class="app">
+            <h1>Apache Cordova</h1>
+            <div id="deviceready">
+                <p class="status pending blink">Connecting to Device</p>
+                <p class="status complete blink hide">Device is Ready</p>
+            </div>
+        </div>
+        <script type="text/javascript" src="cordova.js"></script>
+        <script type="text/javascript" src="js/index.js"></script>
+        <script type="text/javascript">
+            app.initialize();
+        </script>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/js/index.js
----------------------------------------------------------------------
diff --git a/templates/app/www/js/index.js b/templates/app/www/js/index.js
new file mode 100644
index 0000000..6140331
--- /dev/null
+++ b/templates/app/www/js/index.js
@@ -0,0 +1,20 @@
+var app = {
+    initialize: function() {
+        this.bind();
+    },
+    bind: function() {
+        document.addEventListener('deviceready', this.deviceready, false);
+    },
+    deviceready: function() {
+        // note that this is an event handler so the scope is that of the event
+        // so we need to call app.report(), and not this.report()
+        app.report('deviceready');
+    },
+    report: function(id) { 
+        console.log("report:" + id);
+        // hide the .pending <p> and show the .complete <p>
+        document.querySelector('#' + id + ' .pending').className += ' hide';
+        var completeElem = document.querySelector('#' + id + ' .complete');
+        completeElem.className = completeElem.className.split('hide').join('');
+    }
+};

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_128.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_128.png b/templates/app/www/res/icon/cordova_128.png
new file mode 100644
index 0000000..3516df3
Binary files /dev/null and b/templates/app/www/res/icon/cordova_128.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_16.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_16.png b/templates/app/www/res/icon/cordova_16.png
new file mode 100644
index 0000000..54e19c5
Binary files /dev/null and b/templates/app/www/res/icon/cordova_16.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_24.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_24.png b/templates/app/www/res/icon/cordova_24.png
new file mode 100644
index 0000000..c7d43ad
Binary files /dev/null and b/templates/app/www/res/icon/cordova_24.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_256.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_256.png b/templates/app/www/res/icon/cordova_256.png
new file mode 100644
index 0000000..e1cd0e6
Binary files /dev/null and b/templates/app/www/res/icon/cordova_256.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_32.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_32.png b/templates/app/www/res/icon/cordova_32.png
new file mode 100644
index 0000000..734fffc
Binary files /dev/null and b/templates/app/www/res/icon/cordova_32.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_48.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_48.png b/templates/app/www/res/icon/cordova_48.png
new file mode 100644
index 0000000..8ad8bac
Binary files /dev/null and b/templates/app/www/res/icon/cordova_48.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_512.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_512.png b/templates/app/www/res/icon/cordova_512.png
new file mode 100644
index 0000000..c9465f3
Binary files /dev/null and b/templates/app/www/res/icon/cordova_512.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_64.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_64.png b/templates/app/www/res/icon/cordova_64.png
new file mode 100644
index 0000000..03b3849
Binary files /dev/null and b/templates/app/www/res/icon/cordova_64.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_android_36.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_android_36.png b/templates/app/www/res/icon/cordova_android_36.png
new file mode 100644
index 0000000..cd5032a
Binary files /dev/null and b/templates/app/www/res/icon/cordova_android_36.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_android_48.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_android_48.png b/templates/app/www/res/icon/cordova_android_48.png
new file mode 100644
index 0000000..e79c606
Binary files /dev/null and b/templates/app/www/res/icon/cordova_android_48.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_android_72.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_android_72.png b/templates/app/www/res/icon/cordova_android_72.png
new file mode 100644
index 0000000..4d27634
Binary files /dev/null and b/templates/app/www/res/icon/cordova_android_72.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_android_96.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_android_96.png b/templates/app/www/res/icon/cordova_android_96.png
new file mode 100644
index 0000000..ec7ffbf
Binary files /dev/null and b/templates/app/www/res/icon/cordova_android_96.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_bb_80.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_bb_80.png b/templates/app/www/res/icon/cordova_bb_80.png
new file mode 100644
index 0000000..f86a27a
Binary files /dev/null and b/templates/app/www/res/icon/cordova_bb_80.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_ios_114.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_ios_114.png b/templates/app/www/res/icon/cordova_ios_114.png
new file mode 100644
index 0000000..efd9c37
Binary files /dev/null and b/templates/app/www/res/icon/cordova_ios_114.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_ios_144.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_ios_144.png b/templates/app/www/res/icon/cordova_ios_144.png
new file mode 100644
index 0000000..dd819da
Binary files /dev/null and b/templates/app/www/res/icon/cordova_ios_144.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_ios_57.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_ios_57.png b/templates/app/www/res/icon/cordova_ios_57.png
new file mode 100644
index 0000000..c795fc4
Binary files /dev/null and b/templates/app/www/res/icon/cordova_ios_57.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/icon/cordova_ios_72.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/icon/cordova_ios_72.png b/templates/app/www/res/icon/cordova_ios_72.png
new file mode 100644
index 0000000..b1cfde7
Binary files /dev/null and b/templates/app/www/res/icon/cordova_ios_72.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/android_hdpi_landscape.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/android_hdpi_landscape.png b/templates/app/www/res/screen/android_hdpi_landscape.png
new file mode 100644
index 0000000..a61e2b1
Binary files /dev/null and b/templates/app/www/res/screen/android_hdpi_landscape.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/android_hdpi_portrait.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/android_hdpi_portrait.png b/templates/app/www/res/screen/android_hdpi_portrait.png
new file mode 100644
index 0000000..5d6a28a
Binary files /dev/null and b/templates/app/www/res/screen/android_hdpi_portrait.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/android_ldpi_landscape.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/android_ldpi_landscape.png b/templates/app/www/res/screen/android_ldpi_landscape.png
new file mode 100644
index 0000000..f3934cd
Binary files /dev/null and b/templates/app/www/res/screen/android_ldpi_landscape.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/android_ldpi_portrait.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/android_ldpi_portrait.png b/templates/app/www/res/screen/android_ldpi_portrait.png
new file mode 100644
index 0000000..65ad163
Binary files /dev/null and b/templates/app/www/res/screen/android_ldpi_portrait.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/android_mdpi_landscape.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/android_mdpi_landscape.png b/templates/app/www/res/screen/android_mdpi_landscape.png
new file mode 100644
index 0000000..a1b697c
Binary files /dev/null and b/templates/app/www/res/screen/android_mdpi_landscape.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/android_mdpi_portrait.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/android_mdpi_portrait.png b/templates/app/www/res/screen/android_mdpi_portrait.png
new file mode 100644
index 0000000..ea15693
Binary files /dev/null and b/templates/app/www/res/screen/android_mdpi_portrait.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/android_xhdpi_landscape.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/android_xhdpi_landscape.png b/templates/app/www/res/screen/android_xhdpi_landscape.png
new file mode 100644
index 0000000..79f2f09
Binary files /dev/null and b/templates/app/www/res/screen/android_xhdpi_landscape.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/android_xhdpi_portrait.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/android_xhdpi_portrait.png b/templates/app/www/res/screen/android_xhdpi_portrait.png
new file mode 100644
index 0000000..c2e8042
Binary files /dev/null and b/templates/app/www/res/screen/android_xhdpi_portrait.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/blackberry_transparent_300.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/blackberry_transparent_300.png b/templates/app/www/res/screen/blackberry_transparent_300.png
new file mode 100644
index 0000000..b548bdc
Binary files /dev/null and b/templates/app/www/res/screen/blackberry_transparent_300.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/blackberry_transparent_400.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/blackberry_transparent_400.png b/templates/app/www/res/screen/blackberry_transparent_400.png
new file mode 100644
index 0000000..3facdf9
Binary files /dev/null and b/templates/app/www/res/screen/blackberry_transparent_400.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/ipad_landscape.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/ipad_landscape.png b/templates/app/www/res/screen/ipad_landscape.png
new file mode 100644
index 0000000..04be5ac
Binary files /dev/null and b/templates/app/www/res/screen/ipad_landscape.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/ipad_portrait.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/ipad_portrait.png b/templates/app/www/res/screen/ipad_portrait.png
new file mode 100644
index 0000000..41e839d
Binary files /dev/null and b/templates/app/www/res/screen/ipad_portrait.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/ipad_retina_landscape.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/ipad_retina_landscape.png b/templates/app/www/res/screen/ipad_retina_landscape.png
new file mode 100644
index 0000000..95c542d
Binary files /dev/null and b/templates/app/www/res/screen/ipad_retina_landscape.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/ipad_retina_portrait.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/ipad_retina_portrait.png b/templates/app/www/res/screen/ipad_retina_portrait.png
new file mode 100644
index 0000000..aae1862
Binary files /dev/null and b/templates/app/www/res/screen/ipad_retina_portrait.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/iphone_landscape.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/iphone_landscape.png b/templates/app/www/res/screen/iphone_landscape.png
new file mode 100644
index 0000000..d154883
Binary files /dev/null and b/templates/app/www/res/screen/iphone_landscape.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/iphone_portrait.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/iphone_portrait.png b/templates/app/www/res/screen/iphone_portrait.png
new file mode 100644
index 0000000..6fcba56
Binary files /dev/null and b/templates/app/www/res/screen/iphone_portrait.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/iphone_retina_landscape.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/iphone_retina_landscape.png b/templates/app/www/res/screen/iphone_retina_landscape.png
new file mode 100644
index 0000000..0165669
Binary files /dev/null and b/templates/app/www/res/screen/iphone_retina_landscape.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/iphone_retina_portrait.png
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/iphone_retina_portrait.png b/templates/app/www/res/screen/iphone_retina_portrait.png
new file mode 100644
index 0000000..bd24886
Binary files /dev/null and b/templates/app/www/res/screen/iphone_retina_portrait.png differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/res/screen/windows_phone_portrait.jpg
----------------------------------------------------------------------
diff --git a/templates/app/www/res/screen/windows_phone_portrait.jpg b/templates/app/www/res/screen/windows_phone_portrait.jpg
new file mode 100644
index 0000000..9f95387
Binary files /dev/null and b/templates/app/www/res/screen/windows_phone_portrait.jpg differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/spec.html
----------------------------------------------------------------------
diff --git a/templates/app/www/spec.html b/templates/app/www/spec.html
new file mode 100644
index 0000000..83d7d2e
--- /dev/null
+++ b/templates/app/www/spec.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Jasmine Spec Runner</title>
+
+        <!-- jasmine source -->
+        <link rel="shortcut icon" type="image/png" href="spec/lib/jasmine-1.2.0/jasmine_favicon.png">
+        <link rel="stylesheet" type="text/css" href="spec/lib/jasmine-1.2.0/jasmine.css">
+        <script type="text/javascript" src="spec/lib/jasmine-1.2.0/jasmine.js"></script>
+        <script type="text/javascript" src="spec/lib/jasmine-1.2.0/jasmine-html.js"></script>
+
+        <!-- include source files here... -->
+        <script type="text/javascript" src="js/index.js"></script>
+
+        <!-- include spec files here... -->
+        <script type="text/javascript" src="spec/helper.js"></script>
+        <script type="text/javascript" src="spec/index.js"></script>
+
+        <script type="text/javascript">
+            (function() {
+                var jasmineEnv = jasmine.getEnv();
+                jasmineEnv.updateInterval = 1000;
+
+                var htmlReporter = new jasmine.HtmlReporter();
+
+                jasmineEnv.addReporter(htmlReporter);
+
+                jasmineEnv.specFilter = function(spec) {
+                    return htmlReporter.specFilter(spec);
+                };
+
+                var currentWindowOnload = window.onload;
+
+                window.onload = function() {
+                    if (currentWindowOnload) {
+                        currentWindowOnload();
+                    }
+                    execJasmine();
+                };
+
+                function execJasmine() {
+                    jasmineEnv.execute();
+                }
+            })();
+        </script>
+    </head>
+    <body>
+        <div id="stage" style="display:none;"></div>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/spec/helper.js
----------------------------------------------------------------------
diff --git a/templates/app/www/spec/helper.js b/templates/app/www/spec/helper.js
new file mode 100644
index 0000000..9f99445
--- /dev/null
+++ b/templates/app/www/spec/helper.js
@@ -0,0 +1,11 @@
+afterEach(function() {
+    document.getElementById('stage').innerHTML = '';
+});
+
+var helper = {
+    trigger: function(obj, name) {
+        var e = document.createEvent('Event');
+        e.initEvent(name, true, true);
+        obj.dispatchEvent(e);
+    }
+};

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/spec/index.js
----------------------------------------------------------------------
diff --git a/templates/app/www/spec/index.js b/templates/app/www/spec/index.js
new file mode 100644
index 0000000..121cf63
--- /dev/null
+++ b/templates/app/www/spec/index.js
@@ -0,0 +1,49 @@
+describe('app', function() {
+    describe('initialize', function() {
+        it('should bind deviceready', function() {
+            runs(function() {
+                spyOn(app, 'deviceready');
+                app.initialize();
+                helper.trigger(window.document, 'deviceready');
+            });
+
+            waitsFor(function() {
+                return (app.deviceready.calls.length > 0);
+            }, 'deviceready should be called once', 500);
+
+            runs(function() {
+                expect(app.deviceready).toHaveBeenCalled();
+            });
+        });
+    });
+
+    describe('deviceready', function() {
+        it('should report that it fired', function() {
+            spyOn(app, 'report');
+            app.deviceready();
+            expect(app.report).toHaveBeenCalledWith('deviceready');
+        });
+    });
+
+    describe('report', function() {
+        beforeEach(function() {
+            var el = document.getElementById('stage');
+            el.innerHTML = ['<div id="deviceready">',
+                            '    <p class="status pending">Pending</p>',
+                            '    <p class="status complete hide">Complete</p>',
+                            '</div>'].join('\n');
+        });
+
+        it('should show the completion state', function() {
+            app.report('deviceready');
+            var el = document.querySelector('#deviceready .complete:not(.hide)');
+            expect(el).toBeTruthy();
+        });
+
+        it('should hide the pending state', function() {
+            app.report('deviceready');
+            var el = document.querySelector('#deviceready .pending.hide');
+            expect(el).toBeTruthy();
+        });
+    });
+});

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/740ff28d/templates/app/www/spec/lib/jasmine-1.2.0/MIT.LICENSE
----------------------------------------------------------------------
diff --git a/templates/app/www/spec/lib/jasmine-1.2.0/MIT.LICENSE b/templates/app/www/spec/lib/jasmine-1.2.0/MIT.LICENSE
new file mode 100644
index 0000000..7c435ba
--- /dev/null
+++ b/templates/app/www/spec/lib/jasmine-1.2.0/MIT.LICENSE
@@ -0,0 +1,20 @@
+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.