You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by jo...@apache.org on 2015/09/06 18:15:40 UTC

[17/17] struts git commit: WW-4522 Support latest stable AngularJS version in maven angularjs archetype

WW-4522 Support latest stable AngularJS version in maven angularjs archetype

- Upgrade to latest stable angular js version 1.4.5


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/4286d6a9
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/4286d6a9
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/4286d6a9

Branch: refs/heads/master
Commit: 4286d6a9dcf2fdf91924b817b60e7f00823b0ee2
Parents: 215a4f9
Author: Johannes Geppert <jo...@apache.org>
Authored: Sun Sep 6 18:15:13 2015 +0200
Committer: Johannes Geppert <jo...@apache.org>
Committed: Sun Sep 6 18:15:15 2015 +0200

----------------------------------------------------------------------
 .../webapp/js/lib/angular/angular-animate.js    |  773 ++++++++-----
 .../js/lib/angular/angular-animate.min.js       |   98 +-
 .../js/lib/angular/angular-animate.min.js.map   |    6 +-
 .../main/webapp/js/lib/angular/angular-aria.js  |    2 +-
 .../webapp/js/lib/angular/angular-aria.min.js   |    2 +-
 .../webapp/js/lib/angular/angular-cookies.js    |    4 +-
 .../js/lib/angular/angular-cookies.min.js       |    2 +-
 .../webapp/js/lib/angular/angular-loader.js     |    9 +-
 .../webapp/js/lib/angular/angular-loader.min.js |    9 +-
 .../js/lib/angular/angular-loader.min.js.map    |    6 +-
 .../js/lib/angular/angular-message-format.js    |    2 +-
 .../lib/angular/angular-message-format.min.js   |    2 +-
 .../webapp/js/lib/angular/angular-messages.js   |    2 +-
 .../js/lib/angular/angular-messages.min.js      |    2 +-
 .../main/webapp/js/lib/angular/angular-mocks.js |  104 +-
 .../webapp/js/lib/angular/angular-resource.js   |   12 +-
 .../js/lib/angular/angular-resource.min.js      |   16 +-
 .../js/lib/angular/angular-resource.min.js.map  |    4 +-
 .../main/webapp/js/lib/angular/angular-route.js |    7 +-
 .../webapp/js/lib/angular/angular-route.min.js  |    2 +-
 .../js/lib/angular/angular-route.min.js.map     |    2 +-
 .../webapp/js/lib/angular/angular-sanitize.js   |    4 +-
 .../js/lib/angular/angular-sanitize.min.js      |    2 +-
 .../webapp/js/lib/angular/angular-scenario.js   | 1068 +++++++++++------
 .../main/webapp/js/lib/angular/angular-touch.js |    2 +-
 .../webapp/js/lib/angular/angular-touch.min.js  |    2 +-
 .../src/main/webapp/js/lib/angular/angular.js   | 1070 ++++++++++++------
 .../main/webapp/js/lib/angular/angular.min.js   |  559 ++++-----
 .../webapp/js/lib/angular/angular.min.js.map    |    6 +-
 .../src/main/webapp/js/lib/angular/errors.json  |    2 +-
 .../js/lib/angular/i18n/angular-locale_af-na.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_af-za.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_af.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_ak-gh.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ak.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_am-et.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_am.js    |    2 +-
 .../lib/angular/i18n/angular-locale_ar-001.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-ae.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-bh.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-dj.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-dz.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_ar-eg.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-eh.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-er.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-il.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-iq.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-jo.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-km.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-kw.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-lb.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_ar-ly.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-ma.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_ar-mr.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-om.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-ps.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-qa.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_ar-sa.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_ar-sd.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-so.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-ss.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_ar-sy.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_ar-td.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ar-tn.js |   16 +-
 .../js/lib/angular/i18n/angular-locale_ar-ye.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_ar.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_as-in.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_as.js    |    2 +-
 .../angular/i18n/angular-locale_az-cyrl-az.js   |    2 +-
 .../lib/angular/i18n/angular-locale_az-cyrl.js  |    4 +-
 .../angular/i18n/angular-locale_az-latn-az.js   |    2 +-
 .../lib/angular/i18n/angular-locale_az-latn.js  |    4 +-
 .../js/lib/angular/i18n/angular-locale_az.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_be-by.js |   22 +-
 .../js/lib/angular/i18n/angular-locale_be.js    |   22 +-
 .../lib/angular/i18n/angular-locale_bem-zm.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_bem.js   |    2 +-
 .../angular/i18n/angular-locale_bm-latn-ml.js   |    2 +-
 .../lib/angular/i18n/angular-locale_bm-latn.js  |    4 +-
 .../js/lib/angular/i18n/angular-locale_bm.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_bo-cn.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_bo-in.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_bo.js    |    2 +-
 .../lib/angular/i18n/angular-locale_brx-in.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_brx.js   |    2 +-
 .../angular/i18n/angular-locale_bs-cyrl-ba.js   |    2 +-
 .../lib/angular/i18n/angular-locale_bs-cyrl.js  |    4 +-
 .../angular/i18n/angular-locale_bs-latn-ba.js   |    2 +-
 .../lib/angular/i18n/angular-locale_bs-latn.js  |    4 +-
 .../js/lib/angular/i18n/angular-locale_bs.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_ca-ad.js |   24 +-
 .../i18n/angular-locale_ca-es-valencia.js       |   24 +-
 .../js/lib/angular/i18n/angular-locale_ca-es.js |   24 +-
 .../js/lib/angular/i18n/angular-locale_ca-fr.js |   24 +-
 .../js/lib/angular/i18n/angular-locale_ca-it.js |   24 +-
 .../js/lib/angular/i18n/angular-locale_ca.js    |   24 +-
 .../lib/angular/i18n/angular-locale_cgg-ug.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_cgg.js   |    2 +-
 .../lib/angular/i18n/angular-locale_chr-us.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_chr.js   |    2 +-
 .../angular/i18n/angular-locale_ckb-arab-iq.js  |    2 +-
 .../angular/i18n/angular-locale_ckb-arab-ir.js  |    2 +-
 .../lib/angular/i18n/angular-locale_ckb-arab.js |    4 +-
 .../lib/angular/i18n/angular-locale_ckb-iq.js   |    2 +-
 .../lib/angular/i18n/angular-locale_ckb-ir.js   |    2 +-
 .../angular/i18n/angular-locale_ckb-latn-iq.js  |    2 +-
 .../lib/angular/i18n/angular-locale_ckb-latn.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_ckb.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_cs-cz.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_cs.js    |    4 +-
 .../js/lib/angular/i18n/angular-locale_cy-gb.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_cy.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_da-dk.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_da-gl.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_da.js    |    8 +-
 .../lib/angular/i18n/angular-locale_dav-ke.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_dav.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_de-at.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_de-li.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_dz-bt.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_dz.js    |    2 +-
 .../lib/angular/i18n/angular-locale_ebu-ke.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_ebu.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_ee-gh.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ee-tg.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ee.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_el-cy.js |    8 +-
 .../lib/angular/i18n/angular-locale_en-001.js   |   14 +-
 .../lib/angular/i18n/angular-locale_en-150.js   |   16 +-
 .../js/lib/angular/i18n/angular-locale_en-ag.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-ai.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-as.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_en-au.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_en-bb.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-be.js |   16 +-
 .../js/lib/angular/i18n/angular-locale_en-bm.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-bs.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-bw.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_en-bz.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_en-ca.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_en-cc.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-ck.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-cm.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-cx.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-dg.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-dm.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-er.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-fj.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-fk.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-fm.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-gb.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_en-gd.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-gg.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-gh.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-gi.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-gm.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-gu.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_en-gy.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-hk.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_en-ie.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_en-im.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-in.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_en-io.js |   14 +-
 .../lib/angular/i18n/angular-locale_en-iso.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_en-je.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-jm.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_en-ke.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-ki.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-kn.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-ky.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-lc.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-lr.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-ls.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-mg.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-mh.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_en-mo.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-mp.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_en-ms.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-mt.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-mu.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-mw.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-my.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-na.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-nf.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-ng.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-nr.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-nu.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-nz.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_en-pg.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-ph.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-pk.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-pn.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-pr.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_en-pw.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-rw.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-sb.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-sc.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-sd.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-sg.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_en-sh.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-sl.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-ss.js |   16 +-
 .../js/lib/angular/i18n/angular-locale_en-sx.js |   16 +-
 .../js/lib/angular/i18n/angular-locale_en-sz.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-tc.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-tk.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-to.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-tt.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-tv.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-tz.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-ug.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-um.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_en-us.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_en-vc.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-vg.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-vi.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_en-vu.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-ws.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-za.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_en-zm.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_en-zw.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_en.js    |    2 +-
 .../lib/angular/i18n/angular-locale_eo-001.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_eo.js    |    2 +-
 .../lib/angular/i18n/angular-locale_es-419.js   |   14 +-
 .../js/lib/angular/i18n/angular-locale_es-ar.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_es-bo.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_es-cl.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_es-co.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_es-cr.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_es-cu.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_es-do.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_es-ea.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_es-ec.js |   12 +-
 .../js/lib/angular/i18n/angular-locale_es-es.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_es-gq.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_es-gt.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_es-hn.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_es-ic.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_es-mx.js |   30 +-
 .../js/lib/angular/i18n/angular-locale_es-ni.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_es-pa.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_es-pe.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_es-ph.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_es-pr.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_es-py.js |   12 +-
 .../js/lib/angular/i18n/angular-locale_es-sv.js |   14 +-
 .../js/lib/angular/i18n/angular-locale_es-us.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_es-uy.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_es-ve.js |   12 +-
 .../js/lib/angular/i18n/angular-locale_es.js    |    6 +-
 .../js/lib/angular/i18n/angular-locale_fa-af.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_fa-ir.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_fa.js    |    2 +-
 .../lib/angular/i18n/angular-locale_fil-ph.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_fil.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_fr-ca.js |    4 +-
 .../lib/angular/i18n/angular-locale_fur-it.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_fur.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_ga-ie.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ga.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_gd-gb.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_gd.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_gl-es.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_gl.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_gu-in.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_gu.js    |    2 +-
 .../lib/angular/i18n/angular-locale_guz-ke.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_guz.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_gv-im.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_gv.js    |    2 +-
 .../angular/i18n/angular-locale_ha-latn-gh.js   |    2 +-
 .../angular/i18n/angular-locale_ha-latn-ne.js   |    2 +-
 .../angular/i18n/angular-locale_ha-latn-ng.js   |    2 +-
 .../lib/angular/i18n/angular-locale_ha-latn.js  |    4 +-
 .../js/lib/angular/i18n/angular-locale_ha.js    |    2 +-
 .../lib/angular/i18n/angular-locale_haw-us.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_haw.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_he-il.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_he.js    |    8 +-
 .../js/lib/angular/i18n/angular-locale_hi-in.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_hi.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_id-id.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_id.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_ig-ng.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ig.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_ii-cn.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ii.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_in.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_iw.js    |    8 +-
 .../js/lib/angular/i18n/angular-locale_ja-jp.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ja.js    |    2 +-
 .../lib/angular/i18n/angular-locale_jgo-cm.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_jgo.js   |    2 +-
 .../lib/angular/i18n/angular-locale_jmc-tz.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_jmc.js   |    2 +-
 .../lib/angular/i18n/angular-locale_kam-ke.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_kam.js   |    2 +-
 .../lib/angular/i18n/angular-locale_kde-tz.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_kde.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_ki-ke.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ki.js    |    2 +-
 .../lib/angular/i18n/angular-locale_kk-cyrl.js  |    2 +-
 .../lib/angular/i18n/angular-locale_kkj-cm.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_kkj.js   |    2 +-
 .../lib/angular/i18n/angular-locale_kln-ke.js   |   72 +-
 .../js/lib/angular/i18n/angular-locale_kln.js   |   72 +-
 .../js/lib/angular/i18n/angular-locale_km-kh.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_km.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_kn-in.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_kn.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_ko-kp.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ko-kr.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ko.js    |    2 +-
 .../lib/angular/i18n/angular-locale_kok-in.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_kok.js   |    2 +-
 .../angular/i18n/angular-locale_ks-arab-in.js   |    2 +-
 .../lib/angular/i18n/angular-locale_ks-arab.js  |    4 +-
 .../js/lib/angular/i18n/angular-locale_ks.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_kw-gb.js |   46 +-
 .../js/lib/angular/i18n/angular-locale_kw.js    |   46 +-
 .../lib/angular/i18n/angular-locale_ky-cyrl.js  |    2 +-
 .../lib/angular/i18n/angular-locale_lag-tz.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_lag.js   |    2 +-
 .../lib/angular/i18n/angular-locale_lkt-us.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_lkt.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_lv-lv.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_lv.js    |    2 +-
 .../lib/angular/i18n/angular-locale_mas-ke.js   |    2 +-
 .../lib/angular/i18n/angular-locale_mas-tz.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_mas.js   |    2 +-
 .../lib/angular/i18n/angular-locale_mer-ke.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_mer.js   |    2 +-
 .../lib/angular/i18n/angular-locale_mfe-mu.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_mfe.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_mg-mg.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_mg.js    |    2 +-
 .../lib/angular/i18n/angular-locale_mgh-mz.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_mgh.js   |    2 +-
 .../lib/angular/i18n/angular-locale_mgo-cm.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_mgo.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_mk-mk.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_mk.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_ml-in.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ml.js    |    2 +-
 .../angular/i18n/angular-locale_mn-cyrl-mn.js   |    2 +-
 .../lib/angular/i18n/angular-locale_mn-cyrl.js  |    4 +-
 .../js/lib/angular/i18n/angular-locale_mn.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_mr-in.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_mr.js    |    2 +-
 .../angular/i18n/angular-locale_ms-latn-bn.js   |    2 +-
 .../angular/i18n/angular-locale_ms-latn-my.js   |    2 +-
 .../angular/i18n/angular-locale_ms-latn-sg.js   |    2 +-
 .../lib/angular/i18n/angular-locale_ms-latn.js  |    4 +-
 .../js/lib/angular/i18n/angular-locale_ms.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_mt-mt.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_mt.js    |    2 +-
 .../lib/angular/i18n/angular-locale_mua-cm.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_mua.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_my-mm.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_my.js    |    4 +-
 .../lib/angular/i18n/angular-locale_naq-na.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_naq.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_nb-no.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_nb-sj.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_nb.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_nd-zw.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_nd.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_ne-in.js |   24 +-
 .../js/lib/angular/i18n/angular-locale_ne-np.js |   10 +-
 .../js/lib/angular/i18n/angular-locale_ne.js    |   10 +-
 .../js/lib/angular/i18n/angular-locale_nl-aw.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_nl-be.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_nl-bq.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_nl-cw.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_nl-nl.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_nl-sr.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_nl-sx.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_nl.js    |    4 +-
 .../lib/angular/i18n/angular-locale_nnh-cm.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_nnh.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_no-no.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_no.js    |    2 +-
 .../lib/angular/i18n/angular-locale_nus-sd.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_nus.js   |    2 +-
 .../lib/angular/i18n/angular-locale_nyn-ug.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_nyn.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_om-et.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_om-ke.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_om.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_or-in.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_or.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_os-ge.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_os-ru.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_os.js    |    2 +-
 .../angular/i18n/angular-locale_pa-arab-pk.js   |    2 +-
 .../lib/angular/i18n/angular-locale_pa-arab.js  |    2 +-
 .../angular/i18n/angular-locale_pa-guru-in.js   |    2 +-
 .../lib/angular/i18n/angular-locale_pa-guru.js  |    4 +-
 .../js/lib/angular/i18n/angular-locale_pa.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_pl-pl.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_pl.js    |    4 +-
 .../js/lib/angular/i18n/angular-locale_pt-br.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_pt.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_qu-bo.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_qu-ec.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_qu-pe.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_qu.js    |    2 +-
 .../lib/angular/i18n/angular-locale_rof-tz.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_rof.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_ru-ua.js |    6 +-
 .../js/lib/angular/i18n/angular-locale_rw-rw.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_rw.js    |    2 +-
 .../lib/angular/i18n/angular-locale_sah-ru.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_sah.js   |    2 +-
 .../lib/angular/i18n/angular-locale_saq-ke.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_saq.js   |    2 +-
 .../lib/angular/i18n/angular-locale_shi-latn.js |    2 +-
 .../lib/angular/i18n/angular-locale_shi-tfng.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_si-lk.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_si.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_sl-si.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_sl.js    |    8 +-
 .../lib/angular/i18n/angular-locale_smn-fi.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_smn.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_sn-zw.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_sn.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_so-dj.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_so-et.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_so-ke.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_so-so.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_so.js    |    2 +-
 .../angular/i18n/angular-locale_sr-cyrl-ba.js   |   16 +-
 .../lib/angular/i18n/angular-locale_sr-cyrl.js  |    2 +-
 .../angular/i18n/angular-locale_sr-latn-ba.js   |   16 +-
 .../js/lib/angular/i18n/angular-locale_sv-fi.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_sw-cd.js |  128 +++
 .../js/lib/angular/i18n/angular-locale_sw-ke.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_sw-tz.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_sw-ug.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_sw.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_ta-in.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ta-lk.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ta-my.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ta-sg.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ta.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_te-in.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_te.js    |    2 +-
 .../lib/angular/i18n/angular-locale_teo-ke.js   |    2 +-
 .../lib/angular/i18n/angular-locale_teo-ug.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_teo.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_th-th.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_th.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_ti-er.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ti-et.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ti.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_tl.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_to-to.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_to.js    |    2 +-
 .../lib/angular/i18n/angular-locale_tzm-latn.js |    2 +-
 .../angular/i18n/angular-locale_ug-arab-cn.js   |    2 +-
 .../lib/angular/i18n/angular-locale_ug-arab.js  |    4 +-
 .../js/lib/angular/i18n/angular-locale_ug.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_ur-in.js |    8 +-
 .../js/lib/angular/i18n/angular-locale_ur-pk.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_ur.js    |    2 +-
 .../angular/i18n/angular-locale_uz-cyrl-uz.js   |    2 +-
 .../lib/angular/i18n/angular-locale_uz-cyrl.js  |    4 +-
 .../angular/i18n/angular-locale_uz-latn-uz.js   |    2 +-
 .../lib/angular/i18n/angular-locale_uz-latn.js  |    4 +-
 .../js/lib/angular/i18n/angular-locale_uz.js    |    2 +-
 .../angular/i18n/angular-locale_vai-latn-lr.js  |    2 +-
 .../lib/angular/i18n/angular-locale_vai-latn.js |    4 +-
 .../angular/i18n/angular-locale_vai-vaii-lr.js  |    2 +-
 .../lib/angular/i18n/angular-locale_vai-vaii.js |    4 +-
 .../js/lib/angular/i18n/angular-locale_vai.js   |    2 +-
 .../lib/angular/i18n/angular-locale_vun-tz.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_vun.js   |    2 +-
 .../lib/angular/i18n/angular-locale_wae-ch.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_wae.js   |    2 +-
 .../lib/angular/i18n/angular-locale_yi-001.js   |    2 +-
 .../js/lib/angular/i18n/angular-locale_yi.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_yo-bj.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_yo-ng.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_yo.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_zh-cn.js |    2 +-
 .../angular/i18n/angular-locale_zh-hans-cn.js   |    2 +-
 .../angular/i18n/angular-locale_zh-hans-hk.js   |    2 +-
 .../angular/i18n/angular-locale_zh-hans-mo.js   |    2 +-
 .../angular/i18n/angular-locale_zh-hans-sg.js   |    6 +-
 .../lib/angular/i18n/angular-locale_zh-hans.js  |    4 +-
 .../angular/i18n/angular-locale_zh-hant-hk.js   |    2 +-
 .../angular/i18n/angular-locale_zh-hant-mo.js   |   10 +-
 .../angular/i18n/angular-locale_zh-hant-tw.js   |    2 +-
 .../lib/angular/i18n/angular-locale_zh-hant.js  |    2 +-
 .../js/lib/angular/i18n/angular-locale_zh-hk.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_zh-tw.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_zh.js    |    2 +-
 .../js/lib/angular/i18n/angular-locale_zu-za.js |    2 +-
 .../js/lib/angular/i18n/angular-locale_zu.js    |    2 +-
 .../src/main/webapp/js/lib/angular/version.json |    2 +-
 .../src/main/webapp/js/lib/angular/version.txt  |    2 +-
 502 files changed, 3815 insertions(+), 2892 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/4286d6a9/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-animate.js
----------------------------------------------------------------------
diff --git a/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-animate.js b/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-animate.js
index 5b49083..b19f02d 100644
--- a/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-animate.js
+++ b/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-animate.js
@@ -1,5 +1,5 @@
 /**
- * @license AngularJS v1.4.2
+ * @license AngularJS v1.4.5
  * (c) 2010-2015 Google, Inc. http://angularjs.org
  * License: MIT
  */
@@ -21,12 +21,60 @@ var isElement   = angular.isElement;
 var ELEMENT_NODE = 1;
 var COMMENT_NODE = 8;
 
+var ADD_CLASS_SUFFIX = '-add';
+var REMOVE_CLASS_SUFFIX = '-remove';
+var EVENT_CLASS_PREFIX = 'ng-';
+var ACTIVE_CLASS_SUFFIX = '-active';
+
 var NG_ANIMATE_CLASSNAME = 'ng-animate';
 var NG_ANIMATE_CHILDREN_DATA = '$$ngAnimateChildren';
 
+// Detect proper transitionend/animationend event names.
+var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT;
+
+// If unprefixed events are not supported but webkit-prefixed are, use the latter.
+// Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.
+// Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`
+// but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.
+// Register both events in case `window.onanimationend` is not supported because of that,
+// do the same for `transitionend` as Safari is likely to exhibit similar behavior.
+// Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit
+// therefore there is no reason to test anymore for other vendor prefixes:
+// http://caniuse.com/#search=transition
+if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {
+  CSS_PREFIX = '-webkit-';
+  TRANSITION_PROP = 'WebkitTransition';
+  TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend';
+} else {
+  TRANSITION_PROP = 'transition';
+  TRANSITIONEND_EVENT = 'transitionend';
+}
+
+if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) {
+  CSS_PREFIX = '-webkit-';
+  ANIMATION_PROP = 'WebkitAnimation';
+  ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend';
+} else {
+  ANIMATION_PROP = 'animation';
+  ANIMATIONEND_EVENT = 'animationend';
+}
+
+var DURATION_KEY = 'Duration';
+var PROPERTY_KEY = 'Property';
+var DELAY_KEY = 'Delay';
+var TIMING_KEY = 'TimingFunction';
+var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount';
+var ANIMATION_PLAYSTATE_KEY = 'PlayState';
+var SAFE_FAST_FORWARD_DURATION_VALUE = 9999;
+
+var ANIMATION_DELAY_PROP = ANIMATION_PROP + DELAY_KEY;
+var ANIMATION_DURATION_PROP = ANIMATION_PROP + DURATION_KEY;
+var TRANSITION_DELAY_PROP = TRANSITION_PROP + DELAY_KEY;
+var TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY;
+
 var isPromiseLike = function(p) {
   return p && p.then ? true : false;
-}
+};
 
 function assertArg(arg, name, reason) {
   if (!arg) {
@@ -177,8 +225,21 @@ function mergeAnimationOptions(element, target, newOptions) {
   var toRemove = (target.removeClass || '') + ' ' + (newOptions.removeClass || '');
   var classes = resolveElementClasses(element.attr('class'), toAdd, toRemove);
 
+  if (newOptions.preparationClasses) {
+    target.preparationClasses = concatWithSpace(newOptions.preparationClasses, target.preparationClasses);
+    delete newOptions.preparationClasses;
+  }
+
+  // noop is basically when there is no callback; otherwise something has been set
+  var realDomOperation = target.domOperation !== noop ? target.domOperation : null;
+
   extend(target, newOptions);
 
+  // TODO(matsko or sreeramu): proper fix is to maintain all animation callback in array and call at last,but now only leave has the callback so no issue with this.
+  if (realDomOperation) {
+    target.domOperation = realDomOperation;
+  }
+
   if (classes.addClass) {
     target.addClass = classes.addClass;
   } else {
@@ -256,18 +317,81 @@ function getDomNode(element) {
   return (element instanceof angular.element) ? element[0] : element;
 }
 
+function applyGeneratedPreparationClasses(element, event, options) {
+  var classes = '';
+  if (event) {
+    classes = pendClasses(event, EVENT_CLASS_PREFIX, true);
+  }
+  if (options.addClass) {
+    classes = concatWithSpace(classes, pendClasses(options.addClass, ADD_CLASS_SUFFIX));
+  }
+  if (options.removeClass) {
+    classes = concatWithSpace(classes, pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX));
+  }
+  if (classes.length) {
+    options.preparationClasses = classes;
+    element.addClass(classes);
+  }
+}
+
+function clearGeneratedClasses(element, options) {
+  if (options.preparationClasses) {
+    element.removeClass(options.preparationClasses);
+    options.preparationClasses = null;
+  }
+  if (options.activeClasses) {
+    element.removeClass(options.activeClasses);
+    options.activeClasses = null;
+  }
+}
+
+function blockTransitions(node, duration) {
+  // we use a negative delay value since it performs blocking
+  // yet it doesn't kill any existing transitions running on the
+  // same element which makes this safe for class-based animations
+  var value = duration ? '-' + duration + 's' : '';
+  applyInlineStyle(node, [TRANSITION_DELAY_PROP, value]);
+  return [TRANSITION_DELAY_PROP, value];
+}
+
+function blockKeyframeAnimations(node, applyBlock) {
+  var value = applyBlock ? 'paused' : '';
+  var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY;
+  applyInlineStyle(node, [key, value]);
+  return [key, value];
+}
+
+function applyInlineStyle(node, styleTuple) {
+  var prop = styleTuple[0];
+  var value = styleTuple[1];
+  node.style[prop] = value;
+}
+
+function concatWithSpace(a,b) {
+  if (!a) return b;
+  if (!b) return a;
+  return a + ' ' + b;
+}
+
+function $$BodyProvider() {
+  this.$get = ['$document', function($document) {
+    return jqLite($document[0].body);
+  }];
+}
+
 var $$rAFSchedulerFactory = ['$$rAF', function($$rAF) {
-  var tickQueue = [];
-  var cancelFn;
+  var queue, cancelFn;
 
   function scheduler(tasks) {
     // we make a copy since RAFScheduler mutates the state
     // of the passed in array variable and this would be difficult
     // to track down on the outside code
-    tickQueue.push([].concat(tasks));
+    queue = queue.concat(tasks);
     nextTick();
   }
 
+  queue = scheduler.queue = [];
+
   /* waitUntilQuiet does two things:
    * 1. It will run the FINAL `fn` value only when an uncancelled RAF has passed through
    * 2. It will delay the next wave of tasks from running until the quiet `fn` has run.
@@ -289,17 +413,12 @@ var $$rAFSchedulerFactory = ['$$rAF', function($$rAF) {
   return scheduler;
 
   function nextTick() {
-    if (!tickQueue.length) return;
+    if (!queue.length) return;
 
-    var updatedQueue = [];
-    for (var i = 0; i < tickQueue.length; i++) {
-      var innerQueue = tickQueue[i];
-      runNextTask(innerQueue);
-      if (innerQueue.length) {
-        updatedQueue.push(innerQueue);
-      }
+    var items = queue.shift();
+    for (var i = 0; i < items.length; i++) {
+      items[i]();
     }
-    tickQueue = updatedQueue;
 
     if (!cancelFn) {
       $$rAF(function() {
@@ -307,11 +426,6 @@ var $$rAFSchedulerFactory = ['$$rAF', function($$rAF) {
       });
     }
   }
-
-  function runNextTask(tasks) {
-    var nextTask = tasks.shift();
-    nextTask();
-  }
 }];
 
 var $$AnimateChildrenDirective = [function() {
@@ -328,6 +442,8 @@ var $$AnimateChildrenDirective = [function() {
   };
 }];
 
+var ANIMATE_TIMER_KEY = '$$animateCss';
+
 /**
  * @ngdoc service
  * @name $animateCss
@@ -514,7 +630,7 @@ var $$AnimateChildrenDirective = [function() {
  * to the element during the animation. Multiple events can be provided when spaces are used as a separator. (Note that this will not perform any DOM operation.)
  * * `easing` - The CSS easing value that will be applied to the transition or keyframe animation (or both).
  * * `transition` - The raw CSS transition style that will be used (e.g. `1s linear all`).
- * * `keyframe` - The raw CSS keyframe animation style that will be used (e.g. `1s my_animation linear`).
+ * * `keyframeStyle` - The raw CSS keyframe animation style that will be used (e.g. `1s my_animation linear`).
  * * `from` - The starting CSS styles (a key/value object) that will be applied at the start of the animation.
  * * `to` - The ending CSS styles (a key/value object) that will be applied across the animation via a CSS transition.
  * * `addClass` - A space separated list of CSS classes that will be added to the element and spread across the animation.
@@ -528,63 +644,19 @@ var $$AnimateChildrenDirective = [function() {
  * * `stagger` - A numeric time value representing the delay between successively animated elements
  * ({@link ngAnimate#css-staggering-animations Click here to learn how CSS-based staggering works in ngAnimate.})
  * * `staggerIndex` - The numeric index representing the stagger item (e.g. a value of 5 is equal to the sixth item in the stagger; therefore when a
- * `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`)
- * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occuring on the classes being added and removed.)
+ * * `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`)
+ * * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occuring on the classes being added and removed.)
  *
  * @return {object} an object with start and end methods and details about the animation.
  *
  * * `start` - The method to start the animation. This will return a `Promise` when called.
  * * `end` - This method will cancel the animation and remove all applied CSS classes and styles.
  */
-
-// Detect proper transitionend/animationend event names.
-var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT;
-
-// If unprefixed events are not supported but webkit-prefixed are, use the latter.
-// Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.
-// Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`
-// but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.
-// Register both events in case `window.onanimationend` is not supported because of that,
-// do the same for `transitionend` as Safari is likely to exhibit similar behavior.
-// Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit
-// therefore there is no reason to test anymore for other vendor prefixes:
-// http://caniuse.com/#search=transition
-if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {
-  CSS_PREFIX = '-webkit-';
-  TRANSITION_PROP = 'WebkitTransition';
-  TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend';
-} else {
-  TRANSITION_PROP = 'transition';
-  TRANSITIONEND_EVENT = 'transitionend';
-}
-
-if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) {
-  CSS_PREFIX = '-webkit-';
-  ANIMATION_PROP = 'WebkitAnimation';
-  ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend';
-} else {
-  ANIMATION_PROP = 'animation';
-  ANIMATIONEND_EVENT = 'animationend';
-}
-
-var DURATION_KEY = 'Duration';
-var PROPERTY_KEY = 'Property';
-var DELAY_KEY = 'Delay';
-var TIMING_KEY = 'TimingFunction';
-var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount';
-var ANIMATION_PLAYSTATE_KEY = 'PlayState';
-var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;
-var CLOSING_TIME_BUFFER = 1.5;
 var ONE_SECOND = 1000;
 var BASE_TEN = 10;
 
-var SAFE_FAST_FORWARD_DURATION_VALUE = 9999;
-
-var ANIMATION_DELAY_PROP = ANIMATION_PROP + DELAY_KEY;
-var ANIMATION_DURATION_PROP = ANIMATION_PROP + DURATION_KEY;
-
-var TRANSITION_DELAY_PROP = TRANSITION_PROP + DELAY_KEY;
-var TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY;
+var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;
+var CLOSING_TIME_BUFFER = 1.5;
 
 var DETECT_CSS_PROPERTIES = {
   transitionDuration:      TRANSITION_DURATION_PROP,
@@ -602,6 +674,15 @@ var DETECT_STAGGER_CSS_PROPERTIES = {
   animationDelay:          ANIMATION_DELAY_PROP
 };
 
+function getCssKeyframeDurationStyle(duration) {
+  return [ANIMATION_DURATION_PROP, duration + 's'];
+}
+
+function getCssDelayStyle(delay, isKeyframeAnimation) {
+  var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP;
+  return [prop, delay + 's'];
+}
+
 function computeCssStyles($window, element, properties) {
   var styles = Object.create(null);
   var detectedStyles = $window.getComputedStyle(element) || {};
@@ -658,37 +739,6 @@ function getCssTransitionDurationStyle(duration, applyOnlyDuration) {
   return [style, value];
 }
 
-function getCssKeyframeDurationStyle(duration) {
-  return [ANIMATION_DURATION_PROP, duration + 's'];
-}
-
-function getCssDelayStyle(delay, isKeyframeAnimation) {
-  var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP;
-  return [prop, delay + 's'];
-}
-
-function blockTransitions(node, duration) {
-  // we use a negative delay value since it performs blocking
-  // yet it doesn't kill any existing transitions running on the
-  // same element which makes this safe for class-based animations
-  var value = duration ? '-' + duration + 's' : '';
-  applyInlineStyle(node, [TRANSITION_DELAY_PROP, value]);
-  return [TRANSITION_DELAY_PROP, value];
-}
-
-function blockKeyframeAnimations(node, applyBlock) {
-  var value = applyBlock ? 'paused' : '';
-  var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY;
-  applyInlineStyle(node, [key, value]);
-  return [key, value];
-}
-
-function applyInlineStyle(node, styleTuple) {
-  var prop = styleTuple[0];
-  var value = styleTuple[1];
-  node.style[prop] = value;
-}
-
 function createLocalCacheLookup() {
   var cache = Object.create(null);
   return {
@@ -721,9 +771,9 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
   var gcsStaggerLookup = createLocalCacheLookup();
 
   this.$get = ['$window', '$$jqLite', '$$AnimateRunner', '$timeout',
-               '$document', '$sniffer', '$$rAFScheduler',
+               '$$forceReflow', '$sniffer', '$$rAFScheduler', '$animate',
        function($window,   $$jqLite,   $$AnimateRunner,   $timeout,
-                $document,   $sniffer,   $$rAFScheduler) {
+                $$forceReflow,   $sniffer,   $$rAFScheduler, $animate) {
 
     var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
 
@@ -780,7 +830,7 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
       return stagger || {};
     }
 
-    var bod = getDomNode($document).body;
+    var cancelLastRAFRequest;
     var rafWaitQueue = [];
     function waitUntilQuiet(callback) {
       rafWaitQueue.push(callback);
@@ -788,27 +838,19 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
         gcsLookup.flush();
         gcsStaggerLookup.flush();
 
-        //the line below will force the browser to perform a repaint so
-        //that all the animated elements within the animation frame will
-        //be properly updated and drawn on screen. This is required to
-        //ensure that the preparation animation is properly flushed so that
-        //the active state picks up from there. DO NOT REMOVE THIS LINE.
-        //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH
-        //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND
-        //WILL TAKE YEARS AWAY FROM YOUR LIFE.
-        var width = bod.offsetWidth + 1;
+        // DO NOT REMOVE THIS LINE OR REFACTOR OUT THE `pageWidth` variable.
+        // PLEASE EXAMINE THE `$$forceReflow` service to understand why.
+        var pageWidth = $$forceReflow();
 
         // we use a for loop to ensure that if the queue is changed
         // during this looping then it will consider new requests
         for (var i = 0; i < rafWaitQueue.length; i++) {
-          rafWaitQueue[i](width);
+          rafWaitQueue[i](pageWidth);
         }
         rafWaitQueue.length = 0;
       });
     }
 
-    return init;
-
     function computeTimings(node, className, cacheKey) {
       var timings = computeCachedCssStyles(node, className, cacheKey, DETECT_CSS_PROPERTIES);
       var aD = timings.animationDelay;
@@ -823,8 +865,14 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
       return timings;
     }
 
-    function init(element, options) {
+    return function init(element, options) {
       var node = getDomNode(element);
+      if (!node
+          || !node.parentNode
+          || !$animate.enabled()) {
+        return closeAndReturnNoopAnimator();
+      }
+
       options = prepareAnimationOptions(options);
 
       var temporaryStyles = [];
@@ -853,20 +901,20 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
       var addRemoveClassName = '';
 
       if (isStructural) {
-        structuralClassName = pendClasses(method, 'ng-', true);
+        structuralClassName = pendClasses(method, EVENT_CLASS_PREFIX, true);
       } else if (method) {
         structuralClassName = method;
       }
 
       if (options.addClass) {
-        addRemoveClassName += pendClasses(options.addClass, '-add');
+        addRemoveClassName += pendClasses(options.addClass, ADD_CLASS_SUFFIX);
       }
 
       if (options.removeClass) {
         if (addRemoveClassName.length) {
           addRemoveClassName += ' ';
         }
-        addRemoveClassName += pendClasses(options.removeClass, '-remove');
+        addRemoveClassName += pendClasses(options.removeClass, REMOVE_CLASS_SUFFIX);
       }
 
       // there may be a situation where a structural animation is combined together
@@ -877,17 +925,20 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
       // there actually is a detected transition or keyframe animation
       if (options.applyClassesEarly && addRemoveClassName.length) {
         applyAnimationClasses(element, options);
-        addRemoveClassName = '';
       }
 
-      var setupClasses = [structuralClassName, addRemoveClassName].join(' ').trim();
-      var fullClassName = classes + ' ' + setupClasses;
-      var activeClasses = pendClasses(setupClasses, '-active');
+      var preparationClasses = [structuralClassName, addRemoveClassName].join(' ').trim();
+      var fullClassName = classes + ' ' + preparationClasses;
+      var activeClasses = pendClasses(preparationClasses, ACTIVE_CLASS_SUFFIX);
       var hasToStyles = styles.to && Object.keys(styles.to).length > 0;
-
-      // there is no way we can trigger an animation since no styles and
-      // no classes are being applied which would then trigger a transition
-      if (!hasToStyles && !setupClasses) {
+      var containsKeyframeAnimation = (options.keyframeStyle || '').length > 0;
+
+      // there is no way we can trigger an animation if no styles and
+      // no classes are being applied which would then trigger a transition,
+      // unless there a is raw keyframe value that is applied to the element.
+      if (!containsKeyframeAnimation
+           && !hasToStyles
+           && !preparationClasses) {
         return closeAndReturnNoopAnimator();
       }
 
@@ -902,10 +953,12 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
         };
       } else {
         cacheKey = gcsHashFn(node, fullClassName);
-        stagger = computeCachedCssStaggerStyles(node, setupClasses, cacheKey, DETECT_STAGGER_CSS_PROPERTIES);
+        stagger = computeCachedCssStaggerStyles(node, preparationClasses, cacheKey, DETECT_STAGGER_CSS_PROPERTIES);
       }
 
-      $$jqLite.addClass(element, setupClasses);
+      if (!options.$$skipPreparationClasses) {
+        $$jqLite.addClass(element, preparationClasses);
+      }
 
       var applyOnlyDuration;
 
@@ -944,7 +997,7 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
       // transition delay to allow for the transition to naturally do it's thing. The beauty here is
       // that if there is no transition defined then nothing will happen and this will also allow
       // other transitions to be stacked on top of each other without any chopping them out.
-      if (isFirst) {
+      if (isFirst && !options.skipBlocking) {
         blockTransitions(node, SAFE_FAST_FORWARD_DURATION_VALUE);
       }
 
@@ -986,6 +1039,18 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
         return closeAndReturnNoopAnimator();
       }
 
+      if (options.delay != null) {
+        var delayStyle = parseFloat(options.delay);
+
+        if (flags.applyTransitionDelay) {
+          temporaryStyles.push(getCssDelayStyle(delayStyle));
+        }
+
+        if (flags.applyAnimationDelay) {
+          temporaryStyles.push(getCssDelayStyle(delayStyle, true));
+        }
+      }
+
       // we need to recalculate the delay value since we used a pre-emptive negative
       // delay value and the delay value is required for the final event checking. This
       // property will ensure that this will happen after the RAF phase has passed.
@@ -1003,12 +1068,13 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
       }
 
       applyAnimationFromStyles(element, options);
-      if (!flags.blockTransition) {
+
+      if (flags.blockTransition || flags.blockKeyframeAnimation) {
+        applyBlocking(maxDuration);
+      } else if (!options.skipBlocking) {
         blockTransitions(node, false);
       }
 
-      applyBlocking(maxDuration);
-
       // TODO(matsko): for 1.5 change this code to have an animator object for better debugging
       return {
         $$willAnimate: true,
@@ -1050,7 +1116,9 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
         animationClosed = true;
         animationPaused = false;
 
-        $$jqLite.removeClass(element, setupClasses);
+        if (!options.$$skipPreparationClasses) {
+          $$jqLite.removeClass(element, preparationClasses);
+        }
         $$jqLite.removeClass(element, activeClasses);
 
         blockKeyframeAnimations(node, false);
@@ -1097,6 +1165,8 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
           cancel: cancelFn
         });
 
+        // should flush the cache animation
+        waitUntilQuiet(noop);
         close();
 
         return {
@@ -1110,6 +1180,10 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
 
       function start() {
         if (animationClosed) return;
+        if (!node.parentNode) {
+          close();
+          return;
+        }
 
         var startTime, events = [];
 
@@ -1173,7 +1247,7 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
           $$jqLite.addClass(element, activeClasses);
 
           if (flags.recalculateTimingStyles) {
-            fullClassName = node.className + ' ' + setupClasses;
+            fullClassName = node.className + ' ' + preparationClasses;
             cacheKey = gcsHashFn(node, fullClassName);
 
             timings = computeTimings(node, fullClassName, cacheKey);
@@ -1190,27 +1264,16 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
             flags.hasAnimations = timings.animationDuration > 0;
           }
 
-          if (flags.applyTransitionDelay || flags.applyAnimationDelay) {
+          if (flags.applyAnimationDelay) {
             relativeDelay = typeof options.delay !== "boolean" && truthyTimingValue(options.delay)
                   ? parseFloat(options.delay)
                   : relativeDelay;
 
             maxDelay = Math.max(relativeDelay, 0);
-
-            var delayStyle;
-            if (flags.applyTransitionDelay) {
-              timings.transitionDelay = relativeDelay;
-              delayStyle = getCssDelayStyle(relativeDelay);
-              temporaryStyles.push(delayStyle);
-              node.style[delayStyle[0]] = delayStyle[1];
-            }
-
-            if (flags.applyAnimationDelay) {
-              timings.animationDelay = relativeDelay;
-              delayStyle = getCssDelayStyle(relativeDelay, true);
-              temporaryStyles.push(delayStyle);
-              node.style[delayStyle[0]] = delayStyle[1];
-            }
+            timings.animationDelay = relativeDelay;
+            delayStyle = getCssDelayStyle(relativeDelay, true);
+            temporaryStyles.push(delayStyle);
+            node.style[delayStyle[0]] = delayStyle[1];
           }
 
           maxDelayTime = maxDelay * ONE_SECOND;
@@ -1239,17 +1302,47 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
           }
 
           startTime = Date.now();
-          element.on(events.join(' '), onAnimationProgress);
-          $timeout(onAnimationExpired, maxDelayTime + CLOSING_TIME_BUFFER * maxDurationTime);
+          var timerTime = maxDelayTime + CLOSING_TIME_BUFFER * maxDurationTime;
+          var endTime = startTime + timerTime;
+
+          var animationsData = element.data(ANIMATE_TIMER_KEY) || [];
+          var setupFallbackTimer = true;
+          if (animationsData.length) {
+            var currentTimerData = animationsData[0];
+            setupFallbackTimer = endTime > currentTimerData.expectedEndTime;
+            if (setupFallbackTimer) {
+              $timeout.cancel(currentTimerData.timer);
+            } else {
+              animationsData.push(close);
+            }
+          }
+
+          if (setupFallbackTimer) {
+            var timer = $timeout(onAnimationExpired, timerTime, false);
+            animationsData[0] = {
+              timer: timer,
+              expectedEndTime: endTime
+            };
+            animationsData.push(close);
+            element.data(ANIMATE_TIMER_KEY, animationsData);
+          }
 
+          element.on(events.join(' '), onAnimationProgress);
           applyAnimationToStyles(element, options);
         }
 
         function onAnimationExpired() {
-          // although an expired animation is a failed animation, getting to
-          // this outcome is very easy if the CSS code screws up. Therefore we
-          // should still continue normally as if the animation completed correctly.
-          close();
+          var animationsData = element.data(ANIMATE_TIMER_KEY);
+
+          // this will be false in the event that the element was
+          // removed from the DOM (via a leave animation or something
+          // similar)
+          if (animationsData) {
+            for (var i = 1; i < animationsData.length; i++) {
+              animationsData[i]();
+            }
+            element.removeData(ANIMATE_TIMER_KEY);
+          }
         }
 
         function onAnimationProgress(event) {
@@ -1276,7 +1369,7 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
           }
         }
       }
-    }
+    };
   }];
 }];
 
@@ -1289,17 +1382,19 @@ var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationPro
   var NG_OUT_ANCHOR_CLASS_NAME = 'ng-anchor-out';
   var NG_IN_ANCHOR_CLASS_NAME = 'ng-anchor-in';
 
-  this.$get = ['$animateCss', '$rootScope', '$$AnimateRunner', '$rootElement', '$document', '$sniffer',
-       function($animateCss,   $rootScope,   $$AnimateRunner,   $rootElement,   $document,   $sniffer) {
+  this.$get = ['$animateCss', '$rootScope', '$$AnimateRunner', '$rootElement', '$$body', '$sniffer', '$$jqLite',
+       function($animateCss,   $rootScope,   $$AnimateRunner,   $rootElement,   $$body,   $sniffer,   $$jqLite) {
 
     // only browsers that support these properties can render animations
     if (!$sniffer.animations && !$sniffer.transitions) return noop;
 
-    var bodyNode = getDomNode($document).body;
+    var bodyNode = getDomNode($$body);
     var rootNode = getDomNode($rootElement);
 
     var rootBodyElement = jqLite(bodyNode.parentNode === rootNode ? bodyNode : rootNode);
 
+    var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
+
     return function initDriverFn(animationDetails) {
       return animationDetails.from && animationDetails.to
           ? prepareFromToAnchorAnimation(animationDetails.from,
@@ -1450,8 +1545,8 @@ var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationPro
     }
 
     function prepareFromToAnchorAnimation(from, to, classes, anchors) {
-      var fromAnimation = prepareRegularAnimation(from);
-      var toAnimation = prepareRegularAnimation(to);
+      var fromAnimation = prepareRegularAnimation(from, noop);
+      var toAnimation = prepareRegularAnimation(to, noop);
 
       var anchorAnimations = [];
       forEach(anchors, function(anchor) {
@@ -1507,19 +1602,23 @@ var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationPro
       var options = animationDetails.options || {};
 
       if (animationDetails.structural) {
-        // structural animations ensure that the CSS classes are always applied
-        // before the detection starts.
-        options.structural = options.applyClassesEarly = true;
+        options.event = animationDetails.event;
+        options.structural = true;
+        options.applyClassesEarly = true;
 
         // we special case the leave animation since we want to ensure that
         // the element is removed as soon as the animation is over. Otherwise
         // a flicker might appear or the element may not be removed at all
-        options.event = animationDetails.event;
-        if (options.event === 'leave') {
+        if (animationDetails.event === 'leave') {
           options.onDone = options.domOperation;
         }
-      } else {
-        options.event = null;
+      }
+
+      // We assign the preparationClasses as the actual animation event since
+      // the internals of $animateCss will just suffix the event token values
+      // with `-active` to trigger the animation.
+      if (options.preparationClasses) {
+        options.event = concatWithSpace(options.event, options.preparationClasses);
       }
 
       var animator = $animateCss(element, options);
@@ -1538,8 +1637,8 @@ var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationPro
 //  by the time...
 
 var $$AnimateJsProvider = ['$animateProvider', function($animateProvider) {
-  this.$get = ['$injector', '$$AnimateRunner', '$$rAFMutex', '$$jqLite',
-       function($injector,   $$AnimateRunner,   $$rAFMutex,   $$jqLite) {
+  this.$get = ['$injector', '$$AnimateRunner', '$$jqLite',
+       function($injector,   $$AnimateRunner,   $$jqLite) {
 
     var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
          // $animateJs(element, 'enter');
@@ -1896,8 +1995,8 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
   });
 
   rules.skip.push(function(element, newAnimation, currentAnimation) {
-    // if there is a current animation then skip the class-based animation
-    return currentAnimation.structural && !newAnimation.structural;
+    // if there is an ongoing current animation then don't even bother running the class-based animation
+    return currentAnimation.structural && currentAnimation.state === RUNNING_STATE && !newAnimation.structural;
   });
 
   rules.cancel.push(function(element, newAnimation, currentAnimation) {
@@ -1919,14 +2018,13 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
     return (nO.addClass && nO.addClass === cO.removeClass) || (nO.removeClass && nO.removeClass === cO.addClass);
   });
 
-  this.$get = ['$$rAF', '$rootScope', '$rootElement', '$document', '$$HashMap',
-               '$$animation', '$$AnimateRunner', '$templateRequest', '$$jqLite',
-       function($$rAF,   $rootScope,   $rootElement,   $document,   $$HashMap,
-                $$animation,   $$AnimateRunner,   $templateRequest,   $$jqLite) {
+  this.$get = ['$$rAF', '$rootScope', '$rootElement', '$document', '$$body', '$$HashMap',
+               '$$animation', '$$AnimateRunner', '$templateRequest', '$$jqLite', '$$forceReflow',
+       function($$rAF,   $rootScope,   $rootElement,   $document,   $$body,   $$HashMap,
+                $$animation,   $$AnimateRunner,   $templateRequest,   $$jqLite,   $$forceReflow) {
 
     var activeAnimationsLookup = new $$HashMap();
     var disabledElementsLookup = new $$HashMap();
-
     var animationsEnabled = null;
 
     // Wait until all directive and route-related templates are downloaded and
@@ -1958,8 +2056,6 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
       }
     );
 
-    var bodyElement = jqLite($document[0].body);
-
     var callbackRegistry = {};
 
     // remember that the classNameFilter is set during the provider/config
@@ -2095,22 +2191,22 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
       // These methods will become available after the digest has passed
       var runner = new $$AnimateRunner();
 
-      // there are situations where a directive issues an animation for
-      // a jqLite wrapper that contains only comment nodes... If this
-      // happens then there is no way we can perform an animation
-      if (!node) {
-        close();
-        return runner;
-      }
-
       if (isArray(options.addClass)) {
         options.addClass = options.addClass.join(' ');
       }
 
+      if (options.addClass && !isString(options.addClass)) {
+        options.addClass = null;
+      }
+
       if (isArray(options.removeClass)) {
         options.removeClass = options.removeClass.join(' ');
       }
 
+      if (options.removeClass && !isString(options.removeClass)) {
+        options.removeClass = null;
+      }
+
       if (options.from && !isObject(options.from)) {
         options.from = null;
       }
@@ -2119,6 +2215,14 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
         options.to = null;
       }
 
+      // there are situations where a directive issues an animation for
+      // a jqLite wrapper that contains only comment nodes... If this
+      // happens then there is no way we can perform an animation
+      if (!node) {
+        close();
+        return runner;
+      }
+
       var className = [node.className, options.addClass, options.removeClass].join(' ');
       if (!isAnimatableClassName(className)) {
         close();
@@ -2183,8 +2287,9 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
             // method which will call the runner methods in async.
             existingAnimation.close();
           } else {
-            // this will merge the existing animation options into this new follow-up animation
-            mergeAnimationOptions(element, newAnimation.options, existingAnimation.options);
+            // this will merge the new animation options into existing animation options
+            mergeAnimationOptions(element, existingAnimation.options, newAnimation.options);
+            return existingAnimation.runner;
           }
         } else {
           // a joined animation means that this animation will take over the existing one
@@ -2195,9 +2300,14 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
             if (existingAnimation.state === RUNNING_STATE) {
               normalizeAnimationOptions(element, options);
             } else {
+              applyGeneratedPreparationClasses(element, isStructural ? event : null, options);
+
               event = newAnimation.event = existingAnimation.event;
               options = mergeAnimationOptions(element, existingAnimation.options, newAnimation.options);
-              return runner;
+
+              //we return the same runner since only the option values of this animation will
+              //be fed into the `existingAnimation`.
+              return existingAnimation.runner;
             }
           }
         }
@@ -2223,10 +2333,6 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
         return runner;
       }
 
-      if (isStructural) {
-        closeParentClassBasedAnimations(parent);
-      }
-
       // the counter keeps track of cancelled animations
       var counter = (existingAnimation.counter || 0) + 1;
       newAnimation.counter = counter;
@@ -2284,12 +2390,9 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
             ? 'setClass'
             : animationDetails.event;
 
-        if (animationDetails.structural) {
-          closeParentClassBasedAnimations(parentElement);
-        }
-
         markElementAnimationState(element, RUNNING_STATE);
         var realRunner = $$animation(element, event, animationDetails.options);
+
         realRunner.done(function(status) {
           close(!status);
           var animationDetails = activeAnimationsLookup.get(node);
@@ -2313,6 +2416,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
       }
 
       function close(reject) { // jshint ignore:line
+        clearGeneratedClasses(element, options);
         applyAnimationClasses(element, options);
         applyAnimationStyles(element, options);
         options.domOperation();
@@ -2349,36 +2453,9 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
       return getDomNode(nodeOrElmA) === getDomNode(nodeOrElmB);
     }
 
-    function closeParentClassBasedAnimations(startingElement) {
-      var parentNode = getDomNode(startingElement);
-      do {
-        if (!parentNode || parentNode.nodeType !== ELEMENT_NODE) break;
-
-        var animationDetails = activeAnimationsLookup.get(parentNode);
-        if (animationDetails) {
-          examineParentAnimation(parentNode, animationDetails);
-        }
-
-        parentNode = parentNode.parentNode;
-      } while (true);
-
-      // since animations are detected from CSS classes, we need to flush all parent
-      // class-based animations so that the parent classes are all present for child
-      // animations to properly function (otherwise any CSS selectors may not work)
-      function examineParentAnimation(node, animationDetails) {
-        // enter/leave/move always have priority
-        if (animationDetails.structural || !hasAnimationClasses(animationDetails.options)) return;
-
-        if (animationDetails.state === RUNNING_STATE) {
-          animationDetails.runner.end();
-        }
-        clearElementAnimationState(node);
-      }
-    }
-
     function areAnimationsAllowed(element, parentElement, event) {
-      var bodyElementDetected = false;
-      var rootElementDetected = false;
+      var bodyElementDetected = isMatchingElement(element, $$body) || element[0].nodeName === 'HTML';
+      var rootElementDetected = isMatchingElement(element, $rootElement);
       var parentAnimationDetected = false;
       var animateChildren;
 
@@ -2433,7 +2510,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
         if (!bodyElementDetected) {
           // we also need to ensure that the element is or will be apart of the body element
           // otherwise it is pointless to even issue an animation to be rendered
-          bodyElementDetected = isMatchingElement(parentElement, bodyElement);
+          bodyElementDetected = isMatchingElement(parentElement, $$body);
         }
 
         parentElement = parentElement.parent();
@@ -2459,19 +2536,34 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
   }];
 }];
 
-var $$rAFMutexFactory = ['$$rAF', function($$rAF) {
+var $$AnimateAsyncRunFactory = ['$$rAF', function($$rAF) {
+  var waitQueue = [];
+
+  function waitForTick(fn) {
+    waitQueue.push(fn);
+    if (waitQueue.length > 1) return;
+    $$rAF(function() {
+      for (var i = 0; i < waitQueue.length; i++) {
+        waitQueue[i]();
+      }
+      waitQueue = [];
+    });
+  }
+
   return function() {
     var passed = false;
-    $$rAF(function() {
+    waitForTick(function() {
       passed = true;
     });
-    return function(fn) {
-      passed ? fn() : $$rAF(fn);
+    return function(callback) {
+      passed ? callback() : waitForTick(callback);
     };
   };
 }];
 
-var $$AnimateRunnerFactory = ['$q', '$$rAFMutex', function($q, $$rAFMutex) {
+var $$AnimateRunnerFactory = ['$q', '$sniffer', '$$animateAsyncRun',
+                      function($q,   $sniffer,   $$animateAsyncRun) {
+
   var INITIAL_STATE = 0;
   var DONE_PENDING_STATE = 1;
   var DONE_COMPLETE_STATE = 2;
@@ -2516,7 +2608,7 @@ var $$AnimateRunnerFactory = ['$q', '$$rAFMutex', function($q, $$rAFMutex) {
     this.setHost(host);
 
     this._doneCallbacks = [];
-    this._runInAnimationFrame = $$rAFMutex();
+    this._runInAnimationFrame = $$animateAsyncRun();
     this._state = 0;
   }
 
@@ -2628,15 +2720,93 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
     return element.data(RUNNER_STORAGE_KEY);
   }
 
-  this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner', '$$rAFScheduler',
-       function($$jqLite,   $rootScope,   $injector,   $$AnimateRunner,   $$rAFScheduler) {
+  this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner', '$$HashMap', '$$rAFScheduler',
+       function($$jqLite,   $rootScope,   $injector,   $$AnimateRunner,   $$HashMap,   $$rAFScheduler) {
 
     var animationQueue = [];
     var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
 
-    var totalPendingClassBasedAnimations = 0;
-    var totalActiveClassBasedAnimations = 0;
-    var classBasedAnimationsQueue = [];
+    function sortAnimations(animations) {
+      var tree = { children: [] };
+      var i, lookup = new $$HashMap();
+
+      // this is done first beforehand so that the hashmap
+      // is filled with a list of the elements that will be animated
+      for (i = 0; i < animations.length; i++) {
+        var animation = animations[i];
+        lookup.put(animation.domNode, animations[i] = {
+          domNode: animation.domNode,
+          fn: animation.fn,
+          children: []
+        });
+      }
+
+      for (i = 0; i < animations.length; i++) {
+        processNode(animations[i]);
+      }
+
+      return flatten(tree);
+
+      function processNode(entry) {
+        if (entry.processed) return entry;
+        entry.processed = true;
+
+        var elementNode = entry.domNode;
+        var parentNode = elementNode.parentNode;
+        lookup.put(elementNode, entry);
+
+        var parentEntry;
+        while (parentNode) {
+          parentEntry = lookup.get(parentNode);
+          if (parentEntry) {
+            if (!parentEntry.processed) {
+              parentEntry = processNode(parentEntry);
+            }
+            break;
+          }
+          parentNode = parentNode.parentNode;
+        }
+
+        (parentEntry || tree).children.push(entry);
+        return entry;
+      }
+
+      function flatten(tree) {
+        var result = [];
+        var queue = [];
+        var i;
+
+        for (i = 0; i < tree.children.length; i++) {
+          queue.push(tree.children[i]);
+        }
+
+        var remainingLevelEntries = queue.length;
+        var nextLevelEntries = 0;
+        var row = [];
+
+        for (i = 0; i < queue.length; i++) {
+          var entry = queue[i];
+          if (remainingLevelEntries <= 0) {
+            remainingLevelEntries = nextLevelEntries;
+            nextLevelEntries = 0;
+            result.push(row);
+            row = [];
+          }
+          row.push(entry.fn);
+          entry.children.forEach(function(childEntry) {
+            nextLevelEntries++;
+            queue.push(childEntry);
+          });
+          remainingLevelEntries--;
+        }
+
+        if (row.length) {
+          result.push(row);
+        }
+
+        return result;
+      }
+    }
 
     // TODO(matsko): document the signature in a better way
     return function(element, event, options) {
@@ -2666,19 +2836,12 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
         options.tempClasses = null;
       }
 
-      var classBasedIndex;
-      if (!isStructural) {
-        classBasedIndex = totalPendingClassBasedAnimations;
-        totalPendingClassBasedAnimations += 1;
-      }
-
       animationQueue.push({
         // this data is used by the postDigest code and passed into
         // the driver step function
         element: element,
         classes: classes,
         event: event,
-        classBasedIndex: classBasedIndex,
         structural: isStructural,
         options: options,
         beforeStart: beforeStart,
@@ -2693,10 +2856,6 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
       if (animationQueue.length > 1) return runner;
 
       $rootScope.$$postDigest(function() {
-        totalActiveClassBasedAnimations = totalPendingClassBasedAnimations;
-        totalPendingClassBasedAnimations = 0;
-        classBasedAnimationsQueue.length = 0;
-
         var animations = [];
         forEach(animationQueue, function(entry) {
           // the element was destroyed early on which removed the runner
@@ -2704,67 +2863,58 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
           // at all and it already has been closed due to destruction.
           if (getRunner(entry.element)) {
             animations.push(entry);
+          } else {
+            entry.close();
           }
         });
 
         // now any future animations will be in another postDigest
         animationQueue.length = 0;
 
-        forEach(groupAnimations(animations), function(animationEntry) {
-          if (animationEntry.structural) {
-            triggerAnimationStart();
-          } else {
-            classBasedAnimationsQueue.push({
-              node: getDomNode(animationEntry.element),
-              fn: triggerAnimationStart
-            });
-
-            if (animationEntry.classBasedIndex === totalActiveClassBasedAnimations - 1) {
-              // we need to sort each of the animations in order of parent to child
-              // relationships. This ensures that the child classes are applied at the
-              // right time.
-              classBasedAnimationsQueue = classBasedAnimationsQueue.sort(function(a,b) {
-                return b.node.contains(a.node);
-              }).map(function(entry) {
-                return entry.fn;
-              });
-
-              $$rAFScheduler(classBasedAnimationsQueue);
-            }
-          }
-
-          function triggerAnimationStart() {
-            // it's important that we apply the `ng-animate` CSS class and the
-            // temporary classes before we do any driver invoking since these
-            // CSS classes may be required for proper CSS detection.
-            animationEntry.beforeStart();
-
-            var startAnimationFn, closeFn = animationEntry.close;
-
-            // in the event that the element was removed before the digest runs or
-            // during the RAF sequencing then we should not trigger the animation.
-            var targetElement = animationEntry.anchors
-                ? (animationEntry.from.element || animationEntry.to.element)
-                : animationEntry.element;
-
-            if (getRunner(targetElement)) {
-              var operation = invokeFirstDriver(animationEntry);
-              if (operation) {
-                startAnimationFn = operation.start;
+        var groupedAnimations = groupAnimations(animations);
+        var toBeSortedAnimations = [];
+
+        forEach(groupedAnimations, function(animationEntry) {
+          toBeSortedAnimations.push({
+            domNode: getDomNode(animationEntry.from ? animationEntry.from.element : animationEntry.element),
+            fn: function triggerAnimationStart() {
+              // it's important that we apply the `ng-animate` CSS class and the
+              // temporary classes before we do any driver invoking since these
+              // CSS classes may be required for proper CSS detection.
+              animationEntry.beforeStart();
+
+              var startAnimationFn, closeFn = animationEntry.close;
+
+              // in the event that the element was removed before the digest runs or
+              // during the RAF sequencing then we should not trigger the animation.
+              var targetElement = animationEntry.anchors
+                  ? (animationEntry.from.element || animationEntry.to.element)
+                  : animationEntry.element;
+
+              if (getRunner(targetElement)) {
+                var operation = invokeFirstDriver(animationEntry);
+                if (operation) {
+                  startAnimationFn = operation.start;
+                }
               }
-            }
 
-            if (!startAnimationFn) {
-              closeFn();
-            } else {
-              var animationRunner = startAnimationFn();
-              animationRunner.done(function(status) {
-                closeFn(!status);
-              });
-              updateAnimationRunners(animationEntry, animationRunner);
+              if (!startAnimationFn) {
+                closeFn();
+              } else {
+                var animationRunner = startAnimationFn();
+                animationRunner.done(function(status) {
+                  closeFn(!status);
+                });
+                updateAnimationRunners(animationEntry, animationRunner);
+              }
             }
-          }
+          });
         });
+
+        // we need to sort each of the animations in order of parent to child
+        // relationships. This ensures that the child classes are applied at the
+        // right time.
+        $$rAFScheduler(sortAnimations(toBeSortedAnimations));
       });
 
       return runner;
@@ -2951,7 +3101,8 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
 
 /* global angularAnimateModule: true,
 
-   $$rAFMutexFactory,
+   $$BodyProvider,
+   $$AnimateAsyncRunFactory,
    $$rAFSchedulerFactory,
    $$AnimateChildrenDirective,
    $$AnimateRunnerFactory,
@@ -2969,7 +3120,7 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
  * @description
  *
  * The `ngAnimate` module provides support for CSS-based animations (keyframes and transitions) as well as JavaScript-based animations via
- * callback hooks. Animations are not enabled by default, however, by including `ngAnimate` then the animation hooks are enabled for an Angular app.
+ * callback hooks. Animations are not enabled by default, however, by including `ngAnimate` the animation hooks are enabled for an Angular app.
  *
  * <div doc-module-components="ngAnimate"></div>
  *
@@ -3002,7 +3153,7 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
  * CSS-based animations with ngAnimate are unique since they require no JavaScript code at all. By using a CSS class that we reference between our HTML
  * and CSS code we can create an animation that will be picked up by Angular when an the underlying directive performs an operation.
  *
- * The example below shows how an `enter` animation can be made possible on a element using `ng-if`:
+ * The example below shows how an `enter` animation can be made possible on an element using `ng-if`:
  *
  * ```html
  * <div ng-if="bool" class="fade">
@@ -3137,8 +3288,8 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
  *   /&#42; this will have a 100ms delay between each successive leave animation &#42;/
  *   transition-delay: 0.1s;
  *
- *   /&#42; in case the stagger doesn't work then the duration value
- *    must be set to 0 to avoid an accidental CSS inheritance &#42;/
+ *   /&#42; As of 1.4.4, this must always be set: it signals ngAnimate
+ *     to not accidentally inherit a delay property from another CSS class &#42;/
  *   transition-duration: 0s;
  * }
  * .my-animation.ng-enter.ng-enter-active {
@@ -3336,6 +3487,7 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
  *     enter: function(element, doneFn) {
  *       var runner = $animateCss(element, {
  *         event: 'enter',
+ *         structural: true,
  *         addClass: 'maroon-setting',
  *         from: { height:0 },
  *         to: { height: 200 }
@@ -3686,15 +3838,16 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
  * @description
  * The ngAnimate `$animate` service documentation is the same for the core `$animate` service.
  *
- * Click here {@link ng.$animate $animate to learn more about animations with `$animate`}.
+ * Click here {@link ng.$animate to learn more about animations with `$animate`}.
  */
 angular.module('ngAnimate', [])
-  .directive('ngAnimateChildren', $$AnimateChildrenDirective)
+  .provider('$$body', $$BodyProvider)
 
-  .factory('$$rAFMutex', $$rAFMutexFactory)
+  .directive('ngAnimateChildren', $$AnimateChildrenDirective)
   .factory('$$rAFScheduler', $$rAFSchedulerFactory)
 
   .factory('$$AnimateRunner', $$AnimateRunnerFactory)
+  .factory('$$animateAsyncRun', $$AnimateAsyncRunFactory)
 
   .provider('$$animateQueue', $$AnimateQueueProvider)
   .provider('$$animation', $$AnimationProvider)