diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0c55b5165..4562060f7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,91 @@
+
+# v0.9.8 cozy-porcupine (2014-02-19)
+
+
+## Bug Fixes
+
+- **DateFilter:** fix a wrong type
+ ([cec3edad](https://github.com/angular/angular.dart/commit/cec3edad1944a8411882b0a87ea6193c25513392),
+ [#579](https://github.com/angular/angular.dart/issues/579))
+- **compiler:** support filters in attribute expressions
+ ([8f020f99](https://github.com/angular/angular.dart/commit/8f020f998e8a4b7d5b595e5c44086fa2628fe8b3),
+ [#571](https://github.com/angular/angular.dart/issues/571), [#580](https://github.com/angular/angular.dart/issues/580))
+- **di:** Upgrade dependency of package di preventing problems with dart sdk 1.1 resolves #408
+ ([1f85a8ce](https://github.com/angular/angular.dart/commit/1f85a8cee164d85d6eed43e7604a0190d1542d84),
+ [#408](https://github.com/angular/angular.dart/issues/408), [#583](https://github.com/angular/angular.dart/issues/583))
+- **doc-gen:** dartbug.com/16752
+ ([9a1ef31d](https://github.com/angular/angular.dart/commit/9a1ef31d66f151f22b79893e11251a6780605257))
+- **generator:** remove invalid sort on elements
+ ([e2a00abe](https://github.com/angular/angular.dart/commit/e2a00abe371bb2d9d3c1d3c19849e075a32e92e4),
+ [#554](https://github.com/angular/angular.dart/issues/554))
+- **ng-attr:** remove camel-cased dom attributes
+ ([b5e45117](https://github.com/angular/angular.dart/commit/b5e45117c17fdd07d5db659815eb49c2dca17b84),
+ [#567](https://github.com/angular/angular.dart/issues/567))
+- **ng-pluralize:** use ${..} to interpolate
+ ([a630487d](https://github.com/angular/angular.dart/commit/a630487d302e396a920e02c8db5d256a81d3dd1a),
+ [#572](https://github.com/angular/angular.dart/issues/572))
+- **ng-value:** Add ng-value support for checked/radio/option
+ ([8fc2c0f4](https://github.com/angular/angular.dart/commit/8fc2c0f49aabc53ee6240ad8063ecf6c9c8b8a1f))
+- **ngModel:**
+ - ensure checkboxes and radio buttons are flagged as dirty when changed
+ ([5766a6a1](https://github.com/angular/angular.dart/commit/5766a6a173dc1d65b9293fd5bd0bcbc21b0791ec),
+ [#569](https://github.com/angular/angular.dart/issues/569), [#585](https://github.com/angular/angular.dart/issues/585))
+ - process input type=number according to convention, using valueAsNumber
+ ([cf0160b8](https://github.com/angular/angular.dart/commit/cf0160b8c316a39ac9d0fcce843c6f764429a1d4),
+ [#574](https://github.com/angular/angular.dart/issues/574), [#577](https://github.com/angular/angular.dart/issues/577))
+ - ensure validation occurs when the model value changes upon digest
+ ([f34e0b31](https://github.com/angular/angular.dart/commit/f34e0b31a6f2f42457a6d1a1b5b5aaa7e2ef86fe))
+- **ngShow:** Add/remove ng-hide class instead of ng-show class
+ ([0b88d2e8](https://github.com/angular/angular.dart/commit/0b88d2e8102db8b89f38b00c277b9023b260285e),
+ [#521](https://github.com/angular/angular.dart/issues/521))
+- **package.json:** add repo, licenses and switch to devDependencies
+ ([d099db59](https://github.com/angular/angular.dart/commit/d099db5944e2287fbf97a13b1aa73f8082652e09),
+ [#544](https://github.com/angular/angular.dart/issues/544), [#545](https://github.com/angular/angular.dart/issues/545))
+- **scope:** Use Iterable instead of List
+ ([951fa178](https://github.com/angular/angular.dart/commit/951fa1783afa65f410a2b82249850eed458ed294),
+ [#565](https://github.com/angular/angular.dart/issues/565))
+
+
+## Features
+
+- **forms:**
+ - generate ng-submit-valid / ng-submit-invalid CSS classes upon form submission
+ ([4bf9447c](https://github.com/angular/angular.dart/commit/4bf9447cc64650d6c73b66c844fb5396b4a2ae27))
+ - provide support for reseting forms, fieldsets and models
+ ([c75202d5](https://github.com/angular/angular.dart/commit/c75202d5d7ecabd01366f2198e0c0c3b5c087e59))
+- **ngModel:** Treat the values of number and range inputs as numbers
+ ([e703bd1b](https://github.com/angular/angular.dart/commit/e703bd1bc75f4d6420afad0bbb975b3e23672ff8),
+ [#527](https://github.com/angular/angular.dart/issues/527))
+
+
+## Breaking Changes
+- **ng-attr**
+ - Due to ([b5e45117](https://github.com/angular/angular.dart/commit/b5e45117c17fdd07d5db659815eb49c2dca17b84),
+ mappings in annotations must use snake-case-names instead of
+ camelCaseNames. To migrate your code, follow the example below:
+
+ Before:
+
+ @NgComponent(
+ // …
+ map: const {
+ 'domAttributeName': '=>fieldSetter'
+ }
+ )
+ class MyComponent { …
+
+ After:
+
+ @NgComponent(
+ // …
+ map: const {
+ 'dom-attribute-name': '=>fieldSetter'
+ }
+ )
+ class MyComponent { …
+
+
+
# v0.9.7 pachyderm-moisturization (2014-02-10)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e8a90dde5..3d12f293a 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -90,11 +90,7 @@ Before you submit your pull request consider the following guidelines:
git commit -a
```
-* Build your changes locally to ensure all the tests pass
-
- ```shell
- ./run-test.sh
- ```
+* Build your changes locally to ensure all the tests pass: see the [developer documentation][dev-doc].
* Push your branch to Github:
@@ -226,3 +222,4 @@ changes to be accepted, the CLA must be signed. It's a quick process, we promise
[commit-message-format]: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#
[communityMilestone]: https://github.com/angular/angular.dart/issues?milestone=13&state=open
[coc]: https://github.com/angular/code-of-conduct/blob/master/CODE_OF_CONDUCT.md
+[dev-doc]: https://github.com/angular/angular.dart/blob/master/DEVELOPER.md
diff --git a/DEVELOPER.md b/DEVELOPER.md
new file mode 100644
index 000000000..ec2f93254
--- /dev/null
+++ b/DEVELOPER.md
@@ -0,0 +1,167 @@
+# Building and Testing AngularDart
+
+This document describes how to set up your development environment to build and test AngularDart, and
+explains the basic mechanics of using `git`, `node`, and `npm`.
+
+See the [contributing guidelines](https://github.com/angular/angular.dart/blob/master/CONTRIBUTING.md) for how to contribute your own code to
+
+1. [Prerequisite Software](#prerequisite-software)
+2. [Getting the Sources](#getting-the-sources)
+3. [Environment Variable Setup](#environment-variable-setup)
+4. [Installing NPM Modules and Dart Packages](#installing-npm-modules-and-dart-packages)
+5. [Running Tests Locally](#running-tests-locally)
+6. [Continuous Integration using Travis](#continuous-integration-using-travis)
+
+## Prerequisite Software
+
+Before you can build and test AngularDart, you must install and configure the
+following products on your development machine:
+
+* [Dart](https://www.dartlang.org/): as can be expected, AngularDart requires
+ an installation of the Dart-SDK and Dartium (a version of
+ [Chromium](http://www.chromium.org) with native support for Dart through the
+ Dart VM). One of the **simplest** ways to get both is to install the **Dart
+ Editor bundle**, which includes the editor, sdk and Dartium. See the [Dart
+ tools download page for
+ instructions](https://www.dartlang.org/tools/download.html).
+
+* [Git](http://git-scm.com/) and/or the **Github app** (for
+ [Mac](http://mac.github.com/) or [Windows](http://windows.github.com/)): the
+ [Github Guide to Installing
+ Git](https://help.github.com/articles/set-up-git) is a good source of
+ information.
+
+* [Node.js](http://nodejs.org): We use Node to run a development web server,
+ run tests, and generate distributable files. We also use Node's Package
+ Manager (`npm`). Depending on your system, you can install Node either from
+ source or as a pre-packaged bundle.
+
+## Getting the Sources
+
+Forking and Cloning the AngularDart repository:
+
+1. Login to your Github account or create one by following the instructions given [here](https://github.com/signup/free).
+Afterwards.
+2. [Fork](http://help.github.com/forking) the [main AngularDart repository](https://github.com/angular/angular.dart).
+3. Clone your fork of the AngularDart repository and define an `upstream` remote pointing back to the AngularDart repository that you forked in the first place:
+
+```shell
+# Clone your Github repository:
+git clone git@github.com:/angular.dart.git
+
+# Go to the AngularDart directory:
+cd angular.dart
+
+# Add the main AngularDart repository as an upstream remote to your repository:
+git remote add upstream https://github.com/angular/angular.dart.git
+```
+
+## Environment Variable Setup
+
+
+Define the environment variables listed below. These are mainly needed for the
+test scripts. The notation shown here is for
+[`bash`](http://www.gnu.org/software/bash/); adapt as appropriate for your
+favorite shell. (Examples given below of possible values for initializing the
+environment variables assume Mac OS X and that you have installed the Dart
+Editor in the directory named by `$DART_EDITOR_DIR`. This is only for
+illustrative purposes.)
+
+```shell
+# CHROME_BIN: path to a Chrome browser executable; e.g.,
+export CHROME_BIN="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
+
+# CHROME_CANARY_BIN: path to a Dartium browser executable; e.g.,
+export CHROME_CANARY_BIN="$DART_EDITOR_DIR/chromium/Chromium.app/Contents/MacOS/Chromium"
+```
+**Note**: the `$CHROME_CANARY_BIN` environment variable is used by karma to run your tests
+in dartium instead of chromium. If you don't do this, the dart2js compile will make the tests
+run extremely slow since it has to wait for a full js compile each time.
+
+You should also add the Dart SDK `bin` directory to your path and/or define `DART_SDK`; e.g.
+
+```shell
+# DART_SDK: path to a Dart SDK directory; e.g.,
+export DART_SDK="$DART_EDITOR_DIR/dart-sdk"
+
+# Update PATH to include the Dart SDK bin directory
+PATH+=":$DART_SDK/bin"
+```
+## Installing NPM Modules and Dart Packages
+
+Next, install the modules and packages needed to run AngularDart tests:
+
+```shell
+# Install node.js dependencies:
+npm install
+
+# Install karma onto your command line (optional)
+npm install karma -g
+
+# Install Dart packages
+pub install
+```
+
+## Running Tests Locally
+
+NOTE: scripts are being written to embody the following steps.
+
+To run base tests:
+
+```shell
+# Source a script to define yet more environment variables
+. ./scripts/env.sh
+
+# Run io tests:
+dart --checked test/io/all.dart
+
+# Run expression extractor tests:
+scripts/test-expression-extractor.sh
+
+Run the Dart Analyzer:
+./scripts/analyze.sh
+```
+
+To run Karma tests over Dartium, execute the following shell commands (which
+will launch the Karma server):
+
+```shell
+. ./scripts/env.sh
+node "node_modules/karma/bin/karma" start karma.conf \
+ --reporters=junit,dots --port=8765 --runner-port=8766 \
+ --browsers=Dartium
+```
+
+In another shell window or tab, or from your favorite IDE, launch the Karma
+tests proper by executing:
+
+```shell
+. ./scripts/env.sh
+karma_run.sh
+```
+
+**Note:**: If the dart analyzer fails with warnings, the tests will not run.
+You can manually run the tests if this happens:
+
+```shell
+karma run --port=8765
+```
+
+## Debugging
+
+In the dart editor you can configure a dartium launch target for the karma test runner debug page.
+The menu option is under Run > Manage Launches > Create new Dartium Launch.
+
+```
+http://localhost:8765/debug.html
+```
+
+If you want to only run a single test you can alter the test you wish to run by changing `it` to `iit`
+or `describe` to `ddescribe`. This will only run that individual test and make it much easier to debug.
+
+
+## Continuous Integration using Travis
+
+See the instructions given [here](https://github.com/angular/angular.dart/blob/master/travis.md).
+
+-----
diff --git a/demo/animate_demo/animate_demo.dart b/demo/animate_demo/animate_demo.dart
new file mode 100644
index 000000000..7d68b78da
--- /dev/null
+++ b/demo/animate_demo/animate_demo.dart
@@ -0,0 +1,85 @@
+import 'dart:html' as dom;
+
+import 'package:angular/angular.dart';
+import 'package:angular/animate/module.dart';
+
+// This annotation allows Dart to shake away any classes
+// not used from Dart code nor listed in another @MirrorsUsed.
+//
+// If you create classes that are referenced from the Angular
+// expressions, you must include a library target in @MirrorsUsed.
+@MirrorsUsed(override: '*')
+import 'dart:mirrors';
+
+@NgController(
+ selector: '[animation-demo]',
+ publishAs: 'adc'
+)
+class AnimationDemoController {
+ final dom.Element rootElement;
+ final NgAnimate animate;
+ bool areThingsVisible = false;
+ bool boxToggle = false;
+ bool ifToggle = false;
+ int thingNumber = 1;
+ String currentThing;
+
+ dom.Element _boxElement;
+ dom.Element _hostElement;
+ List _animatedBoxes = [];
+ List listOfThings = [];
+
+ AnimationDemoController(this.animate, this.rootElement) {
+ _boxElement = rootElement.querySelector(".animated-box");
+ _hostElement = rootElement.querySelector(".animated-host");
+ }
+
+ animateABox() {
+ if(_boxElement != null) {
+ if(boxToggle) {
+ animate.removeClass([_boxElement], "magic");
+ } else {
+ animate.addClass([_boxElement], "magic");
+ }
+ boxToggle = !boxToggle;
+ }
+ }
+
+ toggleABunchOfThings() {
+ if(_hostElement != null) {
+ if(!areThingsVisible && _animatedBoxes.length == 0) {
+
+ for(int i = 0; i < 1000; i++) {
+ var element = new dom.Element.div();
+ element.classes.add("magic-box");
+ _animatedBoxes.add(element);
+ }
+ animate.insert(_animatedBoxes, _hostElement);
+ } else if (!areThingsVisible) {
+ // I'm not sure what to do about this
+ animate.insert(_animatedBoxes, _hostElement);
+ } else if (_animatedBoxes.length > 0) {
+ animate.remove(_animatedBoxes);
+ }
+
+ areThingsVisible = !areThingsVisible;
+ }
+ }
+
+ addThing() {
+ listOfThings.add("Thing-$thingNumber");
+ thingNumber++;
+ }
+
+ removeThing() {
+ if(listOfThings.length > 0) {
+ listOfThings.removeLast();
+ }
+ }
+}
+
+main() {
+ ngBootstrap(module: new Module()
+ ..install(new NgAnimateModule())
+ ..type(AnimationDemoController));
+}
diff --git a/demo/animate_demo/index.html b/demo/animate_demo/index.html
new file mode 100644
index 000000000..0c7d6c3e2
--- /dev/null
+++ b/demo/animate_demo/index.html
@@ -0,0 +1,53 @@
+
+
+
+ Hello, World!
+
+
+
+
+
ng-repeat Demo
+
+
+
+
+
+
+ {{thing2}}
+
+
+
+
+
+
+
ng-switch Demo
+
+
+
+
+
+
I'm THING A
+
I'm THING B
+
I'm THING C
+
Uhhh I'm NoThing
+
+
+
+
ng-if Demo
+
+
+ I am a div with content. Just your standared ng-if.
+