diff --git a/modules/angular2/src/common/directives.ts b/modules/angular2/src/common/directives.ts
index c777bae2dd..ceb662d168 100644
--- a/modules/angular2/src/common/directives.ts
+++ b/modules/angular2/src/common/directives.ts
@@ -8,5 +8,6 @@ export {NgFor} from './directives/ng_for';
export {NgIf} from './directives/ng_if';
export {NgStyle} from './directives/ng_style';
export {NgSwitch, NgSwitchWhen, NgSwitchDefault} from './directives/ng_switch';
+export {NgPlural, NgPluralCase, NgLocalization} from './directives/ng_plural';
export * from './directives/observable_list_diff';
-export {CORE_DIRECTIVES} from './directives/core_directives';
\ No newline at end of file
+export {CORE_DIRECTIVES} from './directives/core_directives';
diff --git a/modules/angular2/src/common/directives/core_directives.ts b/modules/angular2/src/common/directives/core_directives.ts
index 61f9e77612..e9dbd2464c 100644
--- a/modules/angular2/src/common/directives/core_directives.ts
+++ b/modules/angular2/src/common/directives/core_directives.ts
@@ -4,6 +4,7 @@ import {NgFor} from './ng_for';
import {NgIf} from './ng_if';
import {NgStyle} from './ng_style';
import {NgSwitch, NgSwitchWhen, NgSwitchDefault} from './ng_switch';
+import {NgPlural, NgPluralCase} from './ng_plural';
/**
* A collection of Angular core directives that are likely to be used in each and every Angular
@@ -45,5 +46,14 @@ import {NgSwitch, NgSwitchWhen, NgSwitchDefault} from './ng_switch';
* }
* ```
*/
-export const CORE_DIRECTIVES: Type[] =
- CONST_EXPR([NgClass, NgFor, NgIf, NgStyle, NgSwitch, NgSwitchWhen, NgSwitchDefault]);
+export const CORE_DIRECTIVES: Type[] = CONST_EXPR([
+ NgClass,
+ NgFor,
+ NgIf,
+ NgStyle,
+ NgSwitch,
+ NgSwitchWhen,
+ NgSwitchDefault,
+ NgPlural,
+ NgPluralCase
+]);
diff --git a/modules/angular2/src/common/directives/ng_plural.ts b/modules/angular2/src/common/directives/ng_plural.ts
new file mode 100644
index 0000000000..243d0052b7
--- /dev/null
+++ b/modules/angular2/src/common/directives/ng_plural.ts
@@ -0,0 +1,146 @@
+import {
+ Directive,
+ ViewContainerRef,
+ TemplateRef,
+ ContentChildren,
+ QueryList,
+ Attribute,
+ AfterContentInit,
+ Input
+} from 'angular2/core';
+import {isPresent, NumberWrapper} from 'angular2/src/facade/lang';
+import {Map} from 'angular2/src/facade/collection';
+import {SwitchView} from './ng_switch';
+
+const _CATEGORY_DEFAULT = 'other';
+
+export abstract class NgLocalization { abstract getPluralCategory(value: any): string; }
+
+/**
+ * `ngPlural` is an i18n directive that displays DOM sub-trees that match the switch expression
+ * value, or failing that, DOM sub-trees that match the switch expression's pluralization category.
+ *
+ * To use this directive, you must provide an extension of `NgLocalization` that maps values to
+ * category names. You then define a container element that sets the `[ngPlural]` attribute to a
+ * switch expression.
+ * - Inner elements defined with an `[ngPluralCase]` attribute will display based on their
+ * expression.
+ * - If `[ngPluralCase]` is set to a value starting with `=`, it will only display if the value
+ * matches the switch expression exactly.
+ * - Otherwise, the view will be treated as a "category match", and will only display if exact
+ * value matches aren't found and the value maps to its category using the `getPluralCategory`
+ * function provided.
+ *
+ * If no matching views are found for a switch expression, inner elements marked
+ * `[ngPluralCase]="other"` will be displayed.
+ *
+ * ```typescript
+ * class MyLocalization extends NgLocalization {
+ * getPluralCategory(value: any) {
+ * if(value < 5) {
+ * return 'few';
+ * }
+ * }
+ * }
+ *
+ * @Component({
+ * selector: 'app',
+ * providers: [provide(NgLocalization, {useClass: MyLocalization})]
+ * })
+ * @View({
+ * template: `
+ *
Value = {{value}}
+ *
+ *
+ *
+ * there is nothing
+ * there is one
+ * there are a few
+ * there is some number
+ *