Integrate r11187, r11189, r11191, r11192, r11195, r11200, r11201, r11203, r11204 and r11205  into releases/2.5

Review by: rdayal@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/2.5@11276 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/permutations.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/permutations.js
index 0d454a0..b35644f 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/permutations.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/permutations.js
@@ -52,7 +52,7 @@
     // __PERMUTATIONS_END__
     var idx = strongName.indexOf(':');
     if (idx != -1) {
-      softPermutationId = +(strongName.substring(idx + 1));
+      softPermutationId = parseInt(strongName.substring(idx + 1), 10);
       strongName = strongName.substring(0, idx);
     }
   } catch (e) {
diff --git a/user/src/com/google/gwt/aria/client/AlertRole.java b/user/src/com/google/gwt/aria/client/AlertRole.java
index 8dd9212..574a8fe 100644
--- a/user/src/com/google/gwt/aria/client/AlertRole.java
+++ b/user/src/com/google/gwt/aria/client/AlertRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * AlertRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#alert">alert</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface AlertRole extends RegionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/AlertRoleImpl.java b/user/src/com/google/gwt/aria/client/AlertRoleImpl.java
index 7a9f37d..b9b00cb 100644
--- a/user/src/com/google/gwt/aria/client/AlertRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/AlertRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link AlertRole}.</p>
  */
-class AlertRoleImpl extends Role implements AlertRole {
+class AlertRoleImpl extends RoleImpl implements AlertRole {
   AlertRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/AlertdialogRole.java b/user/src/com/google/gwt/aria/client/AlertdialogRole.java
index b23c696..88c31d9 100644
--- a/user/src/com/google/gwt/aria/client/AlertdialogRole.java
+++ b/user/src/com/google/gwt/aria/client/AlertdialogRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * AlertdialogRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#alertdialog">alertdialog</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface AlertdialogRole extends AlertRole, DialogRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/AlertdialogRoleImpl.java b/user/src/com/google/gwt/aria/client/AlertdialogRoleImpl.java
index 6371c47..fdec37a 100644
--- a/user/src/com/google/gwt/aria/client/AlertdialogRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/AlertdialogRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link AlertdialogRole}.</p>
  */
-class AlertdialogRoleImpl extends Role implements AlertdialogRole {
+class AlertdialogRoleImpl extends RoleImpl implements AlertdialogRole {
   AlertdialogRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ApplicationRole.java b/user/src/com/google/gwt/aria/client/ApplicationRole.java
index 971607e..541319b 100644
--- a/user/src/com/google/gwt/aria/client/ApplicationRole.java
+++ b/user/src/com/google/gwt/aria/client/ApplicationRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * ApplicationRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#application">application</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ApplicationRole extends LandmarkRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/ApplicationRoleImpl.java b/user/src/com/google/gwt/aria/client/ApplicationRoleImpl.java
index b0cd391..23b4e68 100644
--- a/user/src/com/google/gwt/aria/client/ApplicationRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ApplicationRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ApplicationRole}.</p>
  */
-class ApplicationRoleImpl extends Role implements ApplicationRole {
+class ApplicationRoleImpl extends RoleImpl implements ApplicationRole {
   ApplicationRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ArticleRole.java b/user/src/com/google/gwt/aria/client/ArticleRole.java
index 6e4803c..79fc2fc 100644
--- a/user/src/com/google/gwt/aria/client/ArticleRole.java
+++ b/user/src/com/google/gwt/aria/client/ArticleRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * ArticleRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#article">article</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ArticleRole extends DocumentRole, RegionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/ArticleRoleImpl.java b/user/src/com/google/gwt/aria/client/ArticleRoleImpl.java
index d644ea2..ec4c6ab 100644
--- a/user/src/com/google/gwt/aria/client/ArticleRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ArticleRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ArticleRole}.</p>
  */
-class ArticleRoleImpl extends Role implements ArticleRole {
+class ArticleRoleImpl extends RoleImpl implements ArticleRole {
   ArticleRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/BannerRole.java b/user/src/com/google/gwt/aria/client/BannerRole.java
index 8fec2c2..6b610a8 100644
--- a/user/src/com/google/gwt/aria/client/BannerRole.java
+++ b/user/src/com/google/gwt/aria/client/BannerRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * BannerRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#banner">banner</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface BannerRole extends LandmarkRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/BannerRoleImpl.java b/user/src/com/google/gwt/aria/client/BannerRoleImpl.java
index 8a1da72..b6dfbe0 100644
--- a/user/src/com/google/gwt/aria/client/BannerRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/BannerRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link BannerRole}.</p>
  */
-class BannerRoleImpl extends Role implements BannerRole {
+class BannerRoleImpl extends RoleImpl implements BannerRole {
   BannerRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ButtonRole.java b/user/src/com/google/gwt/aria/client/ButtonRole.java
index 3c12a2f..c638ab9 100644
--- a/user/src/com/google/gwt/aria/client/ButtonRole.java
+++ b/user/src/com/google/gwt/aria/client/ButtonRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * ButtonRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#button">button</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ButtonRole extends CommandRole {
   String getAriaExpandedState(Element element);
diff --git a/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java b/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java
index a3b4eef..5901f87 100644
--- a/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ButtonRole}.</p>
  */
-class ButtonRoleImpl extends Role implements ButtonRole {
+class ButtonRoleImpl extends RoleImpl implements ButtonRole {
   ButtonRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/CheckboxRole.java b/user/src/com/google/gwt/aria/client/CheckboxRole.java
index f78ec21..43b62bd 100644
--- a/user/src/com/google/gwt/aria/client/CheckboxRole.java
+++ b/user/src/com/google/gwt/aria/client/CheckboxRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * CheckboxRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#checkbox">checkbox</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface CheckboxRole extends InputRole {
   String getAriaCheckedState(Element element);
diff --git a/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java b/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java
index 43e1214..c06cfde 100644
--- a/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link CheckboxRole}.</p>
  */
-class CheckboxRoleImpl extends Role implements CheckboxRole {
+class CheckboxRoleImpl extends RoleImpl implements CheckboxRole {
   CheckboxRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ColumnheaderRole.java b/user/src/com/google/gwt/aria/client/ColumnheaderRole.java
index 416fcb3..b0ffab0 100644
--- a/user/src/com/google/gwt/aria/client/ColumnheaderRole.java
+++ b/user/src/com/google/gwt/aria/client/ColumnheaderRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * ColumnheaderRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#columnheader">columnheader</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ColumnheaderRole extends GridcellRole, SectionheadRole, WidgetRole {
   String getAriaSortProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java b/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java
index 4232cdf..abc855f 100644
--- a/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ColumnheaderRole}.</p>
  */
-class ColumnheaderRoleImpl extends Role implements ColumnheaderRole {
+class ColumnheaderRoleImpl extends RoleImpl implements ColumnheaderRole {
   ColumnheaderRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ComboboxRole.java b/user/src/com/google/gwt/aria/client/ComboboxRole.java
index 803853b..1dae8bb 100644
--- a/user/src/com/google/gwt/aria/client/ComboboxRole.java
+++ b/user/src/com/google/gwt/aria/client/ComboboxRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * ComboboxRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#combobox">combobox</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ComboboxRole extends SelectRole {
   String getAriaAutocompleteProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/ComboboxRoleImpl.java b/user/src/com/google/gwt/aria/client/ComboboxRoleImpl.java
index 10ab5ae..8e068de 100644
--- a/user/src/com/google/gwt/aria/client/ComboboxRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ComboboxRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ComboboxRole}.</p>
  */
-class ComboboxRoleImpl extends Role implements ComboboxRole {
+class ComboboxRoleImpl extends RoleImpl implements ComboboxRole {
   ComboboxRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/CommandRole.java b/user/src/com/google/gwt/aria/client/CommandRole.java
index 1ca991e..0b19a4f 100644
--- a/user/src/com/google/gwt/aria/client/CommandRole.java
+++ b/user/src/com/google/gwt/aria/client/CommandRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * CommandRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#command">command</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface CommandRole extends WidgetRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/ComplementaryRole.java b/user/src/com/google/gwt/aria/client/ComplementaryRole.java
index c8c7a50..cbde080 100644
--- a/user/src/com/google/gwt/aria/client/ComplementaryRole.java
+++ b/user/src/com/google/gwt/aria/client/ComplementaryRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * ComplementaryRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#complementary">complementary</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ComplementaryRole extends LandmarkRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/ComplementaryRoleImpl.java b/user/src/com/google/gwt/aria/client/ComplementaryRoleImpl.java
index 4530496..45eedd2 100644
--- a/user/src/com/google/gwt/aria/client/ComplementaryRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ComplementaryRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ComplementaryRole}.</p>
  */
-class ComplementaryRoleImpl extends Role implements ComplementaryRole {
+class ComplementaryRoleImpl extends RoleImpl implements ComplementaryRole {
   ComplementaryRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/CompositeRole.java b/user/src/com/google/gwt/aria/client/CompositeRole.java
index 0002061..3b853ab 100644
--- a/user/src/com/google/gwt/aria/client/CompositeRole.java
+++ b/user/src/com/google/gwt/aria/client/CompositeRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * CompositeRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#composite">composite</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface CompositeRole extends WidgetRole {
   String getAriaActivedescendantProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/ContentinfoRole.java b/user/src/com/google/gwt/aria/client/ContentinfoRole.java
index 0138eb9..bef7d5d 100644
--- a/user/src/com/google/gwt/aria/client/ContentinfoRole.java
+++ b/user/src/com/google/gwt/aria/client/ContentinfoRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * ContentinfoRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#contentinfo">contentinfo</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ContentinfoRole extends LandmarkRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/ContentinfoRoleImpl.java b/user/src/com/google/gwt/aria/client/ContentinfoRoleImpl.java
index 3a21a78..a5db746 100644
--- a/user/src/com/google/gwt/aria/client/ContentinfoRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ContentinfoRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ContentinfoRole}.</p>
  */
-class ContentinfoRoleImpl extends Role implements ContentinfoRole {
+class ContentinfoRoleImpl extends RoleImpl implements ContentinfoRole {
   ContentinfoRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/DefinitionRole.java b/user/src/com/google/gwt/aria/client/DefinitionRole.java
index 71d27bc..3d5e291 100644
--- a/user/src/com/google/gwt/aria/client/DefinitionRole.java
+++ b/user/src/com/google/gwt/aria/client/DefinitionRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * DefinitionRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#definition">definition</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface DefinitionRole extends SectionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/DefinitionRoleImpl.java b/user/src/com/google/gwt/aria/client/DefinitionRoleImpl.java
index 9fcfbb2..e919610 100644
--- a/user/src/com/google/gwt/aria/client/DefinitionRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/DefinitionRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link DefinitionRole}.</p>
  */
-class DefinitionRoleImpl extends Role implements DefinitionRole {
+class DefinitionRoleImpl extends RoleImpl implements DefinitionRole {
   DefinitionRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/DialogRole.java b/user/src/com/google/gwt/aria/client/DialogRole.java
index 3381827..6d474b6 100644
--- a/user/src/com/google/gwt/aria/client/DialogRole.java
+++ b/user/src/com/google/gwt/aria/client/DialogRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * DialogRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#dialog">dialog</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface DialogRole extends WindowRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/DialogRoleImpl.java b/user/src/com/google/gwt/aria/client/DialogRoleImpl.java
index 1f7a61c..7b33c00 100644
--- a/user/src/com/google/gwt/aria/client/DialogRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/DialogRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link DialogRole}.</p>
  */
-class DialogRoleImpl extends Role implements DialogRole {
+class DialogRoleImpl extends RoleImpl implements DialogRole {
   DialogRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/DirectoryRole.java b/user/src/com/google/gwt/aria/client/DirectoryRole.java
index 1a502cd..3bccc30 100644
--- a/user/src/com/google/gwt/aria/client/DirectoryRole.java
+++ b/user/src/com/google/gwt/aria/client/DirectoryRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * DirectoryRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#directory">directory</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface DirectoryRole extends ListRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/DirectoryRoleImpl.java b/user/src/com/google/gwt/aria/client/DirectoryRoleImpl.java
index d584fbc..b4ce77b 100644
--- a/user/src/com/google/gwt/aria/client/DirectoryRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/DirectoryRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link DirectoryRole}.</p>
  */
-class DirectoryRoleImpl extends Role implements DirectoryRole {
+class DirectoryRoleImpl extends RoleImpl implements DirectoryRole {
   DirectoryRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/DocumentRole.java b/user/src/com/google/gwt/aria/client/DocumentRole.java
index 9a37083..3ce1f9c 100644
--- a/user/src/com/google/gwt/aria/client/DocumentRole.java
+++ b/user/src/com/google/gwt/aria/client/DocumentRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * DocumentRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#document">document</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface DocumentRole extends StructureRole {
   String getAriaExpandedState(Element element);
diff --git a/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java b/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java
index 2b22b8c..a77c13a 100644
--- a/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link DocumentRole}.</p>
  */
-class DocumentRoleImpl extends Role implements DocumentRole {
+class DocumentRoleImpl extends RoleImpl implements DocumentRole {
   DocumentRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/FormRole.java b/user/src/com/google/gwt/aria/client/FormRole.java
index ef3c986..c1998b2 100644
--- a/user/src/com/google/gwt/aria/client/FormRole.java
+++ b/user/src/com/google/gwt/aria/client/FormRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * FormRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#form">form</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface FormRole extends LandmarkRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/FormRoleImpl.java b/user/src/com/google/gwt/aria/client/FormRoleImpl.java
index f3b4d0a..04814a6 100644
--- a/user/src/com/google/gwt/aria/client/FormRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/FormRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link FormRole}.</p>
  */
-class FormRoleImpl extends Role implements FormRole {
+class FormRoleImpl extends RoleImpl implements FormRole {
   FormRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/GridRole.java b/user/src/com/google/gwt/aria/client/GridRole.java
index ef261e4..18c8661 100644
--- a/user/src/com/google/gwt/aria/client/GridRole.java
+++ b/user/src/com/google/gwt/aria/client/GridRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * GridRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#grid">grid</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface GridRole extends CompositeRole, RegionRole {
   String getAriaLevelProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/GridRoleImpl.java b/user/src/com/google/gwt/aria/client/GridRoleImpl.java
index 58ac5df..64e30ab 100644
--- a/user/src/com/google/gwt/aria/client/GridRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/GridRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link GridRole}.</p>
  */
-class GridRoleImpl extends Role implements GridRole {
+class GridRoleImpl extends RoleImpl implements GridRole {
   GridRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/GridcellRole.java b/user/src/com/google/gwt/aria/client/GridcellRole.java
index d4bd65d..b98e8ce 100644
--- a/user/src/com/google/gwt/aria/client/GridcellRole.java
+++ b/user/src/com/google/gwt/aria/client/GridcellRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * GridcellRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#gridcell">gridcell</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface GridcellRole extends SectionRole, WidgetRole {
   String getAriaReadonlyProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java b/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java
index b69db4f..b058502 100644
--- a/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link GridcellRole}.</p>
  */
-class GridcellRoleImpl extends Role implements GridcellRole {
+class GridcellRoleImpl extends RoleImpl implements GridcellRole {
   GridcellRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/GroupRole.java b/user/src/com/google/gwt/aria/client/GroupRole.java
index a10846b..9507677 100644
--- a/user/src/com/google/gwt/aria/client/GroupRole.java
+++ b/user/src/com/google/gwt/aria/client/GroupRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * GroupRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#group">group</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface GroupRole extends SectionRole {
   String getAriaActivedescendantProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/GroupRoleImpl.java b/user/src/com/google/gwt/aria/client/GroupRoleImpl.java
index b55072d..47864f2 100644
--- a/user/src/com/google/gwt/aria/client/GroupRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/GroupRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link GroupRole}.</p>
  */
-class GroupRoleImpl extends Role implements GroupRole {
+class GroupRoleImpl extends RoleImpl implements GroupRole {
   GroupRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/HeadingRole.java b/user/src/com/google/gwt/aria/client/HeadingRole.java
index 57de223..ecae557 100644
--- a/user/src/com/google/gwt/aria/client/HeadingRole.java
+++ b/user/src/com/google/gwt/aria/client/HeadingRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * HeadingRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#heading">heading</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface HeadingRole extends SectionheadRole {
   String getAriaLevelProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/HeadingRoleImpl.java b/user/src/com/google/gwt/aria/client/HeadingRoleImpl.java
index d43a908..fd89243 100644
--- a/user/src/com/google/gwt/aria/client/HeadingRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/HeadingRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link HeadingRole}.</p>
  */
-class HeadingRoleImpl extends Role implements HeadingRole {
+class HeadingRoleImpl extends RoleImpl implements HeadingRole {
   HeadingRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ImgRole.java b/user/src/com/google/gwt/aria/client/ImgRole.java
index 7af8190..0c5eb86 100644
--- a/user/src/com/google/gwt/aria/client/ImgRole.java
+++ b/user/src/com/google/gwt/aria/client/ImgRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * ImgRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#img">img</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ImgRole extends SectionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/ImgRoleImpl.java b/user/src/com/google/gwt/aria/client/ImgRoleImpl.java
index 88402c0..b1a2ae7 100644
--- a/user/src/com/google/gwt/aria/client/ImgRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ImgRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ImgRole}.</p>
  */
-class ImgRoleImpl extends Role implements ImgRole {
+class ImgRoleImpl extends RoleImpl implements ImgRole {
   ImgRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/InputRole.java b/user/src/com/google/gwt/aria/client/InputRole.java
index e33cb92..18941a4 100644
--- a/user/src/com/google/gwt/aria/client/InputRole.java
+++ b/user/src/com/google/gwt/aria/client/InputRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * InputRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#input">input</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface InputRole extends WidgetRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/LandmarkRole.java b/user/src/com/google/gwt/aria/client/LandmarkRole.java
index e0ce6c5..70c1f9c 100644
--- a/user/src/com/google/gwt/aria/client/LandmarkRole.java
+++ b/user/src/com/google/gwt/aria/client/LandmarkRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * LandmarkRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#landmark">landmark</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface LandmarkRole extends RegionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/LinkRole.java b/user/src/com/google/gwt/aria/client/LinkRole.java
index 60b1745..e5243e3 100644
--- a/user/src/com/google/gwt/aria/client/LinkRole.java
+++ b/user/src/com/google/gwt/aria/client/LinkRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * LinkRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#link">link</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface LinkRole extends CommandRole {
   String getAriaExpandedState(Element element);
diff --git a/user/src/com/google/gwt/aria/client/LinkRoleImpl.java b/user/src/com/google/gwt/aria/client/LinkRoleImpl.java
index 92619fc..92f161d 100644
--- a/user/src/com/google/gwt/aria/client/LinkRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/LinkRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link LinkRole}.</p>
  */
-class LinkRoleImpl extends Role implements LinkRole {
+class LinkRoleImpl extends RoleImpl implements LinkRole {
   LinkRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ListRole.java b/user/src/com/google/gwt/aria/client/ListRole.java
index 0a2d3e4..ac37031 100644
--- a/user/src/com/google/gwt/aria/client/ListRole.java
+++ b/user/src/com/google/gwt/aria/client/ListRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * ListRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#list">list</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ListRole extends RegionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/ListRoleImpl.java b/user/src/com/google/gwt/aria/client/ListRoleImpl.java
index dec18c4..05d420d 100644
--- a/user/src/com/google/gwt/aria/client/ListRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ListRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ListRole}.</p>
  */
-class ListRoleImpl extends Role implements ListRole {
+class ListRoleImpl extends RoleImpl implements ListRole {
   ListRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ListboxRole.java b/user/src/com/google/gwt/aria/client/ListboxRole.java
index 3d2b641..1bb4932 100644
--- a/user/src/com/google/gwt/aria/client/ListboxRole.java
+++ b/user/src/com/google/gwt/aria/client/ListboxRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * ListboxRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#listbox">listbox</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ListboxRole extends ListRole, SelectRole {
   String getAriaMultiselectableProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/ListboxRoleImpl.java b/user/src/com/google/gwt/aria/client/ListboxRoleImpl.java
index 740f8a4..9856ad0 100644
--- a/user/src/com/google/gwt/aria/client/ListboxRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ListboxRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ListboxRole}.</p>
  */
-class ListboxRoleImpl extends Role implements ListboxRole {
+class ListboxRoleImpl extends RoleImpl implements ListboxRole {
   ListboxRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ListitemRole.java b/user/src/com/google/gwt/aria/client/ListitemRole.java
index 803bb64..5a6a2e6 100644
--- a/user/src/com/google/gwt/aria/client/ListitemRole.java
+++ b/user/src/com/google/gwt/aria/client/ListitemRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * ListitemRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#listitem">listitem</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ListitemRole extends SectionRole {
   String getAriaLevelProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/ListitemRoleImpl.java b/user/src/com/google/gwt/aria/client/ListitemRoleImpl.java
index 426e5bb..07be0c4 100644
--- a/user/src/com/google/gwt/aria/client/ListitemRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ListitemRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ListitemRole}.</p>
  */
-class ListitemRoleImpl extends Role implements ListitemRole {
+class ListitemRoleImpl extends RoleImpl implements ListitemRole {
   ListitemRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/LogRole.java b/user/src/com/google/gwt/aria/client/LogRole.java
index 24e2f38..4c8c19f 100644
--- a/user/src/com/google/gwt/aria/client/LogRole.java
+++ b/user/src/com/google/gwt/aria/client/LogRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * LogRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#log">log</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface LogRole extends RegionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/LogRoleImpl.java b/user/src/com/google/gwt/aria/client/LogRoleImpl.java
index b9c4344..1901e5e 100644
--- a/user/src/com/google/gwt/aria/client/LogRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/LogRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link LogRole}.</p>
  */
-class LogRoleImpl extends Role implements LogRole {
+class LogRoleImpl extends RoleImpl implements LogRole {
   LogRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/MainRole.java b/user/src/com/google/gwt/aria/client/MainRole.java
index 5b99380..a54e514 100644
--- a/user/src/com/google/gwt/aria/client/MainRole.java
+++ b/user/src/com/google/gwt/aria/client/MainRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * MainRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#main">main</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface MainRole extends LandmarkRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/MainRoleImpl.java b/user/src/com/google/gwt/aria/client/MainRoleImpl.java
index a319bec..e8e5641 100644
--- a/user/src/com/google/gwt/aria/client/MainRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MainRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link MainRole}.</p>
  */
-class MainRoleImpl extends Role implements MainRole {
+class MainRoleImpl extends RoleImpl implements MainRole {
   MainRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/MarqueeRole.java b/user/src/com/google/gwt/aria/client/MarqueeRole.java
index cba5e1a..f2bdb6e 100644
--- a/user/src/com/google/gwt/aria/client/MarqueeRole.java
+++ b/user/src/com/google/gwt/aria/client/MarqueeRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * MarqueeRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#marquee">marquee</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface MarqueeRole extends SectionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/MarqueeRoleImpl.java b/user/src/com/google/gwt/aria/client/MarqueeRoleImpl.java
index 0e449c3..a920949 100644
--- a/user/src/com/google/gwt/aria/client/MarqueeRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MarqueeRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link MarqueeRole}.</p>
  */
-class MarqueeRoleImpl extends Role implements MarqueeRole {
+class MarqueeRoleImpl extends RoleImpl implements MarqueeRole {
   MarqueeRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/MathRole.java b/user/src/com/google/gwt/aria/client/MathRole.java
index 57a76a3..14216e7 100644
--- a/user/src/com/google/gwt/aria/client/MathRole.java
+++ b/user/src/com/google/gwt/aria/client/MathRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * MathRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#math">math</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface MathRole extends SectionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/MathRoleImpl.java b/user/src/com/google/gwt/aria/client/MathRoleImpl.java
index 1fd4f72..20e50d7 100644
--- a/user/src/com/google/gwt/aria/client/MathRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MathRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link MathRole}.</p>
  */
-class MathRoleImpl extends Role implements MathRole {
+class MathRoleImpl extends RoleImpl implements MathRole {
   MathRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/MenuRole.java b/user/src/com/google/gwt/aria/client/MenuRole.java
index 5f5872b..6e81a78 100644
--- a/user/src/com/google/gwt/aria/client/MenuRole.java
+++ b/user/src/com/google/gwt/aria/client/MenuRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * MenuRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#menu">menu</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface MenuRole extends ListRole, SelectRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/MenuRoleImpl.java b/user/src/com/google/gwt/aria/client/MenuRoleImpl.java
index 6cadf1f..033ffc2 100644
--- a/user/src/com/google/gwt/aria/client/MenuRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MenuRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link MenuRole}.</p>
  */
-class MenuRoleImpl extends Role implements MenuRole {
+class MenuRoleImpl extends RoleImpl implements MenuRole {
   MenuRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/MenubarRole.java b/user/src/com/google/gwt/aria/client/MenubarRole.java
index b5ca651..6236d34 100644
--- a/user/src/com/google/gwt/aria/client/MenubarRole.java
+++ b/user/src/com/google/gwt/aria/client/MenubarRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * MenubarRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#menubar">menubar</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface MenubarRole extends MenuRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/MenubarRoleImpl.java b/user/src/com/google/gwt/aria/client/MenubarRoleImpl.java
index 6b91189..cc85d67 100644
--- a/user/src/com/google/gwt/aria/client/MenubarRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MenubarRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link MenubarRole}.</p>
  */
-class MenubarRoleImpl extends Role implements MenubarRole {
+class MenubarRoleImpl extends RoleImpl implements MenubarRole {
   MenubarRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/MenuitemRole.java b/user/src/com/google/gwt/aria/client/MenuitemRole.java
index 1f1ca0d..a8a2ad8 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemRole.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * MenuitemRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#menuitem">menuitem</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface MenuitemRole extends CommandRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/MenuitemRoleImpl.java b/user/src/com/google/gwt/aria/client/MenuitemRoleImpl.java
index bc68a2b..fc80d10 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link MenuitemRole}.</p>
  */
-class MenuitemRoleImpl extends Role implements MenuitemRole {
+class MenuitemRoleImpl extends RoleImpl implements MenuitemRole {
   MenuitemRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/MenuitemcheckboxRole.java b/user/src/com/google/gwt/aria/client/MenuitemcheckboxRole.java
index 74a22d0..53e09cf 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemcheckboxRole.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemcheckboxRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * MenuitemcheckboxRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#menuitemcheckbox">menuitemcheckbox</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface MenuitemcheckboxRole extends CheckboxRole, MenuitemRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/MenuitemcheckboxRoleImpl.java b/user/src/com/google/gwt/aria/client/MenuitemcheckboxRoleImpl.java
index 4e3d4fb..7e21b6c 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemcheckboxRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemcheckboxRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link MenuitemcheckboxRole}.</p>
  */
-class MenuitemcheckboxRoleImpl extends Role implements MenuitemcheckboxRole {
+class MenuitemcheckboxRoleImpl extends RoleImpl implements MenuitemcheckboxRole {
   MenuitemcheckboxRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/MenuitemradioRole.java b/user/src/com/google/gwt/aria/client/MenuitemradioRole.java
index 89cfe80..f905190 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemradioRole.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemradioRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * MenuitemradioRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#menuitemradio">menuitemradio</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface MenuitemradioRole extends MenuitemcheckboxRole, RadioRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/MenuitemradioRoleImpl.java b/user/src/com/google/gwt/aria/client/MenuitemradioRoleImpl.java
index 22972f1..4a8d234 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemradioRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemradioRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link MenuitemradioRole}.</p>
  */
-class MenuitemradioRoleImpl extends Role implements MenuitemradioRole {
+class MenuitemradioRoleImpl extends RoleImpl implements MenuitemradioRole {
   MenuitemradioRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/NavigationRole.java b/user/src/com/google/gwt/aria/client/NavigationRole.java
index 1ceea1e..e2859f0 100644
--- a/user/src/com/google/gwt/aria/client/NavigationRole.java
+++ b/user/src/com/google/gwt/aria/client/NavigationRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * NavigationRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#navigation">navigation</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface NavigationRole extends LandmarkRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/NavigationRoleImpl.java b/user/src/com/google/gwt/aria/client/NavigationRoleImpl.java
index 0bd96f1..192095e 100644
--- a/user/src/com/google/gwt/aria/client/NavigationRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/NavigationRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link NavigationRole}.</p>
  */
-class NavigationRoleImpl extends Role implements NavigationRole {
+class NavigationRoleImpl extends RoleImpl implements NavigationRole {
   NavigationRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/NoteRole.java b/user/src/com/google/gwt/aria/client/NoteRole.java
index af77298..1a85552 100644
--- a/user/src/com/google/gwt/aria/client/NoteRole.java
+++ b/user/src/com/google/gwt/aria/client/NoteRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * NoteRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#note">note</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface NoteRole extends SectionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/NoteRoleImpl.java b/user/src/com/google/gwt/aria/client/NoteRoleImpl.java
index e4b25a5..c58cdae 100644
--- a/user/src/com/google/gwt/aria/client/NoteRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/NoteRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link NoteRole}.</p>
  */
-class NoteRoleImpl extends Role implements NoteRole {
+class NoteRoleImpl extends RoleImpl implements NoteRole {
   NoteRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/OptionRole.java b/user/src/com/google/gwt/aria/client/OptionRole.java
index ac16f8a..9ce9be0 100644
--- a/user/src/com/google/gwt/aria/client/OptionRole.java
+++ b/user/src/com/google/gwt/aria/client/OptionRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * OptionRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#option">option</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface OptionRole extends InputRole {
   String getAriaCheckedState(Element element);
diff --git a/user/src/com/google/gwt/aria/client/OptionRoleImpl.java b/user/src/com/google/gwt/aria/client/OptionRoleImpl.java
index 3598d52..c7b32ae 100644
--- a/user/src/com/google/gwt/aria/client/OptionRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/OptionRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link OptionRole}.</p>
  */
-class OptionRoleImpl extends Role implements OptionRole {
+class OptionRoleImpl extends RoleImpl implements OptionRole {
   OptionRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/PresentationRole.java b/user/src/com/google/gwt/aria/client/PresentationRole.java
index fed5cc0..c2b0df4 100644
--- a/user/src/com/google/gwt/aria/client/PresentationRole.java
+++ b/user/src/com/google/gwt/aria/client/PresentationRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * PresentationRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#presentation">presentation</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface PresentationRole extends StructureRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/PresentationRoleImpl.java b/user/src/com/google/gwt/aria/client/PresentationRoleImpl.java
index 09c8bbe..56badbb 100644
--- a/user/src/com/google/gwt/aria/client/PresentationRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/PresentationRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link PresentationRole}.</p>
  */
-class PresentationRoleImpl extends Role implements PresentationRole {
+class PresentationRoleImpl extends RoleImpl implements PresentationRole {
   PresentationRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ProgressbarRole.java b/user/src/com/google/gwt/aria/client/ProgressbarRole.java
index da17fd0..2c68d6b 100644
--- a/user/src/com/google/gwt/aria/client/ProgressbarRole.java
+++ b/user/src/com/google/gwt/aria/client/ProgressbarRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * ProgressbarRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#progressbar">progressbar</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ProgressbarRole extends RangeRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/ProgressbarRoleImpl.java b/user/src/com/google/gwt/aria/client/ProgressbarRoleImpl.java
index 1d30ef9..5170fa2 100644
--- a/user/src/com/google/gwt/aria/client/ProgressbarRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ProgressbarRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ProgressbarRole}.</p>
  */
-class ProgressbarRoleImpl extends Role implements ProgressbarRole {
+class ProgressbarRoleImpl extends RoleImpl implements ProgressbarRole {
   ProgressbarRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/RadioRole.java b/user/src/com/google/gwt/aria/client/RadioRole.java
index c8b3486..7315a6c 100644
--- a/user/src/com/google/gwt/aria/client/RadioRole.java
+++ b/user/src/com/google/gwt/aria/client/RadioRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * RadioRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#radio">radio</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface RadioRole extends CheckboxRole, OptionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/RadioRoleImpl.java b/user/src/com/google/gwt/aria/client/RadioRoleImpl.java
index 75b2ab5..04f0146 100644
--- a/user/src/com/google/gwt/aria/client/RadioRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RadioRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link RadioRole}.</p>
  */
-class RadioRoleImpl extends Role implements RadioRole {
+class RadioRoleImpl extends RoleImpl implements RadioRole {
   RadioRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/RadiogroupRole.java b/user/src/com/google/gwt/aria/client/RadiogroupRole.java
index 980e3e4..0f00e49 100644
--- a/user/src/com/google/gwt/aria/client/RadiogroupRole.java
+++ b/user/src/com/google/gwt/aria/client/RadiogroupRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * RadiogroupRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#radiogroup">radiogroup</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface RadiogroupRole extends SelectRole {
   String getAriaRequiredProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/RadiogroupRoleImpl.java b/user/src/com/google/gwt/aria/client/RadiogroupRoleImpl.java
index 4ad7896..a235445 100644
--- a/user/src/com/google/gwt/aria/client/RadiogroupRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RadiogroupRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link RadiogroupRole}.</p>
  */
-class RadiogroupRoleImpl extends Role implements RadiogroupRole {
+class RadiogroupRoleImpl extends RoleImpl implements RadiogroupRole {
   RadiogroupRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/RangeRole.java b/user/src/com/google/gwt/aria/client/RangeRole.java
index 886f6fc..6aad17d 100644
--- a/user/src/com/google/gwt/aria/client/RangeRole.java
+++ b/user/src/com/google/gwt/aria/client/RangeRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * RangeRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#range">range</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface RangeRole extends WidgetRole {
   String getAriaValuemaxProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/RegionRole.java b/user/src/com/google/gwt/aria/client/RegionRole.java
index dd5b187..dec20f8 100644
--- a/user/src/com/google/gwt/aria/client/RegionRole.java
+++ b/user/src/com/google/gwt/aria/client/RegionRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * RegionRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#region">region</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface RegionRole extends SectionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/RegionRoleImpl.java b/user/src/com/google/gwt/aria/client/RegionRoleImpl.java
index cdbe2d8..12816ab 100644
--- a/user/src/com/google/gwt/aria/client/RegionRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RegionRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link RegionRole}.</p>
  */
-class RegionRoleImpl extends Role implements RegionRole {
+class RegionRoleImpl extends RoleImpl implements RegionRole {
   RegionRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/Role.java b/user/src/com/google/gwt/aria/client/RoleImpl.java
similarity index 95%
rename from user/src/com/google/gwt/aria/client/Role.java
rename to user/src/com/google/gwt/aria/client/RoleImpl.java
index b7a6911..df8c999 100644
--- a/user/src/com/google/gwt/aria/client/Role.java
+++ b/user/src/com/google/gwt/aria/client/RoleImpl.java
@@ -34,11 +34,12 @@
  * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
  * The Roles Model </a>.</p>
  */
-public class Role {
-  public static final String ATTR_NAME_ROLE = "role";
+class RoleImpl {
+  private static final String ATTR_NAME_ROLE = "role";
+
   private final String roleName;
 
-  public Role(String roleName) {
+  RoleImpl(String roleName) {
     assert roleName != null : "Role name cannot be null";
     this.roleName = roleName;
   }
diff --git a/user/src/com/google/gwt/aria/client/Roles.java b/user/src/com/google/gwt/aria/client/Roles.java
index 6338119..43c7b48 100644
--- a/user/src/com/google/gwt/aria/client/Roles.java
+++ b/user/src/com/google/gwt/aria/client/Roles.java
@@ -18,46 +18,53 @@
 /////////////////////////////////////////////////////////
 
 /**
- * <p>Class containing the ARIA roles as defined by <a href="http://www.w3.org/TR/wai-aria/">
- * W3C ARIA specification</a>. A WAI-ARIA role is set on an element using a <i>role</i> attribute.
- * An element role is constant and is not supposed to change.</p>
+ * <p>A factory providing each concrete role in the ARIA specification. Each role implements
+ * methods that a GWT application can use to modify the appropriate DOM attributes for that
+ * role.</p>
  *
- * <p>This is the central class in this ARIA API because it contains all defined roles which
- * can be set to HTML elements. Each role in this class is a {@link Role} instance.
- * The {@link Role} class contains methods for getting and setting states and properties.</p>
+ * <p>For example, suppose our GWT app has a image button and we want to make it visible in screen
+ * readers as a button with some help text. To do this, we add a <i>button</i> role to the image and
+ * set the ARIA <i>label</i> property to the help text that the screen reader can use:</p>
  *
- * <p>Lets say we have an image button widget and we want to make it visible to a reader as a
- * button, accompanied with some help text for the button usage. For the purpose we need to add a
- * 'button' role to the image and set label that the reader can interpret. We set the 'button' role
- * for an image (img) with the call: Roles.getButtonRole.set(img.getElement()) and set the
- * 'aria-label' property by calling: Roles.getButtonRole().setAriaLabelProperty(img.getElement,
- * "test")</p>
+ * <pre>
+ *    Roles.getButtonRole().set(img.getElement());
+ *    Roles.getButtonRole().setAriaLabelProperty(img.getElement(), "some help text");
+ * </pre>
  *
- * <p>ARIA states are used similarly to ARIA properties by using the
- * Roles.getButtonRole().setAriaEnabledState(img.getElement(), isEnabled) method.
- * Although States and Properties are structurally the same, they are
- * separated in 2 classes in this API because they are semantically different and have different
- * usage. There exist the concept of extra properties and for now the only
- * example is tabindex. If we want to set the tabindex to 0 for the button,
- * we need to call Roles.getButtonRole().setTabindexExtraAttribute(img.getElement(), 0).</p>
+ * <p>Most ARIA properties have a prefix of "aria-" and only affect screen readers, but there is
+ * one exception: the "tabindex" property is the same one used for tab order in regular widgets.
+ * For example, to set tabindex to 0 for the button:
+ * </p>
  *
- * <p>There are 4 groups of roles:
+ * <pre>
+ *   Roles.getButtonRole().setTabindexExtraAttribute(img.getElement(), 0);
+ * </pre>
+ *
+ * <p>When the button changes state (it's enabled or disabled), we can change the ARIA enabled
+ * state to match, like this:</p>
+ *
+ * <pre>
+ *   Roles.getButtonRole().setAriaEnabledState(img.getElement(), isEnabled);
+ * </pre>
+ *
+ * <p>ARIA distinguishes between properties (which change rarely and could be set in static HTML)
+ * and states (which need to be updated in response to user input). This distinction can get a bit
+ * blurry when a GWT app updates the DOM dynamically. Generally you should update ARIA
+ * attributes at the same time that you change the CSS styles on a DOM node, so that a screen
+ * reader will see the same state as someone viewing the page visually.</p>
+ *
+ * <p>The role interfaces form a hierarchy whose root is the {@link Role} interface, which contains
+ * generic methods that aren't specific to a role. Some abstract roles include:</p>
  * <ol>
- * <li>Abstract roles -- used as base types for applied roles. They are not used by Web Authors
- * and would not be exposed as role definitions for incorporation into a Web page. Base classes are
- * referenced within the taxonomy and are used to build a picture of the role taxonomy class
- * hierarchy within the taxonomy.</li>
- * <li>Widget roles -- act as standalone user interface widgets or as part of larger,
- *  composite widgets</li>
- * <li>Widget container roles -- act as composite user interface widgets. These roles typically act
- *  as containers that manage other, contained widgets</li>
- * <li>Document structure roles -- describe structures that organize content in a page. Document
- * structures are not usually interactive</li>
- * <li>Landmark Roles -- regions of the page intended as navigational landmarks</li>
+ * <li>{@link WidgetRole}, for DOM elements that represent either standalone or composite widgets.
+ * <li>{@link CompositeRole}, for widgets that contain other widgets.</li>
+ * <li>{@link StructureRole}, for DOM elements that are part of the page layout.</li>
+ * <li>{@link LandmarkRole}, for DOM elements defining common regions of a page.</li>
+ * <li>{@link WindowRole}, for DOM elements that define windows and dialogs.</li>
  * </ol>
  * </p>
  *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles"></p>
+ * @see <a href="http://www.w3.org/TR/wai-aria/roles">the W3C specification</a>
  */
 public final class Roles {
   private static final AlertdialogRole ALERTDIALOG = new AlertdialogRoleImpl("alertdialog");
diff --git a/user/src/com/google/gwt/aria/client/RoletypeRole.java b/user/src/com/google/gwt/aria/client/RoletypeRole.java
deleted file mode 100644
index 48af351..0000000
--- a/user/src/com/google/gwt/aria/client/RoletypeRole.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright 2012 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.google.gwt.aria.client;
-/////////////////////////////////////////////////////////
-// This is auto-generated code.  Do not manually edit! //
-/////////////////////////////////////////////////////////
-
-import com.google.gwt.dom.client.Element;
-
-/**
- * RoletypeRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
- *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
- */
-public interface RoletypeRole {
-  String get(Element element);
-
-  String getAriaAtomicProperty(Element element);
-
-  String getAriaBusyState(Element element);
-
-  String getAriaControlsProperty(Element element);
-
-  String getAriaDescribedbyProperty(Element element);
-
-  String getAriaDisabledState(Element element);
-
-  String getAriaDropeffectProperty(Element element);
-
-  String getAriaFlowtoProperty(Element element);
-
-  String getAriaGrabbedState(Element element);
-
-  String getAriaHaspopupProperty(Element element);
-
-  String getAriaHiddenState(Element element);
-
-  String getAriaInvalidState(Element element);
-
-  String getAriaLabelledbyProperty(Element element);
-
-  String getAriaLabelProperty(Element element);
-
-  String getAriaLiveProperty(Element element);
-
-  String getAriaOwnsProperty(Element element);
-
-  String getAriaRelevantProperty(Element element);
-
-  String getName();
-
-  String getTabindexExtraAttribute(Element element);
-
-  void remove(Element element);
-
-  void removeAriaAtomicProperty(Element element);
-
-  void removeAriaBusyState(Element element);
-
-  void removeAriaControlsProperty(Element element);
-
-  void removeAriaDescribedbyProperty(Element element);
-
-  void removeAriaDisabledState(Element element);
-
-  void removeAriaDropeffectProperty(Element element);
-
-  void removeAriaFlowtoProperty(Element element);
-
-  void removeAriaGrabbedState(Element element);
-
-  void removeAriaHaspopupProperty(Element element);
-
-  void removeAriaHiddenState(Element element);
-
-  void removeAriaInvalidState(Element element);
-
-  void removeAriaLabelledbyProperty(Element element);
-
-  void removeAriaLabelProperty(Element element);
-
-  void removeAriaLiveProperty(Element element);
-
-  void removeAriaOwnsProperty(Element element);
-
-  void removeAriaRelevantProperty(Element element);
-
-  void removeTabindexExtraAttribute(Element element);
-
-  void set(Element element);
-
-  void setAriaAtomicProperty(Element element, boolean value);
-
-  void setAriaBusyState(Element element, boolean value);
-
-  void setAriaControlsProperty(Element element, IdReference... value);
-
-  void setAriaDescribedbyProperty(Element element, IdReference... value);
-
-  void setAriaDisabledState(Element element, boolean value);
-
-  void setAriaDropeffectProperty(Element element, DropeffectValue... value);
-
-  void setAriaFlowtoProperty(Element element, IdReference... value);
-
-  void setAriaGrabbedState(Element element, GrabbedValue value);
-
-  void setAriaHaspopupProperty(Element element, boolean value);
-
-  void setAriaHiddenState(Element element, boolean value);
-
-  void setAriaInvalidState(Element element, InvalidValue value);
-
-  void setAriaLabelledbyProperty(Element element, IdReference... value);
-
-  void setAriaLabelProperty(Element element, String value);
-
-  void setAriaLiveProperty(Element element, LiveValue value);
-
-  void setAriaOwnsProperty(Element element, IdReference... value);
-
-  void setAriaRelevantProperty(Element element, RelevantValue... value);
-
-  void setTabindexExtraAttribute(Element element, int value);
-}
diff --git a/user/src/com/google/gwt/aria/client/RowRole.java b/user/src/com/google/gwt/aria/client/RowRole.java
index debf6e8..82f1032 100644
--- a/user/src/com/google/gwt/aria/client/RowRole.java
+++ b/user/src/com/google/gwt/aria/client/RowRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * RowRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#row">row</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface RowRole extends GroupRole, WidgetRole {
   String getAriaLevelProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/RowRoleImpl.java b/user/src/com/google/gwt/aria/client/RowRoleImpl.java
index ad1a4c0..9b9a467 100644
--- a/user/src/com/google/gwt/aria/client/RowRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RowRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link RowRole}.</p>
  */
-class RowRoleImpl extends Role implements RowRole {
+class RowRoleImpl extends RoleImpl implements RowRole {
   RowRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/RowgroupRole.java b/user/src/com/google/gwt/aria/client/RowgroupRole.java
index b73afd0..55ba25e 100644
--- a/user/src/com/google/gwt/aria/client/RowgroupRole.java
+++ b/user/src/com/google/gwt/aria/client/RowgroupRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * RowgroupRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#rowgroup">rowgroup</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface RowgroupRole extends GroupRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/RowgroupRoleImpl.java b/user/src/com/google/gwt/aria/client/RowgroupRoleImpl.java
index e0bab0e..74ec684 100644
--- a/user/src/com/google/gwt/aria/client/RowgroupRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RowgroupRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link RowgroupRole}.</p>
  */
-class RowgroupRoleImpl extends Role implements RowgroupRole {
+class RowgroupRoleImpl extends RoleImpl implements RowgroupRole {
   RowgroupRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/RowheaderRole.java b/user/src/com/google/gwt/aria/client/RowheaderRole.java
index 2192540..73ab027 100644
--- a/user/src/com/google/gwt/aria/client/RowheaderRole.java
+++ b/user/src/com/google/gwt/aria/client/RowheaderRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * RowheaderRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#rowheader">rowheader</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface RowheaderRole extends GridcellRole, SectionheadRole, WidgetRole {
   String getAriaSortProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java b/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java
index 94bb84c..6e16a37 100644
--- a/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link RowheaderRole}.</p>
  */
-class RowheaderRoleImpl extends Role implements RowheaderRole {
+class RowheaderRoleImpl extends RoleImpl implements RowheaderRole {
   RowheaderRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ScrollbarRole.java b/user/src/com/google/gwt/aria/client/ScrollbarRole.java
index 67c1ff9..723447e 100644
--- a/user/src/com/google/gwt/aria/client/ScrollbarRole.java
+++ b/user/src/com/google/gwt/aria/client/ScrollbarRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * ScrollbarRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#scrollbar">scrollbar</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ScrollbarRole extends InputRole, RangeRole {
   String getAriaOrientationProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java b/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java
index 6c37f8b..6b677e0 100644
--- a/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ScrollbarRole}.</p>
  */
-class ScrollbarRoleImpl extends Role implements ScrollbarRole {
+class ScrollbarRoleImpl extends RoleImpl implements ScrollbarRole {
   ScrollbarRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/SearchRole.java b/user/src/com/google/gwt/aria/client/SearchRole.java
index abf6ae5..1cd92f7 100644
--- a/user/src/com/google/gwt/aria/client/SearchRole.java
+++ b/user/src/com/google/gwt/aria/client/SearchRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * SearchRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#search">search</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface SearchRole extends LandmarkRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/SearchRoleImpl.java b/user/src/com/google/gwt/aria/client/SearchRoleImpl.java
index c6d3125..2a6fcaf 100644
--- a/user/src/com/google/gwt/aria/client/SearchRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/SearchRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link SearchRole}.</p>
  */
-class SearchRoleImpl extends Role implements SearchRole {
+class SearchRoleImpl extends RoleImpl implements SearchRole {
   SearchRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/SectionRole.java b/user/src/com/google/gwt/aria/client/SectionRole.java
index 5b7183f..bf6a7b2 100644
--- a/user/src/com/google/gwt/aria/client/SectionRole.java
+++ b/user/src/com/google/gwt/aria/client/SectionRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * SectionRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#section">section</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface SectionRole extends StructureRole {
   String getAriaExpandedState(Element element);
diff --git a/user/src/com/google/gwt/aria/client/SectionheadRole.java b/user/src/com/google/gwt/aria/client/SectionheadRole.java
index 8cae3a3..c54e8a2 100644
--- a/user/src/com/google/gwt/aria/client/SectionheadRole.java
+++ b/user/src/com/google/gwt/aria/client/SectionheadRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * SectionheadRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#sectionhead">sectionhead</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface SectionheadRole extends StructureRole {
   String getAriaExpandedState(Element element);
diff --git a/user/src/com/google/gwt/aria/client/SelectRole.java b/user/src/com/google/gwt/aria/client/SelectRole.java
index 706ce12..22de0db 100644
--- a/user/src/com/google/gwt/aria/client/SelectRole.java
+++ b/user/src/com/google/gwt/aria/client/SelectRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * SelectRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#select">select</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface SelectRole extends CompositeRole, GroupRole, InputRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/SeparatorRole.java b/user/src/com/google/gwt/aria/client/SeparatorRole.java
index 3eea52e..ffc966d 100644
--- a/user/src/com/google/gwt/aria/client/SeparatorRole.java
+++ b/user/src/com/google/gwt/aria/client/SeparatorRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * SeparatorRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#separator">separator</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface SeparatorRole extends StructureRole {
   String getAriaExpandedState(Element element);
diff --git a/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java b/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java
index 7f3911f..dd75693 100644
--- a/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link SeparatorRole}.</p>
  */
-class SeparatorRoleImpl extends Role implements SeparatorRole {
+class SeparatorRoleImpl extends RoleImpl implements SeparatorRole {
   SeparatorRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/SliderRole.java b/user/src/com/google/gwt/aria/client/SliderRole.java
index 2aef7bf..ab268b2 100644
--- a/user/src/com/google/gwt/aria/client/SliderRole.java
+++ b/user/src/com/google/gwt/aria/client/SliderRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * SliderRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#slider">slider</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface SliderRole extends InputRole, RangeRole {
   String getAriaOrientationProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/SliderRoleImpl.java b/user/src/com/google/gwt/aria/client/SliderRoleImpl.java
index 4427602..5ebd768 100644
--- a/user/src/com/google/gwt/aria/client/SliderRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/SliderRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link SliderRole}.</p>
  */
-class SliderRoleImpl extends Role implements SliderRole {
+class SliderRoleImpl extends RoleImpl implements SliderRole {
   SliderRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/SpinbuttonRole.java b/user/src/com/google/gwt/aria/client/SpinbuttonRole.java
index 79775bb..cddb0b6 100644
--- a/user/src/com/google/gwt/aria/client/SpinbuttonRole.java
+++ b/user/src/com/google/gwt/aria/client/SpinbuttonRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * SpinbuttonRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#spinbutton">spinbutton</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface SpinbuttonRole extends InputRole, RangeRole {
   String getAriaRequiredProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/SpinbuttonRoleImpl.java b/user/src/com/google/gwt/aria/client/SpinbuttonRoleImpl.java
index 0b074b8..872080d 100644
--- a/user/src/com/google/gwt/aria/client/SpinbuttonRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/SpinbuttonRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link SpinbuttonRole}.</p>
  */
-class SpinbuttonRoleImpl extends Role implements SpinbuttonRole {
+class SpinbuttonRoleImpl extends RoleImpl implements SpinbuttonRole {
   SpinbuttonRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/StatusRole.java b/user/src/com/google/gwt/aria/client/StatusRole.java
index e59e0c9..9bde7d7 100644
--- a/user/src/com/google/gwt/aria/client/StatusRole.java
+++ b/user/src/com/google/gwt/aria/client/StatusRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * StatusRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#status">status</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface StatusRole extends RegionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/StatusRoleImpl.java b/user/src/com/google/gwt/aria/client/StatusRoleImpl.java
index e22482c..2329a3e 100644
--- a/user/src/com/google/gwt/aria/client/StatusRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/StatusRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link StatusRole}.</p>
  */
-class StatusRoleImpl extends Role implements StatusRole {
+class StatusRoleImpl extends RoleImpl implements StatusRole {
   StatusRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/StructureRole.java b/user/src/com/google/gwt/aria/client/StructureRole.java
index e4c7212..69a1430 100644
--- a/user/src/com/google/gwt/aria/client/StructureRole.java
+++ b/user/src/com/google/gwt/aria/client/StructureRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * StructureRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#structure">structure</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
-public interface StructureRole extends RoletypeRole {
+public interface StructureRole extends Role {
 }
diff --git a/user/src/com/google/gwt/aria/client/TabRole.java b/user/src/com/google/gwt/aria/client/TabRole.java
index 90e334f..47875c7 100644
--- a/user/src/com/google/gwt/aria/client/TabRole.java
+++ b/user/src/com/google/gwt/aria/client/TabRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * TabRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#tab">tab</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface TabRole extends SectionheadRole, WidgetRole {
   String getAriaSelectedState(Element element);
diff --git a/user/src/com/google/gwt/aria/client/TabRoleImpl.java b/user/src/com/google/gwt/aria/client/TabRoleImpl.java
index 101309d..60aef5e 100644
--- a/user/src/com/google/gwt/aria/client/TabRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TabRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link TabRole}.</p>
  */
-class TabRoleImpl extends Role implements TabRole {
+class TabRoleImpl extends RoleImpl implements TabRole {
   TabRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/TablistRole.java b/user/src/com/google/gwt/aria/client/TablistRole.java
index 47d8a1e..b795ed8 100644
--- a/user/src/com/google/gwt/aria/client/TablistRole.java
+++ b/user/src/com/google/gwt/aria/client/TablistRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * TablistRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#tablist">tablist</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface TablistRole extends CompositeRole, DirectoryRole {
   String getAriaLevelProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/TablistRoleImpl.java b/user/src/com/google/gwt/aria/client/TablistRoleImpl.java
index 3952c79..a92be09 100644
--- a/user/src/com/google/gwt/aria/client/TablistRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TablistRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link TablistRole}.</p>
  */
-class TablistRoleImpl extends Role implements TablistRole {
+class TablistRoleImpl extends RoleImpl implements TablistRole {
   TablistRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/TabpanelRole.java b/user/src/com/google/gwt/aria/client/TabpanelRole.java
index 42deefd..30a8d9a 100644
--- a/user/src/com/google/gwt/aria/client/TabpanelRole.java
+++ b/user/src/com/google/gwt/aria/client/TabpanelRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * TabpanelRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#tabpanel">tabpanel</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface TabpanelRole extends RegionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/TabpanelRoleImpl.java b/user/src/com/google/gwt/aria/client/TabpanelRoleImpl.java
index ebb9797..54aaff6 100644
--- a/user/src/com/google/gwt/aria/client/TabpanelRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TabpanelRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link TabpanelRole}.</p>
  */
-class TabpanelRoleImpl extends Role implements TabpanelRole {
+class TabpanelRoleImpl extends RoleImpl implements TabpanelRole {
   TabpanelRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/TextboxRole.java b/user/src/com/google/gwt/aria/client/TextboxRole.java
index 68b9ee8..03f6a37 100644
--- a/user/src/com/google/gwt/aria/client/TextboxRole.java
+++ b/user/src/com/google/gwt/aria/client/TextboxRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * TextboxRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#textbox">textbox</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface TextboxRole extends InputRole {
   String getAriaActivedescendantProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/TextboxRoleImpl.java b/user/src/com/google/gwt/aria/client/TextboxRoleImpl.java
index 6a967aa..88203ad 100644
--- a/user/src/com/google/gwt/aria/client/TextboxRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TextboxRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link TextboxRole}.</p>
  */
-class TextboxRoleImpl extends Role implements TextboxRole {
+class TextboxRoleImpl extends RoleImpl implements TextboxRole {
   TextboxRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/TimerRole.java b/user/src/com/google/gwt/aria/client/TimerRole.java
index 353aeb7..66a9043 100644
--- a/user/src/com/google/gwt/aria/client/TimerRole.java
+++ b/user/src/com/google/gwt/aria/client/TimerRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * TimerRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#timer">timer</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface TimerRole extends StatusRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/TimerRoleImpl.java b/user/src/com/google/gwt/aria/client/TimerRoleImpl.java
index 217e334..4bcb08b 100644
--- a/user/src/com/google/gwt/aria/client/TimerRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TimerRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link TimerRole}.</p>
  */
-class TimerRoleImpl extends Role implements TimerRole {
+class TimerRoleImpl extends RoleImpl implements TimerRole {
   TimerRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/ToolbarRole.java b/user/src/com/google/gwt/aria/client/ToolbarRole.java
index 198cd3e..ae2b7cb 100644
--- a/user/src/com/google/gwt/aria/client/ToolbarRole.java
+++ b/user/src/com/google/gwt/aria/client/ToolbarRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * ToolbarRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#toolbar">toolbar</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface ToolbarRole extends GroupRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/ToolbarRoleImpl.java b/user/src/com/google/gwt/aria/client/ToolbarRoleImpl.java
index 1861f0a..4592e60 100644
--- a/user/src/com/google/gwt/aria/client/ToolbarRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ToolbarRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link ToolbarRole}.</p>
  */
-class ToolbarRoleImpl extends Role implements ToolbarRole {
+class ToolbarRoleImpl extends RoleImpl implements ToolbarRole {
   ToolbarRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/TooltipRole.java b/user/src/com/google/gwt/aria/client/TooltipRole.java
index 1928a78..b456cc7 100644
--- a/user/src/com/google/gwt/aria/client/TooltipRole.java
+++ b/user/src/com/google/gwt/aria/client/TooltipRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * TooltipRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#tooltip">tooltip</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface TooltipRole extends SectionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/TooltipRoleImpl.java b/user/src/com/google/gwt/aria/client/TooltipRoleImpl.java
index 85e3d4e..309a1ca 100644
--- a/user/src/com/google/gwt/aria/client/TooltipRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TooltipRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link TooltipRole}.</p>
  */
-class TooltipRoleImpl extends Role implements TooltipRole {
+class TooltipRoleImpl extends RoleImpl implements TooltipRole {
   TooltipRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/TreeRole.java b/user/src/com/google/gwt/aria/client/TreeRole.java
index 09c6a37..eaf1993 100644
--- a/user/src/com/google/gwt/aria/client/TreeRole.java
+++ b/user/src/com/google/gwt/aria/client/TreeRole.java
@@ -20,22 +20,11 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * TreeRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#tree">tree</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface TreeRole extends SelectRole {
   String getAriaMultiselectableProperty(Element element);
diff --git a/user/src/com/google/gwt/aria/client/TreeRoleImpl.java b/user/src/com/google/gwt/aria/client/TreeRoleImpl.java
index 235afe4..6927782 100644
--- a/user/src/com/google/gwt/aria/client/TreeRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TreeRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link TreeRole}.</p>
  */
-class TreeRoleImpl extends Role implements TreeRole {
+class TreeRoleImpl extends RoleImpl implements TreeRole {
   TreeRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/TreegridRole.java b/user/src/com/google/gwt/aria/client/TreegridRole.java
index c19fad7..e2a4430 100644
--- a/user/src/com/google/gwt/aria/client/TreegridRole.java
+++ b/user/src/com/google/gwt/aria/client/TreegridRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * TreegridRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#treegrid">treegrid</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface TreegridRole extends GridRole, TreeRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/TreegridRoleImpl.java b/user/src/com/google/gwt/aria/client/TreegridRoleImpl.java
index bff82e8..1d5f9bf 100644
--- a/user/src/com/google/gwt/aria/client/TreegridRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TreegridRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link TreegridRole}.</p>
  */
-class TreegridRoleImpl extends Role implements TreegridRole {
+class TreegridRoleImpl extends RoleImpl implements TreegridRole {
   TreegridRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/TreeitemRole.java b/user/src/com/google/gwt/aria/client/TreeitemRole.java
index 5157f99..2266786 100644
--- a/user/src/com/google/gwt/aria/client/TreeitemRole.java
+++ b/user/src/com/google/gwt/aria/client/TreeitemRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * TreeitemRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#treeitem">treeitem</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
 public interface TreeitemRole extends ListitemRole, OptionRole {
 }
diff --git a/user/src/com/google/gwt/aria/client/TreeitemRoleImpl.java b/user/src/com/google/gwt/aria/client/TreeitemRoleImpl.java
index 1491907..7344626 100644
--- a/user/src/com/google/gwt/aria/client/TreeitemRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TreeitemRoleImpl.java
@@ -22,7 +22,7 @@
 /**
  * <p>Implements {@link TreeitemRole}.</p>
  */
-class TreeitemRoleImpl extends Role implements TreeitemRole {
+class TreeitemRoleImpl extends RoleImpl implements TreeitemRole {
   TreeitemRoleImpl(String roleName) {
     super(roleName);
   }
diff --git a/user/src/com/google/gwt/aria/client/WidgetRole.java b/user/src/com/google/gwt/aria/client/WidgetRole.java
index 3cec572..7b7f38e 100644
--- a/user/src/com/google/gwt/aria/client/WidgetRole.java
+++ b/user/src/com/google/gwt/aria/client/WidgetRole.java
@@ -19,22 +19,11 @@
 
 
 /**
- * WidgetRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#widget">widget</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
-public interface WidgetRole extends RoletypeRole {
+public interface WidgetRole extends Role {
 }
diff --git a/user/src/com/google/gwt/aria/client/WindowRole.java b/user/src/com/google/gwt/aria/client/WindowRole.java
index 3b34cdc..73ad921 100644
--- a/user/src/com/google/gwt/aria/client/WindowRole.java
+++ b/user/src/com/google/gwt/aria/client/WindowRole.java
@@ -20,24 +20,13 @@
 import com.google.gwt.dom.client.Element;
 
 /**
- * WindowRole interface.
- * The interface defines methods for setting, getting, removing states and properties.
- * <p>Allows ARIA Accessibility attributes to be added to widgets so that they can be identified by
- * assistive technology.</p>
+ * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#window">window</a>
+ * role in the ARIA specification.
  *
- * <p>ARIA roles define widgets and page structure that can be interpreted by a reader
- * application/device. There is a set of abstract roles which are used as
- * building blocks of the roles hierarchy structural and define the common properties and states
- * for the concrete roles. Abstract roles cannot be set to HTML elements.</p>
- *
- * <p>There are states and properties that are defined for a role. As roles are organized in a
- * hierarchy, a role has inherited and own properties and states which can be set to the
- * element.</p>
- *
- * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles">
- * The Roles Model </a>.</p>
+ * @see Role
+ * @see Roles
  */
-public interface WindowRole extends RoletypeRole {
+public interface WindowRole extends Role {
   String getAriaExpandedState(Element element);
 
   void removeAriaExpandedState(Element element);
diff --git a/user/src/com/google/gwt/user/client/ui/AbstractNativeScrollbar.java b/user/src/com/google/gwt/user/client/ui/AbstractNativeScrollbar.java
index 5d04e05..e09de7f 100644
--- a/user/src/com/google/gwt/user/client/ui/AbstractNativeScrollbar.java
+++ b/user/src/com/google/gwt/user/client/ui/AbstractNativeScrollbar.java
@@ -20,7 +20,6 @@
 import com.google.gwt.dom.client.Style.Overflow;
 import com.google.gwt.dom.client.Style.Position;
 import com.google.gwt.dom.client.Style.Unit;
-import com.google.gwt.dom.client.Style.Visibility;
 import com.google.gwt.event.dom.client.HasScrollHandlers;
 import com.google.gwt.event.dom.client.ScrollEvent;
 import com.google.gwt.event.dom.client.ScrollHandler;
@@ -88,12 +87,11 @@
     // Create a scrollable element and attach it to the body.
     Element scrollable = Document.get().createDivElement();
     scrollable.getStyle().setPosition(Position.ABSOLUTE);
-    scrollable.getStyle().setTop(0.0, Unit.PX);
-    scrollable.getStyle().setLeft(0.0, Unit.PX);
+    scrollable.getStyle().setTop(-1000.0, Unit.PX);
+    scrollable.getStyle().setLeft(-1000.0, Unit.PX);
     scrollable.getStyle().setHeight(100.0, Unit.PX);
     scrollable.getStyle().setWidth(100.0, Unit.PX);
     scrollable.getStyle().setOverflow(Overflow.SCROLL);
-    scrollable.getStyle().setVisibility(Visibility.HIDDEN);
     scrollable.getStyle().setProperty("direction", "rtl");
     Document.get().getBody().appendChild(scrollable);
 
diff --git a/user/src/com/google/gwt/user/client/ui/SuggestBox.java b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
index 20e2e6e..58f7d9f 100644
--- a/user/src/com/google/gwt/user/client/ui/SuggestBox.java
+++ b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
@@ -84,7 +84,7 @@
  * to know when a suggestion has been chosen from the SuggestBox's list of
  * suggestions. A SuggestBox fires {@link SuggestionEvent SuggestionEvents}
  * whenever a suggestion is chosen, and handlers for these events can be added
- * using the {@link #addValueChangeHandler(ValueChangeHandler)} method.
+ * using the {@link #addSelectionHandler(SelectionHandler)} method.
  * </p>
  *
  * <p>
diff --git a/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java b/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java
index 90532e6..dfde7da 100644
--- a/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java
+++ b/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java
@@ -25,6 +25,7 @@
 import javax.validation.Validator;
 import javax.validation.ValidatorContext;
 import javax.validation.ValidatorFactory;
+import javax.validation.spi.ConfigurationState;
 
 /**
  * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
@@ -56,33 +57,38 @@
  * </pre>
  */
 public abstract class AbstractGwtValidatorFactory implements ValidatorFactory {
-
-  private final ConstraintValidatorFactory constraintValidatorFactory = GWT
-      .create(ConstraintValidatorFactory.class);
-  private final GwtMessageInterpolator messageInterpolator = new GwtMessageInterpolator();
-  private final TraversableResolver traversableResolver = GWT
-      .create(TraversableResolver.class);;
+  private ConstraintValidatorFactory constraintValidatorFactory;
+  private MessageInterpolator messageInterpolator;
+  private TraversableResolver traversableResolver;
 
   /**
-   * Implement this method to returns a {@link GWT#create}ed {@link Validator}
+   * Implement this method to return a {@link GWT#create}d {@link Validator}
    * annotated with {@link GwtValidation}.
    * 
    * @return newly created Validator
    */
   public abstract AbstractGwtValidator createValidator();
 
+  /**
+   * GWT does not support {@link ConstraintValidatorFactory}, so the object returned by this method
+   * will not work.
+   */
+  @Override
   public final ConstraintValidatorFactory getConstraintValidatorFactory() {
     return constraintValidatorFactory;
   }
 
+  @Override
   public final MessageInterpolator getMessageInterpolator() {
     return messageInterpolator;
   }
 
+  @Override
   public final TraversableResolver getTraversableResolver() {
     return traversableResolver;
   }
 
+  @Override
   public final Validator getValidator() {
     AbstractGwtValidator validator = createValidator();
     validator.init(getConstraintValidatorFactory(), getMessageInterpolator(),
@@ -90,11 +96,27 @@
     return validator;
   }
 
+  public final void init(ConfigurationState configState) {
+    ConstraintValidatorFactory configConstraintValidatorFactory =
+        configState.getConstraintValidatorFactory();
+    this.constraintValidatorFactory = configConstraintValidatorFactory != null ?
+        configConstraintValidatorFactory : 
+        GWT.<ConstraintValidatorFactory>create(ConstraintValidatorFactory.class);
+    TraversableResolver configTraversableResolver = configState.getTraversableResolver();
+    this.traversableResolver = configTraversableResolver != null ?
+        configTraversableResolver : GWT.<TraversableResolver>create(TraversableResolver.class);
+    MessageInterpolator configMessageInterpolator = configState.getMessageInterpolator();
+    this.messageInterpolator = configMessageInterpolator != null ?
+        configMessageInterpolator : new GwtMessageInterpolator();
+  }
+
+  @Override
   public final <T> T unwrap(Class<T> type) {
     // TODO(nchalko) implement
     return null;
   }
 
+  @Override
   public final ValidatorContext usingContext() {
     return new GwtValidatorContext(this);
   }
diff --git a/user/src/com/google/gwt/validation/client/Group.java b/user/src/com/google/gwt/validation/client/Group.java
new file mode 100644
index 0000000..8bfbce2
--- /dev/null
+++ b/user/src/com/google/gwt/validation/client/Group.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.client;
+
+import javax.validation.groups.Default;
+
+/**
+ * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
+ * production code.
+ * <p>
+ * Encapsulates a single validation group.
+ * <p>
+ * Modified from the Hibernate validator for use with GWT.
+ */
+public class Group {
+  /**
+   * The actual group.
+   */
+  private final Class<?> group;
+
+  /**
+   * The sequence the group is part of ({@code null}, if this group is not part of a sequence).
+   */
+  private final Class<?> sequence;
+
+  /**
+   * Creates a group that is not part of a sequence with no parents.
+   * @param group The validation group.
+   */
+  public Group(Class<?> group) {
+    this(group, null);
+  }
+
+  /**
+   * Creates a group that is part of a sequence with no parents.
+   * @param group The validation group. Must not be null.
+   * @param sequence The sequence the group is a part of. Can be null if the group is not part of
+   * a sequence.
+   */
+  public Group(Class<?> group, Class<?> sequence) {
+    if (group == null) {
+      throw new IllegalArgumentException("The group class must not be null");
+    }
+    this.group = group;
+    this.sequence = sequence;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof Group)) {
+      return false;
+    }
+    Group other = (Group) o;
+    return group.equals(other.group);
+  }
+
+  public Class<?> getGroup() {
+    return group;
+  }
+
+  public Class<?> getSequence() {
+    return sequence;
+  }
+
+  @Override
+  public int hashCode() {
+    return group.hashCode();
+  }
+
+  public boolean isDefaultGroup() {
+    return getGroup().getName().equals(Default.class.getName());
+  }
+
+  @Override
+  public String toString() {
+    return "Group{" + "group=" + group.getName() + "}";
+  }
+}
diff --git a/user/src/com/google/gwt/validation/client/GroupChain.java b/user/src/com/google/gwt/validation/client/GroupChain.java
new file mode 100644
index 0000000..f379afc
--- /dev/null
+++ b/user/src/com/google/gwt/validation/client/GroupChain.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.client;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.validation.GroupDefinitionException;
+import javax.validation.groups.Default;
+
+/**
+ * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
+ * production code.
+ * <p>
+ * An instance of {@code GroupChain} defines the group order during one full validation call.
+ * <p>
+ * Modified from the Hibernate validator for use with GWT.
+ */
+public final class GroupChain {
+
+  /**
+   * The list of single groups to be used this validation.
+   */
+  private final List<Group> groupList = new ArrayList<Group>();
+
+  /**
+   * The different sequences for this validation. The map contains the list of groups mapped to
+   * their sequence name.
+   */
+  private final Map<Class<?>, List<Group>> sequenceMap = new HashMap<Class<?>, List<Group>>();
+
+  public void checkDefaultGroupSequenceIsExpandable(List<Class<?>> defaultGroupSequence)
+      throws GroupDefinitionException {
+    for (Map.Entry<Class<?>, List<Group>> entry : sequenceMap.entrySet()) {
+      Class<?> sequence = entry.getKey();
+      List<Group> groups = entry.getValue();
+      List<Group> defaultGroupList = buildTempGroupList(defaultGroupSequence, sequence);
+      int defaultGroupIndex = containsDefaultGroupAtIndex(sequence, groups);
+      if (defaultGroupIndex != -1) {
+        ensureDefaultGroupSequenceIsExpandable(groups, defaultGroupList, defaultGroupIndex);
+      }
+    }
+  }
+
+  public Collection<Group> getAllGroups() {
+    return groupList;
+  }
+
+  public Iterator<Group> getGroupIterator() {
+    return groupList.iterator();
+  }
+
+  public Iterator<List<Group>> getSequenceIterator() {
+    return sequenceMap.values().iterator();
+  }
+
+  public void insertGroup(Group group) {
+    if (!groupList.contains(group)) {
+      groupList.add(group);
+    }
+  }
+
+  public void insertSequence(List<Group> groups) {
+    if (groups != null && groups.size() != 0) {
+      if (!sequenceMap.containsValue(groups)) {
+        sequenceMap.put(groups.get(0).getSequence(), groups);
+      }
+    }
+  }
+
+  @Override
+  public String toString() {
+    return "GroupChain{" +
+        "groupList=" + groupList +
+        ", sequenceMap=" + sequenceMap +
+        "}";
+  }
+
+  private List<Group> buildTempGroupList(List<Class<?>> defaultGroupSequence, Class<?> sequence) {
+    List<Group> groups = new ArrayList<Group>();
+    for (Class<?> clazz : defaultGroupSequence) {
+      Group g = new Group(clazz, sequence);
+      groups.add(g);
+    }
+    return groups;
+  }
+
+  private int containsDefaultGroupAtIndex(Class<?> sequence, List<Group> groupList) {
+    Group defaultGroup = new Group(Default.class, sequence);
+    return groupList.indexOf(defaultGroup);
+  }
+
+  private void ensureDefaultGroupSequenceIsExpandable(List<Group> groupList,
+      List<Group> defaultGroupList, int defaultGroupIndex) throws GroupDefinitionException {
+    for (int i = 0; i < defaultGroupList.size(); i++) {
+      Group group = defaultGroupList.get(i);
+      if (group.getGroup().equals(Default.class)) {
+        // we don't have to consider the default group since it is the one we want to replace
+        continue;
+      }
+      // check whether the sequence contains group of the default group sequence
+      int index = groupList.indexOf(group);
+      if (index == -1) {
+        continue; // if the group is not in the sequence we can continue
+      }
+
+      if ((i == 0 && index == defaultGroupIndex - 1)
+          || (i == defaultGroupList.size() - 1 && index == defaultGroupIndex + 1)) {
+        // if we are at the beginning or end of he defaultGroupSequence and the matches are either
+        // directly before resp after we can continue as well, since we basically have two groups
+        continue;
+      }
+      throw new GroupDefinitionException("Unable to expand default group list " + defaultGroupList +
+          " into sequence " + groupList);
+    }
+  }
+}
diff --git a/user/src/com/google/gwt/validation/client/GroupChainGenerator.java b/user/src/com/google/gwt/validation/client/GroupChainGenerator.java
new file mode 100644
index 0000000..c312cc1
--- /dev/null
+++ b/user/src/com/google/gwt/validation/client/GroupChainGenerator.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.client;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.validation.GroupDefinitionException;
+import javax.validation.ValidationException;
+
+/**
+ * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
+ * production code.
+ * <p>
+ * Helper class used to resolve groups and sequences into a single chain of groups which can then be validated.
+ * <p>
+ * Modified from the Hibernate validator for use with GWT.
+ */
+public class GroupChainGenerator {
+  private final ValidationGroupsMetadata validationGroupsMetadata;
+
+  private final Map<Class<?>, List<Group>> resolvedSequences = new HashMap<Class<?>, List<Group>>();
+
+  public GroupChainGenerator(ValidationGroupsMetadata validationGroupsMetadata) {
+    this.validationGroupsMetadata = validationGroupsMetadata;
+  }
+
+  /**
+   * Generates a chain of groups to be validated given the specified validation groups.
+   *
+   * @param groups The groups specified at the validation call.
+   *
+   * @return an instance of {@code GroupChain} defining the order in which validation has to occur.
+   */
+  public GroupChain getGroupChainFor(Collection<Class<?>> groups) {
+    if (groups == null || groups.size() == 0) {
+      throw new IllegalArgumentException("At least one group has to be specified.");
+    }
+
+    for (Class<?> clazz : groups) {
+      if (!validationGroupsMetadata.containsGroup(clazz)
+          && !validationGroupsMetadata.isSeqeuence(clazz)) {
+        throw new ValidationException("The class " + clazz + " is not a valid group or sequence.");
+      }
+    }
+
+    GroupChain chain = new GroupChain();
+    for (Class<?> clazz : groups) {
+      if (isGroupSequence(clazz)) {
+        insertSequence(clazz, chain);
+      }
+      else {
+        Group group = new Group(clazz);
+        chain.insertGroup(group);
+        insertInheritedGroups(clazz, chain);
+      }
+    }
+
+    return chain;
+  }
+
+  @Override
+  public String toString() {
+    final StringBuilder sb = new StringBuilder();
+    sb.append("GroupChainGenerator");
+    sb.append("{resolvedSequences=").append(resolvedSequences);
+    sb.append('}');
+    return sb.toString();
+  }
+
+  private void addGroups(List<Group> resolvedGroupSequence, List<Group> groups) {
+    for (Group tmpGroup : groups) {
+      if (resolvedGroupSequence.contains(tmpGroup)
+          && resolvedGroupSequence.indexOf(tmpGroup) < resolvedGroupSequence.size() - 1) {
+        throw new GroupDefinitionException("Unable to expand group sequence.");
+      }
+      resolvedGroupSequence.add(tmpGroup);
+    }
+  }
+
+  private void addInheritedGroups(Group group, List<Group> expandedGroups) {
+    Set<Class<?>> inheritedGroups = validationGroupsMetadata.getParentsOfGroup(group.getGroup());
+    if (inheritedGroups != null) {
+      for (Class<?> inheritedGroup : inheritedGroups) {
+        if (isGroupSequence(inheritedGroup)) {
+          throw new GroupDefinitionException("Sequence definitions are not allowed as composing " +
+              "parts of a sequence.");
+        }
+        Group g = new Group(inheritedGroup, group.getSequence());
+        expandedGroups.add(g);
+        addInheritedGroups(g, expandedGroups);
+      }
+    }
+  }
+
+  private List<Group> expandInhertitedGroups(List<Group> sequence) {
+    List<Group> expandedGroup = new ArrayList<Group>();
+    for (Group group : sequence) {
+      expandedGroup.add(group);
+      addInheritedGroups(group, expandedGroup);
+    }
+    return expandedGroup;
+  }
+
+  /**
+   * Recursively add inherited groups into the group chain.
+   *
+   * @param clazz The group interface
+   * @param chain The group chain we are currently building.
+   */
+  private void insertInheritedGroups(Class<?> clazz, GroupChain chain) {
+    for (Class<?> inheritedGroup : validationGroupsMetadata.getParentsOfGroup(clazz)) {
+      Group group = new Group(inheritedGroup);
+      chain.insertGroup(group);
+      insertInheritedGroups(inheritedGroup, chain);
+    }
+  }
+
+  private void insertSequence(Class<?> clazz, GroupChain chain) {
+    List<Group> sequence;
+    if (resolvedSequences.containsKey(clazz)) {
+      sequence = resolvedSequences.get(clazz);
+    } else {
+      sequence = resolveSequence(clazz, new ArrayList<Class<?>>());
+      // we expand the inherited groups only after we determined whether the sequence is expandable
+      sequence = expandInhertitedGroups(sequence);
+    }
+    chain.insertSequence(sequence);
+  }
+
+  private boolean isGroupSequence(Class<?> clazz) {
+    return validationGroupsMetadata.isSeqeuence(clazz);
+  }
+
+  private List<Group> resolveSequence(Class<?> group, List<Class<?>> processedSequences) {
+    if (processedSequences.contains(group)) {
+      throw new GroupDefinitionException("Cyclic dependency in groups definition");
+    } else {
+      processedSequences.add(group);
+    }
+    List<Group> resolvedGroupSequence = new ArrayList<Group>();
+    List<Class<?>> sequenceList = validationGroupsMetadata.getSequenceList(group);
+    for (Class<?> clazz : sequenceList ) {
+      if (isGroupSequence(clazz)) {
+        List<Group> tmpSequence = resolveSequence(clazz, processedSequences);
+        addGroups(resolvedGroupSequence, tmpSequence);
+      }
+      else {
+        List<Group> list = new ArrayList<Group>();
+        list.add(new Group(clazz, group));
+        addGroups(resolvedGroupSequence, list);
+      }
+    }
+    resolvedSequences.put(group, resolvedGroupSequence);
+    return resolvedGroupSequence;
+  }
+}
diff --git a/user/src/com/google/gwt/validation/client/GroupInheritanceMap.java b/user/src/com/google/gwt/validation/client/GroupInheritanceMap.java
deleted file mode 100644
index f517670..0000000
--- a/user/src/com/google/gwt/validation/client/GroupInheritanceMap.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright 2012 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.validation.client;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.Stack;
-
-import javax.validation.groups.Default;
-
-
-/**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
- * Contains all the information known about the inheritance information for validation groups.
- */
-public class GroupInheritanceMap {
-
-  /**
-   * Builder for {@link GroupInheritanceMap}
-   */
-  public static class Builder {
-    Map<Class<?>, Set<Class<?>>> mapping;
-
-    private Builder() {
-      mapping = new HashMap<Class<?>, Set<Class<?>>>();
-      addGroup(Default.class);
-    }
-
-    /**
-     * Adds a group to the inheritance map. May optionally include parents of the group.
-     * @param group The validation group to add.
-     * @param parents A list of validation groups which {@code group} extends. Can be empty if the
-     * group contains no parents.
-     */
-    public Builder addGroup(Class<?> group, Class<?>... parents) {
-      mapping.put(group, new HashSet<Class<?>>(Arrays.asList(parents)));
-      return this;
-    }
-    
-    public GroupInheritanceMap build() {
-      return new GroupInheritanceMap(mapping);
-    }
-  }
-
-  /**
-   * Creates a builder populated only with the {@link Default} group.
-   */
-  public static Builder builder() {
-    return new Builder();
-  }
-
-  private final Map<Class<?>, Set<Class<?>>> mapping;
-
-  private GroupInheritanceMap(Map<Class<?>, Set<Class<?>>> mapping) {
-    this.mapping = Collections.unmodifiableMap(mapping);
-  }
-
-  /**
-   * Checks if a given group has been added to the map.
-   */
-  public boolean containsGroup(Class<?> group) {
-    return mapping.containsKey(group);
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    if (this == other) {
-      return true;
-    }
-    if (!(other instanceof GroupInheritanceMap)) {
-      return false;
-    }
-    GroupInheritanceMap otherObj = (GroupInheritanceMap)other;
-    return mapping.equals(otherObj.mapping);
-  }
-
-  /**
-   * Finds all of the validation groups extended by an intial set of groups.
-   * @param baseGroups The initial set of groups to find parents of. These groups must have been 
-   * added to the inheritance map already.
-   * @return A unified set of groups and their parents.
-   * @throws IllegalArgumentException If an initial group has not been added to the map before
-   * calling this method.
-   */
-  public Set<Class<?>> findAllExtendedGroups(Collection<Class<?>> baseGroups)
-      throws IllegalArgumentException {
-    Set<Class<?>> found = new HashSet<Class<?>>();
-    Stack<Class<?>> remaining = new Stack<Class<?>>();
-    // initialize
-    for (Class<?> group : baseGroups) {
-      if (!mapping.containsKey(group)) {
-        throw new IllegalArgumentException("The collection of groups contains a group which" +
-            " was not added to the map. Be sure to call addGroup() for all groups first.");
-      }
-      remaining.push(group);
-    }
-    // traverse
-    Class<?> current;
-    Set<Class<?>> superInterfaces;
-    while (!remaining.isEmpty()) {
-      current = remaining.pop();
-      found.add(current);
-      superInterfaces = mapping.get(current);
-      for (Class<?> parent : superInterfaces) {
-        if (!found.contains(parent)) {
-          remaining.push(parent);
-        }
-      }
-    }
-    return found;
-  }
-
-  /**
-   * Recursively gets all of the groups in the map (children and parents alike) in one flat set.
-   */
-  public Set<Class<?>> getAllGroups() {
-    Set<Class<?>> allGroups = new HashSet<Class<?>>();
-    for (Map.Entry<Class<?>, Set<Class<?>>> entry : mapping.entrySet()) {
-      allGroups.add(entry.getKey());
-      allGroups.addAll(entry.getValue());
-    }
-    return allGroups;
-  }
-
-  /**
-   * If the group has been added to the map then its parent groups (of one level above) are
-   * retrieved. Otherwise null is returned.
-   * 
-   * @see #containsGroup(Class)
-   * @see #findAllExtendedGroups(Collection)
-   */
-  public Set<Class<?>> getParentsOfGroup(Class<?> group) {
-    return mapping.get(group);
-  }
-
-  /**
-   * Returns all of the groups added to the map (but not their parents).
-   */
-  public Set<Class<?>> getRootGroups() {
-    return mapping.keySet();
-  }
-
-  @Override
-  public int hashCode() {
-    return mapping.hashCode();
-  }
-
-  public boolean isEmpty() {
-    return mapping.isEmpty();
-  }
-
-  @Override
-  public String toString() {
-    return mapping.toString();
-  }
-}
diff --git a/user/src/com/google/gwt/validation/client/GroupValidator.java b/user/src/com/google/gwt/validation/client/GroupValidator.java
new file mode 100644
index 0000000..bd73947
--- /dev/null
+++ b/user/src/com/google/gwt/validation/client/GroupValidator.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.client;
+
+import com.google.gwt.validation.client.impl.GwtValidationContext;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+
+/**
+ * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
+ * production code.
+ * <p>
+ * Does shallow group-specific validation. Group sequences and Default group overriding are not
+ * directly supported by implementations of this interface. Instead, this is used by higher-level
+ * validators to delegate the validation of specific areas.
+ * 
+ */
+public interface GroupValidator {
+
+  /**
+   * Validates the given group(s) (may not include group sequences)
+   * and adds any violations to the set.
+   */
+  <T> void validateGroups(GwtValidationContext<T> context, //
+      Set<ConstraintViolation<T>> violations, Group... groups);
+}
diff --git a/user/src/com/google/gwt/validation/client/GwtConstraintValidatorFactory.java b/user/src/com/google/gwt/validation/client/GwtConstraintValidatorFactory.java
index 3e1a8c4..cdaeab2 100644
--- a/user/src/com/google/gwt/validation/client/GwtConstraintValidatorFactory.java
+++ b/user/src/com/google/gwt/validation/client/GwtConstraintValidatorFactory.java
@@ -18,28 +18,12 @@
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintValidatorFactory;
 
-/*
- * Copyright 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
 /**
  * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
  * production code.
  * <p>
  * GWT does not support {@link ConstraintValidatorFactory} use
- * {@link com.google.gwt.core.client.GWT;#create(Class)} instead. Using this
+ * {@link com.google.gwt.core.client.GWT#create(Class) GWT.create(Class)} instead. Using this
  * class throws a {@link UnsupportedOperationException}.
  */
 public final class GwtConstraintValidatorFactory implements
@@ -50,6 +34,7 @@
    * 
    * @throws UnsupportedOperationException
    */
+  @Override
   public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) {
     throw new UnsupportedOperationException("GWT does not support "
         + ConstraintValidatorFactory.class.getName()
diff --git a/user/src/com/google/gwt/validation/client/ValidationGroupsMetadata.java b/user/src/com/google/gwt/validation/client/ValidationGroupsMetadata.java
new file mode 100644
index 0000000..bd3d803
--- /dev/null
+++ b/user/src/com/google/gwt/validation/client/ValidationGroupsMetadata.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.client;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.Stack;
+
+import javax.validation.groups.Default;
+
+
+/**
+ * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
+ * production code.
+ * <p>
+ * Contains all the information known about the inheritance information for validation groups.
+ */
+public class ValidationGroupsMetadata {
+
+  /**
+   * Builder for {@link ValidationGroupsMetadata}
+   */
+  public static class Builder {
+    private final Map<Class<?>, Set<Class<?>>> inheritanceinheritanceMap;
+    private final Map<Class<?>, List<Class<?>>> sequenceMap;
+
+    private Builder() {
+      inheritanceinheritanceMap = new HashMap<Class<?>, Set<Class<?>>>();
+      sequenceMap = new HashMap<Class<?>, List<Class<?>>>();
+      addGroup(Default.class);
+    }
+
+    /**
+     * Adds a group to the inheritance map. May optionally include parents of the group.
+     * @param group The validation group to add.
+     * @param parents A list of validation groups which {@code group} extends. Can be empty if the
+     * group contains no parents.
+     */
+    public Builder addGroup(Class<?> group, Class<?>... parents) {
+      inheritanceinheritanceMap.put(group, new HashSet<Class<?>>(Arrays.asList(parents)));
+      return this;
+    }
+
+    /**
+     * Adds a group sequence to the sequence map.
+     * @param groupSequence The class representing the sequence (annotated with &#064;GroupSequence)
+     * @param sequenceGroups The groups in the sequence.
+     */
+    public Builder addSequence(Class<?> groupSequence, Class<?>... sequenceGroups) {
+      sequenceMap.put(groupSequence, Arrays.asList(sequenceGroups));
+      return this;
+    }
+    
+    public ValidationGroupsMetadata build() {
+      return new ValidationGroupsMetadata(inheritanceinheritanceMap, sequenceMap);
+    }
+  }
+
+  /**
+   * Creates a builder populated only with the {@link Default} group.
+   */
+  public static Builder builder() {
+    return new Builder();
+  }
+
+  private final Map<Class<?>, Set<Class<?>>> inheritanceMapping;
+  private final Map<Class<?>, List<Class<?>>> sequenceMapping;
+
+  private ValidationGroupsMetadata(Map<Class<?>, Set<Class<?>>> inheritanceinheritanceMap,
+      Map<Class<?>, List<Class<?>>> sequenceMap) {
+    this.inheritanceMapping = Collections.unmodifiableMap(inheritanceinheritanceMap);
+    this.sequenceMapping = Collections.unmodifiableMap(sequenceMap);
+  }
+
+  /**
+   * Checks if a given group has been added to the inheritance map.
+   */
+  public boolean containsGroup(Class<?> group) {
+    return inheritanceMapping.containsKey(group);
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (this == other) {
+      return true;
+    }
+    if (!(other instanceof ValidationGroupsMetadata)) {
+      return false;
+    }
+    ValidationGroupsMetadata otherObj = (ValidationGroupsMetadata)other;
+    return inheritanceMapping.equals(otherObj.inheritanceMapping)
+        && sequenceMapping.equals(otherObj.sequenceMapping);
+  }
+
+  /**
+   * Finds all of the validation groups extended by an intial set of groups.
+   * @param baseGroups The initial set of groups to find parents of. These groups must have been 
+   * added to the inheritance map already.
+   * @return A unified set of groups and their parents.
+   * @throws IllegalArgumentException If an initial group has not been added to the map before
+   * calling this method.
+   */
+  public Set<Class<?>> findAllExtendedGroups(Collection<Class<?>> baseGroups)
+      throws IllegalArgumentException {
+    Set<Class<?>> found = new HashSet<Class<?>>();
+    Stack<Class<?>> remaining = new Stack<Class<?>>();
+    // initialize
+    for (Class<?> group : baseGroups) {
+      if (!inheritanceMapping.containsKey(group)) {
+        throw new IllegalArgumentException("The collection of groups contains a group which" +
+            " was not added to the map. Be sure to call addGroup() for all groups first.");
+      }
+      remaining.push(group);
+    }
+    // traverse
+    Class<?> current;
+    Set<Class<?>> superInterfaces;
+    while (!remaining.isEmpty()) {
+      current = remaining.pop();
+      found.add(current);
+      superInterfaces = inheritanceMapping.get(current);
+      for (Class<?> parent : superInterfaces) {
+        if (!found.contains(parent)) {
+          remaining.push(parent);
+        }
+      }
+    }
+    return found;
+  }
+
+  /**
+   * Recursively gets all of the groups and sequence groups in the map (children and parents alike)
+   * in one flat set.
+   */
+  public Set<Class<?>> getAllGroupsAndSequences() {
+    Set<Class<?>> allGroups = new HashSet<Class<?>>();
+    for (Map.Entry<Class<?>, Set<Class<?>>> entry : inheritanceMapping.entrySet()) {
+      allGroups.add(entry.getKey());
+      allGroups.addAll(entry.getValue());
+    }
+    allGroups.addAll(sequenceMapping.keySet());
+    return allGroups;
+  }
+
+  /**
+   * Returns all the known group sequence classes.
+   */
+  public Set<Class<?>> getGroupSequences() {
+    return sequenceMapping.keySet();
+  }
+
+  /**
+   * If the group has been added to the map then its parent groups (of one level above) are
+   * retrieved. Otherwise null is returned.
+   * 
+   * @see #containsGroup(Class)
+   * @see #findAllExtendedGroups(Collection)
+   */
+  public Set<Class<?>> getParentsOfGroup(Class<?> group) {
+    return inheritanceMapping.get(group);
+  }
+
+  /**
+   * Returns all of the groups added to the map (but not their parents).
+   */
+  public Set<Class<?>> getRootGroups() {
+    return inheritanceMapping.keySet();
+  }
+
+  /**
+   * If the sequence class has been added to the map then the actual sequence list is retrieved.
+   * Otherwise null is returned.
+   */
+  public List<Class<?>> getSequenceList(Class<?> sequence) {
+    return sequenceMapping.get(sequence);
+  }
+
+  @Override
+  public int hashCode() {
+    int result = inheritanceMapping.hashCode();
+    result = 31 * result + sequenceMapping.hashCode();
+    return result;
+  }
+
+  /**
+   * Checks if a group extends other groups (has parents).
+   */
+  public boolean hasParents(Class<?> group) {
+    Set<Class<?>> possibleParents = getParentsOfGroup(group);
+    return possibleParents != null && !possibleParents.isEmpty();
+  }
+
+  public boolean isInheritanceMapEmpty() {
+    return inheritanceMapping.isEmpty();
+  }
+
+  /**
+   * Checks if a given class is a group sequence map.
+   */
+  public boolean isSeqeuence(Class<?> sequence) {
+    return sequenceMapping.containsKey(sequence);
+  }
+
+  public boolean isSequenceMapEmpty() {
+    return sequenceMapping.isEmpty();
+  }
+
+  @Override
+  public String toString() {
+    return "ValidationGroupsMetaData{inheritanceMap=" + inheritanceMapping + ", " +
+        "sequenceMap=" + sequenceMapping + "}";
+  }
+}
diff --git a/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java b/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java
index 4dbc1b4..0b380c4 100644
--- a/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java
+++ b/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java
@@ -15,19 +15,28 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.GroupInheritanceMap;
+import com.google.gwt.validation.client.Group;
+import com.google.gwt.validation.client.GroupChain;
+import com.google.gwt.validation.client.GroupChainGenerator;
+import com.google.gwt.validation.client.GroupValidator;
+import com.google.gwt.validation.client.ValidationGroupsMetadata;
 
 import java.lang.annotation.Annotation;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintViolation;
 import javax.validation.MessageInterpolator;
+import javax.validation.ValidationException;
 import javax.validation.groups.Default;
 
 /**
@@ -68,9 +77,85 @@
     return new AttributeBuilder();
   }
 
-  protected Class<?>[] addDefaultGroupWhenEmpty(Class<?>[] groups) {
-    if (groups.length == 0) {
-      groups = new Class<?>[]{Default.class};
+  protected static Class<?>[] groupsToClasses(Group... groups) {
+    int numGroups = groups.length;
+    Class<?>[] array = new Class<?>[numGroups];
+    for (int i = 0; i < numGroups; i++) {
+      array[i] = groups[i].getGroup();
+    }
+    return array;
+  }
+
+  @Override
+  public <T> Set<ConstraintViolation<T>> validate(
+      GwtValidationContext<T> context,
+      G object,
+      Class<?>... groups) {
+    context.addValidatedObject(object);
+    try {
+      GroupValidator classGroupValidator = new ClassGroupValidator(object);
+      GroupChain groupChain = createGroupChainFromGroups(context, groups);
+      BeanMetadata beanMetadata = getBeanMetadata();
+      List<Class<?>> defaultGroupSeq = beanMetadata.getDefaultGroupSequence();
+      if (beanMetadata.defaultGroupSequenceIsRedefined()) {
+        // only need to check this on class-level validation
+        groupChain.checkDefaultGroupSequenceIsExpandable(defaultGroupSeq);
+      }
+      return validateGroups(context, classGroupValidator, groupChain);
+    } catch (IllegalArgumentException e) {
+      throw e;
+    } catch (ValidationException e) {
+      throw e;
+    } catch (Exception e) {
+      throw new ValidationException("Error validating " + object.getClass(), e);
+    }
+  }
+
+  @Override
+  public <T> Set<ConstraintViolation<T>> validateProperty(
+      GwtValidationContext<T> context,
+      G object,
+      String propertyName,
+      Class<?>... groups) throws ValidationException {
+    try {
+      GroupValidator propertyGroupValidator = new PropertyGroupValidator(object, propertyName);
+      GroupChain groupChain = createGroupChainFromGroups(context, groups);
+      return validateGroups(context, propertyGroupValidator, groupChain);
+    } catch (IllegalArgumentException e) {
+      throw e;
+    } catch (ValidationException e) {
+      throw e;
+    } catch (Exception e) {
+      throw new ValidationException("Error validating property " + propertyName +
+          " of " + object.getClass(), e);
+    }
+  }
+
+  @Override
+  public <T> Set<ConstraintViolation<T>> validateValue(
+      GwtValidationContext<T> context,
+      Class<G> beanType,
+      String propertyName,
+      Object value,
+      Class<?>... groups) throws ValidationException {
+    try {
+      GroupValidator valueGroupValidator = new ValueGroupValidator(beanType, propertyName, value);
+      GroupChain groupChain = createGroupChainFromGroups(context, groups);
+      return validateGroups(context, valueGroupValidator, groupChain);
+    } catch (IllegalArgumentException e) {
+      throw e;
+    } catch (ValidationException e) {
+      throw e;
+    } catch (Exception e) {
+      throw new ValidationException("Error validating property " + propertyName +
+          " with value " + value + " of " + beanType, e);
+    }
+  }
+
+  protected List<Class<?>> addDefaultGroupWhenEmpty(List<Class<?>> groups) {
+    if (groups.isEmpty()) {
+      groups = new ArrayList<Class<?>>();
+      groups.add(Default.class);
     }
     return groups;
   }
@@ -95,19 +180,19 @@
   protected <A extends Annotation, T, V> boolean validate(
       GwtValidationContext<T> context, Set<ConstraintViolation<T>> violations,
       G object, V value, ConstraintValidator<A, ? super V> validator,
-      ConstraintDescriptorImpl<A> constraintDescriptor, Class<?>[] groups) {
+      ConstraintDescriptorImpl<A> constraintDescriptor, Class<?>... groups) {
     validator.initialize(constraintDescriptor.getAnnotation());
     ConstraintValidatorContextImpl<A, V> constraintValidatorContext =
         context.createConstraintValidatorContext(constraintDescriptor);
 
-    GroupInheritanceMap groupInheritanceMap = context.getValidator().getGroupInheritanceMap();
-    // check against the groups passed in as well as their parent (super) interfaces
-    Set<Class<?>> extendedGroups = groupInheritanceMap.findAllExtendedGroups(Arrays.asList(groups));
+    List<Class<?>> groupsList = Arrays.asList(groups);
+    ValidationGroupsMetadata validationGroupsMetadata =
+        context.getValidator().getValidationGroupsMetadata();
     Set<Class<?>> constraintGroups = constraintDescriptor.getGroups();
 
     // check groups requested are in the set of constraint groups (including the implicit group)
-    if (!containsAny(extendedGroups, constraintGroups)
-        && !Arrays.asList(groups).contains(getConstraints(groupInheritanceMap).getElementClass())) {
+    if (!containsAny(groupsList, constraintGroups)
+        && !groupsList.contains(getConstraints(validationGroupsMetadata).getElementClass())) {
       return false;
     }
 
@@ -171,4 +256,91 @@
         .build();
     return violation;
   }
+
+  private <T> GroupChain createGroupChainFromGroups(GwtValidationContext<T> context, Class<?>... groups) {
+    List<Class<?>> groupsList = addDefaultGroupWhenEmpty(Arrays.asList(groups));
+    ValidationGroupsMetadata validationGroupsMetadata =
+        context.getValidator().getValidationGroupsMetadata();
+    return new GroupChainGenerator(validationGroupsMetadata).getGroupChainFor(groupsList);
+  }
+
+  /**
+   * Performs the top-level validation using a helper {@link GroupValidator}. This takes
+   * group sequencing and Default group overriding into account.
+   */
+  private <T> Set<ConstraintViolation<T>> validateGroups(
+      GwtValidationContext<T> context,
+      GroupValidator groupValidator,
+      GroupChain groupChain) {
+
+    Set<ConstraintViolation<T>> violations = new HashSet<ConstraintViolation<T>>();
+
+    Collection<Group> allGroups = groupChain.getAllGroups();
+    Group[] allGroupsArray = allGroups.toArray(new Group[allGroups.size()]);
+    groupValidator.validateGroups(context, violations, allGroupsArray);
+
+    // handle sequences
+    Iterator<List<Group>> sequenceIterator = groupChain.getSequenceIterator();
+    while (sequenceIterator.hasNext()) {
+      List<Group> sequence = sequenceIterator.next();
+      for (Group group : sequence) {
+        int numberOfViolations = violations.size();
+        groupValidator.validateGroups(context, violations, group);
+        if (violations.size() > numberOfViolations) {
+          // stop processing when an error occurs
+          break;
+        }
+      }
+    }
+    return violations;
+  }
+
+  private class ClassGroupValidator implements GroupValidator {
+    private final G object;
+
+    public ClassGroupValidator(G object) {
+      this.object = object;
+    }
+
+    @Override
+    public <T> void validateGroups(GwtValidationContext<T> context,
+        Set<ConstraintViolation<T>> violations, Group... groups) {
+      expandDefaultAndValidateClassGroups(context, object, violations, groups);
+    }
+  }
+
+  private class PropertyGroupValidator implements GroupValidator {
+    private final G object;
+    private final String propertyName;
+
+    public PropertyGroupValidator(G object, String propertyName) {
+      this.object = object;
+      this.propertyName = propertyName;
+    }
+
+    @Override
+    public <T> void validateGroups(GwtValidationContext<T> context,
+        Set<ConstraintViolation<T>> violations, Group... groups) {
+      expandDefaultAndValidatePropertyGroups(context, object, propertyName, violations, groups);
+    }
+  }
+
+  private class ValueGroupValidator implements GroupValidator {
+    private final Class<G> beanType;
+    private final String propertyName;
+    private final Object value;
+
+    public ValueGroupValidator(Class<G> beanType, String propertyName, Object value) {
+      this.beanType = beanType;
+      this.propertyName = propertyName;
+      this.value = value;
+    }
+
+    @Override
+    public <T> void validateGroups(GwtValidationContext<T> context,
+        Set<ConstraintViolation<T>> violations, Group... groups) {
+      expandDefaultAndValidateValueGroups(context, beanType, propertyName, value, violations, //
+          groups);
+    }
+  }
 }
diff --git a/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java b/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java
index 0cdd850..664d4a8 100644
--- a/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java
+++ b/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java
@@ -15,9 +15,10 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.GroupInheritanceMap;
+import com.google.gwt.validation.client.ValidationGroupsMetadata;
 
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Set;
 
 import javax.validation.ConstraintValidatorFactory;
@@ -38,29 +39,29 @@
 public abstract class AbstractGwtValidator implements Validator {
 
   private final Set<Class<?>> validGroups;
-  private final GroupInheritanceMap groupInheritanceMap;
+  private final ValidationGroupsMetadata validationGroupsMetadata;
   private ConstraintValidatorFactory contraintValidatorFactory;
   private MessageInterpolator messageInterpolator;
   private TraversableResolver traversableResolver;
 
   /**
    * Creates a validator initialized with the default group inheritance map.
-   * @see #AbstractGwtValidator(GroupInheritanceMap)
+   * @see #AbstractGwtValidator(ValidationGroups)
    */
   public AbstractGwtValidator() {
-    this(GroupInheritanceMap.builder().build());
+    this(ValidationGroupsMetadata.builder().build());
   }
 
   /**
-   * @param groupInheritanceMap Map of groups to the groups' parents.
+   * @param validationGroupsMetadata Validation group metadata.
    */
-  public AbstractGwtValidator(GroupInheritanceMap groupInheritanceMap) {
-    validGroups = groupInheritanceMap.getAllGroups();
-    this.groupInheritanceMap = groupInheritanceMap;
+  public AbstractGwtValidator(ValidationGroupsMetadata validationGroupsMetadata) {
+    validGroups = validationGroupsMetadata.getAllGroupsAndSequences();
+    this.validationGroupsMetadata = validationGroupsMetadata;
   }
 
-  public GroupInheritanceMap getGroupInheritanceMap() {
-    return groupInheritanceMap;
+  public ValidationGroupsMetadata getValidationGroupsMetadata() {
+    return validationGroupsMetadata;
   }
 
   public void init(ConstraintValidatorFactory factory,
@@ -82,8 +83,12 @@
 
   protected void checkGroups(Class<?>... groups) {
     if (!validGroups.containsAll(Arrays.asList(groups))) {
+      HashSet<Class<?>> unknown = new HashSet<Class<?>>();
+      unknown.addAll(Arrays.asList(groups));
+      unknown.removeAll(validGroups);
       throw new IllegalArgumentException(this.getClass()
-          + " only processes the following groups " + validGroups);
+          + " only processes the following groups " + validGroups + ". "
+          + "The following groups could not be processed " + unknown);
     }
   }
 
diff --git a/user/src/com/google/gwt/validation/client/impl/BaseGwtConfiguration.java b/user/src/com/google/gwt/validation/client/impl/BaseGwtConfiguration.java
index 8a196a8..c7d00f9 100644
--- a/user/src/com/google/gwt/validation/client/impl/BaseGwtConfiguration.java
+++ b/user/src/com/google/gwt/validation/client/impl/BaseGwtConfiguration.java
@@ -19,13 +19,15 @@
 import com.google.gwt.validation.client.spi.GwtConfigurationState;
 import com.google.gwt.validation.client.spi.GwtValidationProvider;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.validation.Configuration;
 import javax.validation.ConstraintValidatorFactory;
 import javax.validation.MessageInterpolator;
 import javax.validation.TraversableResolver;
 import javax.validation.ValidatorFactory;
 import javax.validation.spi.BootstrapState;
-import javax.validation.spi.ConfigurationState;
 
 /**
  * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
@@ -38,6 +40,10 @@
 
   protected final GwtValidationProvider provider;
   protected final BootstrapState state;
+  protected final Map<String, String> properties = new HashMap<String, String>();
+  protected ConstraintValidatorFactory constraintValidatorFactory;
+  protected MessageInterpolator messageInterpolator;
+  protected TraversableResolver traversableResolver;
 
   public BaseGwtConfiguration(GwtValidationProvider gwtValidationProvider,
       BootstrapState state) {
@@ -45,48 +51,65 @@
     this.state = state;
   }
 
+  @Override
   public final BaseGwtConfiguration addProperty(String name, String value) {
-    // TODO(nchalko) implement.
+    properties.put(name, value);
     return this;
   }
 
+  @Override
   public final ValidatorFactory buildValidatorFactory() {
-    ConfigurationState configurationState = new GwtConfigurationState();
+    GwtConfigurationState configurationState = new GwtConfigurationState( //
+        constraintValidatorFactory, //
+        messageInterpolator, //
+        properties, //
+        traversableResolver);
     return provider.buildValidatorFactory(configurationState);
   }
 
+  /**
+   * <b>{@link ConstraintValidatorFactory} is unsupported in GWT.</b>
+   * Constraint validators are instead created using GWT.create- with no factory.
+   */
+  @Override
   public final BaseGwtConfiguration constraintValidatorFactory(
       ConstraintValidatorFactory constraintValidatorFactory) {
-    // TODO(nchalko) implement.
+    this.constraintValidatorFactory = constraintValidatorFactory;
     return this;
   }
 
+  @Override
   public final ConstraintValidatorFactory getDefaultConstraintValidatorFactory() {
     return GWT.create(ConstraintValidatorFactory.class);
   }
 
+  @Override
   public final MessageInterpolator getDefaultMessageInterpolator() {
     return GWT.create(MessageInterpolator.class);
   }
 
+  @Override
   public final TraversableResolver getDefaultTraversableResolver() {
     return GWT.create(TraversableResolver.class);
   }
 
+  @Override
   public final BaseGwtConfiguration ignoreXmlConfiguration() {
-    // TODO(nchalko) implement.
+    // Always ignore XML anyway
     return this;
   }
 
+  @Override
   public final BaseGwtConfiguration messageInterpolator(
       MessageInterpolator interpolator) {
-    // TODO(nchalko) implement.
+    this.messageInterpolator = interpolator;
     return this;
   }
 
+  @Override
   public final BaseGwtConfiguration traversableResolver(
       TraversableResolver resolver) {
-    // TODO(nchalko) implement.
+    this.traversableResolver = resolver;
     return this;
   }
 
diff --git a/user/src/com/google/gwt/validation/client/impl/BeanMetadata.java b/user/src/com/google/gwt/validation/client/impl/BeanMetadata.java
new file mode 100644
index 0000000..0aa177f
--- /dev/null
+++ b/user/src/com/google/gwt/validation/client/impl/BeanMetadata.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.client.impl;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.validation.groups.Default;
+
+/**
+ * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
+ * production code.
+ * <p>
+ * Describes information about a bean.
+ */
+public class BeanMetadata {
+  private final Class<?> beanClass;
+  private final List<Class<?>> defaultGroupSequence;
+  private final boolean defaultGroupSequenceRedefined;
+
+  public BeanMetadata(Class<?> beanClass, Class<?>... defaultGroupSequence) {
+    this.beanClass = beanClass;
+    this.defaultGroupSequence = Collections.unmodifiableList(Arrays.asList(defaultGroupSequence));
+    this.defaultGroupSequenceRedefined = !(defaultGroupSequence.length == 1 &&
+        defaultGroupSequence[0].equals(Default.class));
+  }
+
+  public boolean defaultGroupSequenceIsRedefined() {
+    return defaultGroupSequenceRedefined;
+  }
+
+  public Class<?> getBeanClass() {
+    return beanClass;
+  }
+
+  public List<Class<?>> getDefaultGroupSequence() {
+    return defaultGroupSequence;
+  }
+}
diff --git a/user/src/com/google/gwt/validation/client/impl/ConstraintFinderImpl.java b/user/src/com/google/gwt/validation/client/impl/ConstraintFinderImpl.java
index 1b6f3c9..30369c4 100644
--- a/user/src/com/google/gwt/validation/client/impl/ConstraintFinderImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/ConstraintFinderImpl.java
@@ -16,16 +16,21 @@
 package com.google.gwt.validation.client.impl;
 
 import com.google.gwt.validation.client.ConstraintOrigin;
-import com.google.gwt.validation.client.GroupInheritanceMap;
+import com.google.gwt.validation.client.Group;
+import com.google.gwt.validation.client.GroupChain;
+import com.google.gwt.validation.client.GroupChainGenerator;
+import com.google.gwt.validation.client.ValidationGroupsMetadata;
 
 import java.lang.annotation.ElementType;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
+import javax.validation.groups.Default;
 import javax.validation.metadata.ConstraintDescriptor;
 import javax.validation.metadata.Scope;
 import javax.validation.metadata.ElementDescriptor.ConstraintFinder;
@@ -37,15 +42,18 @@
  */
 public final class ConstraintFinderImpl implements ConstraintFinder {
   private Set<ConstraintDescriptorImpl<?>> constraintDescriptors;
-  private GroupInheritanceMap groupInheritanceMap;
+  private ValidationGroupsMetadata validationGroupsMetadata;
   private List<Class<?>> groups;
   private Set<ConstraintOrigin> definedInSet;
   private Set<ElementType> elementTypes;
+  private BeanMetadata beanMetadata;
 
-  public ConstraintFinderImpl(GroupInheritanceMap groupInheritanceMap, 
+  public ConstraintFinderImpl(BeanMetadata beanMetadata,
+      ValidationGroupsMetadata validationGroupsMetadata, 
       Set<ConstraintDescriptorImpl<?>> constraintDescriptors) {
-    this.groupInheritanceMap = groupInheritanceMap;
+    this.validationGroupsMetadata = validationGroupsMetadata;
     this.constraintDescriptors = constraintDescriptors;
+    this.beanMetadata = beanMetadata;
     elementTypes = new HashSet<ElementType>();
     elementTypes.add(ElementType.TYPE);
     elementTypes.add(ElementType.METHOD);
@@ -65,10 +73,11 @@
 
   @Override
   public Set<ConstraintDescriptor<?>> getConstraintDescriptors() {
-    if (groupInheritanceMap == null) {
-      // sanity check - this could be null if the caller does not set a group inheritance map first
+    if (validationGroupsMetadata == null) {
+      // sanity check - this could be null if the caller does not set group metadata first
       throw new IllegalStateException("ConstraintFinderImpl not initialized properly. A " +
-          "GroupInheritanceMap is required by GWT to properly find all constraint descriptors.");
+          "ValidationGroupsMetadata object is required by GWT to properly find all constraint " +
+          "descriptors.");
     }
     Set<ConstraintDescriptor<?>> matchingDescriptors = new HashSet<ConstraintDescriptor<?>>();
     findMatchingDescriptors(matchingDescriptors);
@@ -90,8 +99,15 @@
 
   @Override
   public ConstraintFinder unorderedAndMatchingGroups(Class<?>... groups) {
-    this.groups = new ArrayList<Class<?>>(groups.length);
-    Collections.addAll(this.groups, groups);
+    this.groups = new ArrayList<Class<?>>();
+    for (Class<?> clazz : groups) {
+      if (Default.class.equals(clazz) && beanMetadata.defaultGroupSequenceIsRedefined()) {
+        this.groups.addAll(beanMetadata.getDefaultGroupSequence());
+      }
+      else {
+        this.groups.add(clazz);
+      }
+    }
     return this;
   }
 
@@ -108,10 +124,12 @@
 
   private void findMatchingDescriptors(Set<ConstraintDescriptor<?>> matchingDescriptors) {
     if (!groups.isEmpty()) {
-      // TODO(idol) The group sequence ordering will play a part here
-      Set<Class<?>> extendedGroups = groupInheritanceMap.findAllExtendedGroups(groups);
-      for (Class<?> group : extendedGroups) {
-        addMatchingDescriptorsForGroup(group, matchingDescriptors);
+      GroupChain groupChain =
+          new GroupChainGenerator(validationGroupsMetadata).getGroupChainFor(groups);
+      Iterator<Group> groupIterator = groupChain.getGroupIterator();
+      while (groupIterator.hasNext()) {
+        Group g = groupIterator.next();
+        addMatchingDescriptorsForGroup(g.getGroup(), matchingDescriptors);
       }
     }
     else {
diff --git a/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptor.java b/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptor.java
index a6bd79c..e5560d7 100644
--- a/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptor.java
+++ b/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptor.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.GroupInheritanceMap;
+import com.google.gwt.validation.client.ValidationGroupsMetadata;
 
 import javax.validation.metadata.BeanDescriptor;
 
@@ -29,5 +29,5 @@
  * @param <T>
  */
 public interface GwtBeanDescriptor<T> extends BeanDescriptor {
-  void setGroupInheritanceMap(GroupInheritanceMap groupInheritanceMap);
+  void setValidationGroupsMetadata(ValidationGroupsMetadata validationGroupsMetadata);
 }
diff --git a/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptorImpl.java b/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptorImpl.java
index 55199d9..c17c433 100644
--- a/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptorImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptorImpl.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.GroupInheritanceMap;
+import com.google.gwt.validation.client.ValidationGroupsMetadata;
 
 import java.lang.annotation.Annotation;
 import java.util.Collection;
@@ -52,6 +52,7 @@
     private final Set<ConstraintDescriptorImpl<? extends Annotation>> constraints =
         new HashSet<ConstraintDescriptorImpl<? extends Annotation>>();
     private boolean isConstrained;
+    private BeanMetadata beanMetadata;
 
     private Builder(Class<T> clazz) {
       this.clazz = clazz;
@@ -64,7 +65,7 @@
     }
 
     public GwtBeanDescriptorImpl<T> build() {
-      return new GwtBeanDescriptorImpl<T>(clazz, isConstrained, descriptorMap,
+      return new GwtBeanDescriptorImpl<T>(clazz, isConstrained, descriptorMap, beanMetadata,
           constraints);
     }
 
@@ -73,6 +74,11 @@
       return this;
     }
 
+    public Builder<T> setBeanMetadata(BeanMetadata beanMetadata) {
+      this.beanMetadata = beanMetadata;
+      return this;
+    }
+
     public Builder<T> setConstrained(boolean isConstrained) {
       this.isConstrained = isConstrained;
       return this;
@@ -88,44 +94,45 @@
 
   private final Map<String, PropertyDescriptorImpl> descriptorMap = new HashMap<String, PropertyDescriptorImpl>();
   private final boolean isBeanConstrained;
+
+  private final BeanMetadata beanMetadata;
   
-  private GroupInheritanceMap groupInheritanceMap;
+  private ValidationGroupsMetadata validationGroupsMetadata;
 
   private GwtBeanDescriptorImpl(Class<T> clazz, boolean isConstrained,
-      Map<String, PropertyDescriptorImpl> descriptorMap,
+      Map<String, PropertyDescriptorImpl> descriptorMap, BeanMetadata beanMetadata,
       Set<ConstraintDescriptorImpl<?>> constraints) {
-    super();
     this.clazz = clazz;
     this.isBeanConstrained = isConstrained;
+    this.beanMetadata = beanMetadata;
     this.descriptorMap.putAll(descriptorMap);
     this.constraints.addAll(constraints);
   }
 
   @Override
   public ConstraintFinder findConstraints() {
-    return new ConstraintFinderImpl(groupInheritanceMap, constraints);
+    return new ConstraintFinderImpl(beanMetadata, validationGroupsMetadata, constraints);
   }
 
   @Override
   public Set<PropertyDescriptor> getConstrainedProperties() {
     Collection<PropertyDescriptorImpl> props = descriptorMap.values();
     for (PropertyDescriptorImpl prop : props) {
-      prop.setGroupInheritanceMap(groupInheritanceMap);
+      prop.setValidationGroupsMetadata(validationGroupsMetadata);
     }
     return new HashSet<PropertyDescriptor>(props);
   }
 
   @Override
   public Set<ConstraintDescriptor<?>> getConstraintDescriptors() {
-    // Copy for safety
-    return new HashSet<ConstraintDescriptor<?>>(constraints);
+    return findConstraints().getConstraintDescriptors();
   }
 
   @Override
   public PropertyDescriptor getConstraintsForProperty(String propertyName) {
     PropertyDescriptorImpl propDesc = descriptorMap.get(propertyName);
     if (propDesc != null) {
-      propDesc.setGroupInheritanceMap(groupInheritanceMap);
+      propDesc.setValidationGroupsMetadata(validationGroupsMetadata);
     }
     return propDesc;
   }
@@ -146,8 +153,8 @@
   }
 
   @Override
-  public void setGroupInheritanceMap(GroupInheritanceMap groupInheritanceMap) {
+  public void setValidationGroupsMetadata(ValidationGroupsMetadata validationGroupsMetadata) {
     // TODO(idol) Find some way to pass this via the constructor rather than after creation
-    this.groupInheritanceMap = groupInheritanceMap;
+    this.validationGroupsMetadata = validationGroupsMetadata;
   }
 }
\ No newline at end of file
diff --git a/user/src/com/google/gwt/validation/client/impl/GwtSpecificValidator.java b/user/src/com/google/gwt/validation/client/impl/GwtSpecificValidator.java
index cdc42dd..b97bb7a 100644
--- a/user/src/com/google/gwt/validation/client/impl/GwtSpecificValidator.java
+++ b/user/src/com/google/gwt/validation/client/impl/GwtSpecificValidator.java
@@ -15,7 +15,8 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.GroupInheritanceMap;
+import com.google.gwt.validation.client.Group;
+import com.google.gwt.validation.client.ValidationGroupsMetadata;
 
 import java.util.Set;
 
@@ -34,18 +35,68 @@
 public interface GwtSpecificValidator<G> {
 
   /**
+   * Helper method used to first expand the Default group sequence and then 
+   * perform validation of a bean using the specific group(s).
+   * @param context GWT validation context.
+   * @param object Object being validated.
+   * @param violations Set of violations to add to.
+   * @param groups What group(s) to validate.
+   */
+  <T> void expandDefaultAndValidateClassGroups(
+      GwtValidationContext<T> context,
+      G object,
+      Set<ConstraintViolation<T>> violations,
+      Group... groups);
+
+  /**
+   * Helper method used to first expand the Default group sequence and then 
+   * perform validation of a bean using the specific group(s).
+   * @param context GWT validation context.
+   * @param object Object being validated.
+   * @param violations Set of violations to add to.
+   * @param groups What group(s) to validate.
+   */
+  <T> void expandDefaultAndValidatePropertyGroups(
+      GwtValidationContext<T> context,
+      G object,
+      String propertyName,
+      Set<ConstraintViolation<T>> violations,
+      Group... groups);
+
+  /**
+   * Helper method used to first expand the Default group sequence and then 
+   * perform validation of a bean using the specific group(s).
+   * @param context GWT validation context.
+   * @param object Object being validated.
+   * @param violations Set of violations to add to.
+   * @param groups What group(s) to validate.
+   */
+  <T> void expandDefaultAndValidateValueGroups(
+      GwtValidationContext<T> context,
+      Class<G> beanType,
+      String propertyName,
+      Object value,
+      Set<ConstraintViolation<T>> violations,
+      Group... groups);
+
+  /**
+   * @return The metadata for the bean class associated with this valdiator.
+   */
+  BeanMetadata getBeanMetadata();
+
+  /**
    * Return the descriptor object describing bean constraints. The returned
    * object (and associated objects including
    * <code>ConstraintDescriptor<code>s) are immutable.
    *
-   * @param groupInheritanceMap The group inheritance map for the validator.
+   * @param validationGroupsMetadata The validation groups metadata for the validator.
    * @return the bean descriptor for the class associated with this validator.
    *
    * @throws IllegalArgumentException if clazz is null
    * @throws ValidationException if a non recoverable error happens during the
    *           metadata discovery or if some constraints are invalid.
    */
-  GwtBeanDescriptor<G> getConstraints(GroupInheritanceMap groupInheritanceMap)
+  GwtBeanDescriptor<G> getConstraints(ValidationGroupsMetadata validationGroupsMetadata)
       throws ValidationException;
 
   /**
@@ -68,6 +119,20 @@
       G object, Class<?>... groups) throws ValidationException;
 
   /**
+   * Helper method used to perform validation of a bean using specific group(s). Does not expand
+   * the Default group seqeunce if it is redefined.
+   * @param context GWT validation context.
+   * @param object Object being validated.
+   * @param violations Set of violations to add to.
+   * @param groups What group(s) to validate.
+   */
+  <T> void validateClassGroups(
+      GwtValidationContext<T> context,
+      G object,
+      Set<ConstraintViolation<T>> violations,
+      Class<?>... groups);
+
+  /**
    * Validates all constraints placed on the property of <code>object</code>
    * named <code>propertyName</code>.
    *
@@ -91,6 +156,21 @@
       Class<?>... groups) throws ValidationException;
 
   /**
+   * Helper method used to perform validation of a bean property using specific group(s).
+   * @param context GWT validation context.
+   * @param object Object with property being validated.
+   * @param propertyName Name of property to validate.
+   * @param violations Set of violations to add to.
+   * @param groups What group(s) to validate.
+   */
+  <T> void validatePropertyGroups(
+      GwtValidationContext<T> context,
+      G object,
+      String propertyName,
+      Set<ConstraintViolation<T>> violations,
+      Class<?>... groups);
+
+  /**
    * Validates all constraints placed on the property named
    * <code>propertyName</code> of the class <code>beanType</code> where the
    * property value is <code>value</code>.
@@ -118,4 +198,22 @@
   <T> Set<ConstraintViolation<T>> validateValue(
       GwtValidationContext<T> context, Class<G> beanType, String propertyName,
       Object value, Class<?>... groups) throws ValidationException;
+
+  /**
+   * Helper method used to perform validation of a class property with a specified value
+   * using specific group(s).
+   * @param context GWT validation context.
+   * @param beanType Class with property being validated.
+   * @param propertyName Name of property to validate.
+   * @param value The value of the property to use.
+   * @param violations Set of violations to add to.
+   * @param groups What group(s) to validate.
+   */
+  <T> void validateValueGroups(
+      GwtValidationContext<T> context,
+      Class<G> beanType,
+      String propertyName,
+      Object value,
+      Set<ConstraintViolation<T>> violations,
+      Class<?>... groups);
 }
diff --git a/user/src/com/google/gwt/validation/client/impl/PropertyDescriptorImpl.java b/user/src/com/google/gwt/validation/client/impl/PropertyDescriptorImpl.java
index 310be32..77d72f8 100644
--- a/user/src/com/google/gwt/validation/client/impl/PropertyDescriptorImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/PropertyDescriptorImpl.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.GroupInheritanceMap;
+import com.google.gwt.validation.client.ValidationGroupsMetadata;
 
 import java.util.Arrays;
 import java.util.HashSet;
@@ -35,29 +35,33 @@
   private Set<ConstraintDescriptorImpl<?>> descriptors;
   private Class<?> elementClass;
   private String name;
-  private GroupInheritanceMap groupInheritanceMap;
+  private ValidationGroupsMetadata validationGroupsMetadata;
+  private BeanMetadata parentBeanMetadata;
 
   public PropertyDescriptorImpl(String name, Class<?> elementClass,
-      boolean cascaded, ConstraintDescriptorImpl<?>... descriptors) {
-    this(name, elementClass, cascaded, null, descriptors);
+      boolean cascaded, BeanMetadata parentBeanMetadata,
+      ConstraintDescriptorImpl<?>... descriptors) {
+    this(name, elementClass, cascaded, parentBeanMetadata, null, descriptors);
   }
 
   public PropertyDescriptorImpl(String name, Class<?> elementClass,
-      boolean cascaded, GroupInheritanceMap groupInheritanceMap,
+      boolean cascaded, BeanMetadata parentBeanMetadata,
+      ValidationGroupsMetadata validationGroupsMetadata,
       ConstraintDescriptorImpl<?>... descriptors) {
     super();
 
     this.elementClass = elementClass;
     this.cascaded = cascaded;
     this.name = name;
-    this.groupInheritanceMap = groupInheritanceMap;
+    this.validationGroupsMetadata = validationGroupsMetadata;
+    this.parentBeanMetadata = parentBeanMetadata;
     this.descriptors = new HashSet<ConstraintDescriptorImpl<?>>(
         Arrays.asList(descriptors));
   }
 
   @Override
   public ConstraintFinder findConstraints() {
-    return new ConstraintFinderImpl(groupInheritanceMap, descriptors);
+    return new ConstraintFinderImpl(parentBeanMetadata, validationGroupsMetadata, descriptors);
   }
 
   @Override
@@ -85,14 +89,20 @@
     return cascaded;
   }
 
-  public void setGroupInheritanceMap(GroupInheritanceMap groupInheritanceMap) {
+  public void setValidationGroupsMetadata(ValidationGroupsMetadata validationGroupsMetadata) {
     // TODO(idol) Find some way to pass this via the constructor rather than after creation
-    this.groupInheritanceMap = groupInheritanceMap;
+    this.validationGroupsMetadata = validationGroupsMetadata;
   }
 
   public PropertyDescriptorImpl shallowCopy() {
     ConstraintDescriptorImpl<?>[] desc = new ConstraintDescriptorImpl<?>[descriptors.size()];
     descriptors.toArray(desc);
-    return new PropertyDescriptorImpl(name, elementClass, cascaded, groupInheritanceMap, desc);
+    return new PropertyDescriptorImpl( // 
+        name, // 
+        elementClass, // 
+        cascaded, // 
+        parentBeanMetadata, // 
+        validationGroupsMetadata, // 
+        desc);
   }
 }
diff --git a/user/src/com/google/gwt/validation/client/spi/BaseConfigurationState.java b/user/src/com/google/gwt/validation/client/spi/BaseConfigurationState.java
index d9f259d..e28cb1b 100644
--- a/user/src/com/google/gwt/validation/client/spi/BaseConfigurationState.java
+++ b/user/src/com/google/gwt/validation/client/spi/BaseConfigurationState.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.validation.client.spi;
 
+import java.util.Collections;
 import java.util.Map;
 
 import javax.validation.ConstraintValidatorFactory;
@@ -28,28 +29,44 @@
  * <p>
  * Base GWT implementation of {@link ConfigurationState}.
  */
-abstract class BaseConfigurationState implements ConfigurationState {
+public abstract class BaseConfigurationState implements ConfigurationState {
+  private final ConstraintValidatorFactory constraintValidatorFactory;
+  private final MessageInterpolator messageInterpolator;
+  private final Map<String, String> properties;
+  private final TraversableResolver traversableResolver;
 
+  public BaseConfigurationState(
+      ConstraintValidatorFactory constraintValidatorFactory,
+      MessageInterpolator messageInterpolator,
+      Map<String, String> properties,
+      TraversableResolver traversableResolver) {
+    this.constraintValidatorFactory = constraintValidatorFactory;
+    this.messageInterpolator = messageInterpolator;
+    this.properties = Collections.unmodifiableMap(properties);
+    this.traversableResolver = traversableResolver;
+  }
+
+  @Override
   public ConstraintValidatorFactory getConstraintValidatorFactory() {
-    // TODO(nchalko) implement.
-    return null;
+    return constraintValidatorFactory;
   }
 
+  @Override
   public MessageInterpolator getMessageInterpolator() {
-    // TODO(nchalko) implement.
-    return null;
+    return messageInterpolator;
   }
 
+  @Override
   public Map<String, String> getProperties() {
-    // TODO(nchalko) implement.
-    return null;
+    return properties;
   }
 
+  @Override
   public TraversableResolver getTraversableResolver() {
-    // TODO(nchalko) implement.
-    return null;
+    return traversableResolver;
   }
 
+  @Override
   public boolean isIgnoreXmlConfiguration() {
     // Always ignore XML
     return false;
diff --git a/user/src/com/google/gwt/validation/client/spi/GwtConfigurationState.java b/user/src/com/google/gwt/validation/client/spi/GwtConfigurationState.java
index 7b4027a..1496001 100644
--- a/user/src/com/google/gwt/validation/client/spi/GwtConfigurationState.java
+++ b/user/src/com/google/gwt/validation/client/spi/GwtConfigurationState.java
@@ -16,8 +16,13 @@
 package com.google.gwt.validation.client.spi;
 
 import java.io.InputStream;
+import java.util.Map;
 import java.util.Set;
 
+import javax.validation.ConstraintValidatorFactory;
+import javax.validation.MessageInterpolator;
+import javax.validation.TraversableResolver;
+
 /**
  * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
  * production code.
@@ -26,6 +31,13 @@
  */
 public final class GwtConfigurationState extends BaseConfigurationState {
 
+  public GwtConfigurationState(ConstraintValidatorFactory constraintValidatorFactory,
+      MessageInterpolator messageInterpolator, Map<String, String> properties,
+      TraversableResolver traversableResolver) {
+    super(constraintValidatorFactory, messageInterpolator, properties, traversableResolver);
+  }
+
+  @Override
   public Set<InputStream> getMappingStreams() {
     throw new UnsupportedOperationException(
         "GWT Validation does not support getMappingStreams");
diff --git a/user/src/com/google/gwt/validation/client/spi/GwtValidationProvider.java b/user/src/com/google/gwt/validation/client/spi/GwtValidationProvider.java
index ecedd8e..ca24bf3 100644
--- a/user/src/com/google/gwt/validation/client/spi/GwtValidationProvider.java
+++ b/user/src/com/google/gwt/validation/client/spi/GwtValidationProvider.java
@@ -16,6 +16,7 @@
 package com.google.gwt.validation.client.spi;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.validation.client.AbstractGwtValidatorFactory;
 import com.google.gwt.validation.client.impl.BaseGwtConfiguration;
 import com.google.gwt.validation.client.impl.GwtConfiguration;
 
@@ -34,15 +35,20 @@
 public final class GwtValidationProvider implements
     ValidationProvider<BaseGwtConfiguration> {
 
-  public ValidatorFactory buildValidatorFactory(
-      ConfigurationState configurationState) {
-    return GWT.create(ValidatorFactory.class);
+  @Override
+  public ValidatorFactory buildValidatorFactory(ConfigurationState configurationState) {
+    AbstractGwtValidatorFactory validatorFactory =
+        (AbstractGwtValidatorFactory) GWT.create(ValidatorFactory.class);
+    validatorFactory.init(configurationState);
+    return validatorFactory;
   }
 
+  @Override
   public Configuration<?> createGenericConfiguration(BootstrapState state) {
     return new GwtConfiguration(this, state);
   }
 
+  @Override
   public GwtConfiguration createSpecializedConfiguration(BootstrapState state) {
     return new GwtConfiguration(this, state);
   }
diff --git a/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java b/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
index 1f349e3..d93b90f 100644
--- a/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
+++ b/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
@@ -26,7 +26,6 @@
 import com.google.gwt.core.ext.typeinfo.JMethod;
 import com.google.gwt.core.ext.typeinfo.JPrimitiveType;
 import com.google.gwt.core.ext.typeinfo.JType;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
 import com.google.gwt.dev.jjs.ast.JProgram;
 import com.google.gwt.thirdparty.guava.common.base.Function;
 import com.google.gwt.thirdparty.guava.common.base.Functions;
@@ -42,9 +41,13 @@
 import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
 import com.google.gwt.user.rebind.SourceWriter;
 import com.google.gwt.validation.client.ConstraintOrigin;
-import com.google.gwt.validation.client.GroupInheritanceMap;
+import com.google.gwt.validation.client.Group;
+import com.google.gwt.validation.client.GroupChain;
+import com.google.gwt.validation.client.GroupChainGenerator;
+import com.google.gwt.validation.client.ValidationGroupsMetadata;
 import com.google.gwt.validation.client.impl.AbstractGwtSpecificValidator;
 import com.google.gwt.validation.client.impl.ConstraintDescriptorImpl;
+import com.google.gwt.validation.client.impl.BeanMetadata;
 import com.google.gwt.validation.client.impl.GwtBeanDescriptor;
 import com.google.gwt.validation.client.impl.GwtBeanDescriptorImpl;
 import com.google.gwt.validation.client.impl.GwtValidationContext;
@@ -59,8 +62,11 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -69,6 +75,7 @@
 import javax.validation.Constraint;
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintViolation;
+import javax.validation.GroupSequence;
 import javax.validation.Payload;
 import javax.validation.UnexpectedTypeException;
 import javax.validation.Valid;
@@ -82,7 +89,7 @@
  * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
  * production code.
  * <p>
- * Creates a {@link com.google.gwt.validation.client.GwtSpecificValidator}.
+ * Creates a {@link com.google.gwt.validation.client.impl.GwtSpecificValidator}.
  * <p>
  * This class is not thread safe.
  */
@@ -100,6 +107,7 @@
   private static Function<java.beans.PropertyDescriptor, String>
       PROPERTY_DESCRIPTOR_TO_NAME =
           new Function<java.beans.PropertyDescriptor, String>() {
+    @Override
     public String apply(java.beans.PropertyDescriptor pd) {
       return pd.getName();
     }
@@ -107,6 +115,7 @@
 
   private static Function<Object, String> TO_LITERAL = new Function<Object, String>() {
 
+    @Override
     public String apply(Object input) {
       return asLiteral(input);
     }
@@ -121,7 +130,7 @@
    * Java Source code.
    *
    * <p>
-   * Supports all types that {@link Annotation) value can have.
+   * Supports all types that {@link Annotation} value can have.
    *
    *
    * @throws IllegalArgumentException if the type of the object does not have a java literal form.
@@ -261,6 +270,7 @@
 
     Predicate<Class<?>> inBest = new Predicate<Class<?>>() {
 
+      @Override
       public boolean apply(Class<?> key) {
         return best.contains(key);
       }
@@ -331,13 +341,10 @@
 
   private Set<JMethod> gettersToWrap = Sets.newHashSet();
 
-  private final TypeOracle oracle;
-
   public GwtSpecificValidatorCreator(JClassType validatorType,
       JClassType beanType, BeanHelper beanHelper, TreeLogger logger,
       GeneratorContext context) {
     super(context, logger, validatorType);
-    this.oracle = context.getTypeOracle();
     this.beanType = beanType;
     this.beanHelper = beanHelper;
   }
@@ -345,9 +352,10 @@
   @Override
   protected void compose(ClassSourceFileComposerFactory composerFactory) {
     addImports(composerFactory, Annotation.class, ConstraintViolation.class,
-        GWT.class, GroupInheritanceMap.class, GwtBeanDescriptor.class, GwtValidationContext.class,
-        HashSet.class, IllegalArgumentException.class, Set.class,
-        ValidationException.class);
+        GWT.class, ValidationGroupsMetadata.class, Group.class, GroupChain.class,
+        GroupChainGenerator.class, GwtBeanDescriptor.class, BeanMetadata.class, 
+        GwtValidationContext.class, ArrayList.class, HashSet.class, IllegalArgumentException.class,
+        Set.class, Collection.class, Iterator.class, List.class, ValidationException.class);
     composerFactory.setSuperclass(AbstractGwtSpecificValidator.class.getCanonicalName()
         + "<" + beanType.getQualifiedSourceName() + ">");
     composerFactory.addImplementedInterface(validatorType.getName());
@@ -358,16 +366,26 @@
       throws UnableToCompleteException {
     writeFields(sw);
     sw.println();
-    writeValidate(sw);
+    writeValidateClassGroups(sw);
     sw.println();
-    writeValidateProperty(sw);
+    writeExpandDefaultAndValidateClassGroups(sw);
     sw.println();
-    writeValidateValue(sw);
+    writeExpandDefaultAndValidatePropertyGroups(sw);
+    sw.println();
+    writeExpandDefaultAndValidateValueGroups(sw);
+    sw.println();
+    writeValidatePropertyGroups(sw);
+    sw.println();
+    writeValidateValueGroups(sw);
+    sw.println();
+    writeGetBeanMetadata(sw);
     sw.println();
     writeGetDescriptor(sw);
     sw.println();
     writePropertyValidators(sw);
     sw.println();
+    writeValidateAllNonInheritedProperties(sw);
+    sw.println();
 
     // Write the wrappers after we know which are needed
     writeWrappers(sw);
@@ -513,6 +531,7 @@
   private Predicate<PropertyDescriptor> newPropertyNameMatches(
       final PropertyDescriptor p) {
     return new Predicate<PropertyDescriptor>() {
+      @Override
       public boolean apply(PropertyDescriptor input) {
         return input.getPropertyName().equals(p.getPropertyName());
       }
@@ -523,10 +542,6 @@
     return "_" + field.getName();
   }
 
-  /**
-   * @param method
-   * @return
-   */
   private String toWrapperName(JMethod method) {
     return "_" + method.getName();
   }
@@ -573,6 +588,9 @@
       sw.println("_pd)");
     }
 
+    // .setBeanMetadata(beanMetadata)
+    sw.println(".setBeanMetadata(beanMetadata)");
+
     // .build();
     sw.println(".build();");
     sw.outdent();
@@ -581,34 +599,88 @@
     sw.outdent();
   }
 
-  private void writeCatchUnexpectedException(SourceWriter sw, String message) {
-    // } catch (IllegalArgumentException e) {
-    sw.outdent();
-    sw.println("} catch (IllegalArgumentException e) {");
+  private void writeBeanMetadata(SourceWriter sw) throws UnableToCompleteException {
+    // private final BeanMetadata beanMetadata =
+    sw.println("private final BeanMetadata beanMetadata =");
+    sw.indent();
     sw.indent();
 
-    // throw e;
-    sw.println("throw e;");
-
-    // } catch (ValidationException e) {
-    sw.outdent();
-    sw.println("} catch (ValidationException e) {");
+    // new BeanMetadata(
+    sw.println("new " + BeanMetadata.class.getSimpleName() + "(");
+    sw.indent();
     sw.indent();
 
-    // throw e;
-    sw.println("throw e;");
+    // <<bean class>>, <<default group seq class 1>>, <<default group seq class 2>>, ...
+    Class<?> beanClazz = beanHelper.getClazz();
+    sw.print(asLiteral(beanClazz));
+    GroupSequence groupSeqAnnotation = beanClazz.getAnnotation(GroupSequence.class);
+    List<Class<?>> groupSequence = new ArrayList<Class<?>>();
+    if (groupSeqAnnotation == null) {
+      groupSequence.add(beanClazz);
+    } else {
+      groupSequence.addAll(Arrays.asList(groupSeqAnnotation.value()));
+    }
+    boolean groupSequenceContainsDefault = false;
+    for (Class<?> group : groupSequence) {
+      sw.println(",");
+      if (group.getName().equals(beanClazz.getName())) {
+        sw.print(asLiteral(Default.class));
+        groupSequenceContainsDefault = true;
+      }
+      else if (group.getName().equals(Default.class.getName())) {
+        throw error(logger, "'Default.class' cannot appear in default group sequence list.");
+      }
+      else {
+        sw.print(asLiteral(group));
+      }
+    }
+    if (!groupSequenceContainsDefault) {
+      throw error(logger, beanClazz.getName() + " must be part of the redefined default group " +
+          "sequence.");
+    }
 
-    // } catch (Exception e) {
+    sw.println(");");
     sw.outdent();
-    sw.println("} catch (Exception e) {");
-    sw.indent();
-
-    // throw new ValidationException("my message", e);
-    sw.println("throw new ValidationException(" + message + ", e);");
-
-    // }
     sw.outdent();
-    sw.println("}");
+    sw.outdent();
+    sw.outdent();
+  }
+
+  private void writeClassLevelConstraintsValidation(SourceWriter sw, String groupsVarName)
+      throws UnableToCompleteException {
+    // all class level constraints
+    int count = 0;
+    Class<?> clazz = beanHelper.getClazz();
+    for (ConstraintDescriptor<?> constraint : beanHelper.getBeanDescriptor().getConstraintDescriptors()) {
+      if (hasMatchingAnnotation(constraint)) {
+
+        if (!constraint.getConstraintValidatorClasses().isEmpty()) {
+          Class<? extends ConstraintValidator<? extends Annotation, ?>> validatorClass = getValidatorForType(
+              constraint, clazz);
+
+          // validate(context, violations, null, object,
+          sw.print("validate(context, violations, null, object, ");
+
+          // new MyValidtor(),
+          sw.print("new ");
+          sw.print(validatorClass.getCanonicalName());
+          sw.print("(), "); // TODO(nchalko) use ConstraintValidatorFactory
+
+          // this.aConstraintDescriptor, groups);
+          sw.print(constraintDescriptorVar("this", count));
+          sw.print(", ");
+          sw.print(groupsVarName);
+          sw.println(");");
+        } else if (constraint.getComposingConstraints().isEmpty()) {
+          // TODO(nchalko) What does the spec say to do here.
+          logger.log(TreeLogger.WARN, "No ConstraintValidator of " + constraint
+              + " for type " + clazz);
+        }
+        // TODO(nchalko) handle constraint.isReportAsSingleViolation() and
+        // hasComposingConstraints
+      }
+      count++;
+    }
   }
 
   private void writeConstraintDescriptor(SourceWriter sw,
@@ -733,6 +805,175 @@
     sw.println();
   }
 
+  private void writeExpandDefaultAndValidate(SourceWriter sw, Stage stage) throws UnableToCompleteException {
+    Class<?> clazz = beanHelper.getClazz();
+
+    // ArrayList<Class<?>> justGroups = new ArrayList<Class<?>>();
+    sw.println("ArrayList<Class<?>> justGroups = new ArrayList<Class<?>>();");
+
+    // for (Group g : groups) {
+    sw.println("for (Group g : groups) {");
+    sw.indent();
+    //  if (!g.isDefaultGroup() || !getBeanMetadata().defaultGroupSequenceIsRedefined()) {
+    sw.println("if (!g.isDefaultGroup() || !getBeanMetadata().defaultGroupSequenceIsRedefined()) {");
+    sw.indent();
+    // justGroups.add(g.getGroup());
+    sw.println("justGroups.add(g.getGroup());");
+    sw.outdent();
+    // }
+    sw.println("}");
+    sw.outdent();
+    // }
+    sw.println("}");
+
+    // Class<?>[] justGroupsArray = justGroups.toArray(new Class<?>[justGroups.size()]);
+    sw.println("Class<?>[] justGroupsArray = justGroups.toArray(new Class<?>[justGroups.size()]);");
+
+    switch (stage) {
+      case OBJECT:
+        // validateAllNonInheritedProperties(context, object, violations, justGroupsArray);
+        sw.println("validateAllNonInheritedProperties(context, object, violations, " +
+            "justGroupsArray);");
+        writeClassLevelConstraintsValidation(sw, "justGroupsArray");
+        break;
+      case PROPERTY:
+        // validatePropertyGroups(context, object, propertyName, violations, justGroupsArray);
+        sw.println("validatePropertyGroups(context, object, propertyName, violations, " +
+            "justGroupsArray);");
+        break;
+      case VALUE:
+        // validateValueGroups(context, beanType, propertyName, value, violations,
+        //     justGroupsArray);
+        sw.println("validateValueGroups(context, beanType, propertyName, value, violations, " +
+            "justGroupsArray);");
+        break;
+      default:
+        throw new IllegalStateException();
+    }
+
+    // if (getBeanMetadata().defaultGroupSequenceIsRedefined()) {
+    sw.println("if (getBeanMetadata().defaultGroupSequenceIsRedefined()) {");
+    sw.indent();
+    // for (Class<?> g : beanMetadata.getDefaultGroupSequence()) {
+    sw.println("for (Class<?> g : beanMetadata.getDefaultGroupSequence()) {");
+    sw.indent();
+    // int numberOfViolations = violations.size();
+    sw.println("int numberOfViolations = violations.size();");
+
+    switch (stage) {
+      case OBJECT:
+        // validateAllNonInheritedProperties(context, object, violations, g);
+        sw.println("validateAllNonInheritedProperties(context, object, violations, g);");
+        writeClassLevelConstraintsValidation(sw, "g");
+        // validate super classes and super interfaces
+        writeValidateInheritance(sw, clazz, Stage.OBJECT, null, false, "g");
+        break;
+      case PROPERTY:
+        // validatePropertyGroups(context, object, propertyName, violations, g);
+        sw.println("validatePropertyGroups(context, object, propertyName, violations, g);");
+        break;
+      case VALUE:
+        // validateValueGroups(context, beanType, propertyName, value, violations, g);
+        sw.println("validateValueGroups(context, beanType, propertyName, value, violations, g);");
+        break;
+      default:
+        throw new IllegalStateException();
+    }
+
+    // if (violations.size() > numberOfViolations) {
+    sw.println("if (violations.size() > numberOfViolations) {");
+    sw.indent();
+    // break;
+    sw.println("break;");
+    sw.outdent();
+    // }
+    sw.println("}");
+    sw.outdent();
+    // }
+    sw.println("}");
+    sw.outdent();
+    // }
+    sw.println("}");
+    if (stage == Stage.OBJECT) {
+      // else {
+      sw.println("else {");
+      sw.indent();
+
+      // validate super classes and super interfaces
+      writeValidateInheritance(sw, clazz, Stage.OBJECT, null, true, "groups");
+
+      // }
+      sw.outdent();
+      sw.println("}");
+    }
+  }
+
+  private void writeExpandDefaultAndValidateClassGroups(SourceWriter sw) throws UnableToCompleteException {
+    // public <T> void expandDefaultAndValidateClassGroups(
+    sw.println("public <T> void expandDefaultAndValidateClassGroups(");
+
+    // GwtValidationContext<T> context, BeanType object,
+    // Set<ConstraintViolation<T>> violations, Group... groups) {
+    sw.indent();
+    sw.indent();
+    sw.println("GwtValidationContext<T> context,");
+    sw.println(beanHelper.getTypeCanonicalName() + " object,");
+    sw.println("Set<ConstraintViolation<T>> violations,");
+    sw.println("Group... groups) {");
+    sw.outdent();
+
+    writeExpandDefaultAndValidate(sw, Stage.OBJECT);
+
+    // }
+    sw.outdent();
+    sw.println("}");
+  }
+
+  private void writeExpandDefaultAndValidatePropertyGroups(SourceWriter sw) throws UnableToCompleteException {
+    // public <T> void expandDefaultAndValidatePropertyGroups(
+    sw.println("public <T> void expandDefaultAndValidatePropertyGroups(");
+
+    // GwtValidationContext<T> context, BeanType object, String propertyName,
+    // Set<ConstraintViolation<T>> violations, Group... groups) {
+    sw.indent();
+    sw.indent();
+    sw.println("GwtValidationContext<T> context,");
+    sw.println(beanHelper.getTypeCanonicalName() + " object,");
+    sw.println("String propertyName,");
+    sw.println("Set<ConstraintViolation<T>> violations,");
+    sw.println("Group... groups) {");
+    sw.outdent();
+
+    writeExpandDefaultAndValidate(sw, Stage.PROPERTY);
+
+    // }
+    sw.outdent();
+    sw.println("}");
+  }
+
+  private void writeExpandDefaultAndValidateValueGroups(SourceWriter sw) throws UnableToCompleteException {
+    // public <T> void expandDefaultAndValidateValueGroups(
+    sw.println("public <T> void expandDefaultAndValidateValueGroups(");
+
+    // GwtValidationContext<T> context, Class<Author> beanType, String propertyName,
+    // Object value, Set<ConstraintViolation<T>> violations, Group... groups) {
+    sw.indent();
+    sw.indent();
+    sw.println("GwtValidationContext<T> context,");
+    sw.println("Class<" + beanHelper.getTypeCanonicalName() + "> beanType,");
+    sw.println("String propertyName,");
+    sw.println("Object value,");
+    sw.println("Set<ConstraintViolation<T>> violations,");
+    sw.println("Group... groups) {");
+    sw.outdent();
+
+    writeExpandDefaultAndValidate(sw, Stage.VALUE);
+
+    // }
+    sw.outdent();
+    sw.println("}");
+  }
+
   private void writeFields(SourceWriter sw) throws UnableToCompleteException {
 
     // Create a static array of all valid property names.
@@ -767,6 +1008,10 @@
     sw.outdent();
     sw.outdent();
 
+    // Write the metadata for the bean
+    writeBeanMetadata(sw);
+    sw.println();
+
     // Create a variable for each constraint of each property
     for (PropertyDescriptor p :
          beanHelper.getBeanDescriptor().getConstrainedProperties()) {
@@ -829,15 +1074,29 @@
     sw.println("}-*/;");
   }
 
-  private void writeGetDescriptor(SourceWriter sw) {
-    // public GwtBeanDescriptor<beanType> getConstraints(GroupInheritanceMap groupInheritanceMap) {
-    sw.print("public ");
-    sw.print("GwtBeanDescriptor<" + beanHelper.getTypeCanonicalName() + "> ");
-    sw.println("getConstraints(GroupInheritanceMap groupInheritanceMap) {");
+  private void writeGetBeanMetadata(SourceWriter sw) {
+    // public BeanMetadata getBeanMetadata() {
+    sw.println("public BeanMetadata getBeanMetadata() {");
     sw.indent();
 
-    // beanDescriptor.setGroupInheritanceMap(groupInheritanceMap);
-    sw.println("beanDescriptor.setGroupInheritanceMap(groupInheritanceMap);");
+    // return beanMetadata;
+    sw.println("return beanMetadata;");
+
+    // }
+    sw.outdent();
+    sw.println("}");
+  }
+
+  private void writeGetDescriptor(SourceWriter sw) {
+    // public GwtBeanDescriptor<beanType>
+    //     getConstraints(ValidationGroupsMetadata validationGroupsMetadata) {
+    sw.print("public ");
+    sw.print("GwtBeanDescriptor<" + beanHelper.getTypeCanonicalName() + "> ");
+    sw.println("getConstraints(ValidationGroupsMetadata validationGroupsMetadata) {");
+    sw.indent();
+
+    // beanDescriptor.setValidationGroupsMetadata(validationGroupsMetadata);
+    sw.println("beanDescriptor.setValidationGroupsMetadata(validationGroupsMetadata);");
 
     // return beanDescriptor;
     sw.println("return beanDescriptor;");
@@ -936,10 +1195,6 @@
     sw.println("}");
   }
 
-  private void writeNewViolations(SourceWriter sw) {
-    writeNewViolations(sw, DEFAULT_VIOLATION_VAR);
-  }
-
   private void writeNewViolations(SourceWriter sw, String violationName) {
     // Set<ConstraintViolation<T>> violations =
     sw.print("Set<ConstraintViolation<T>> ");
@@ -980,7 +1235,10 @@
     sw.println(p.getElementClass().getCanonicalName() + ".class,");
 
     // isCascaded,
-    sw.print(Boolean.toString(p.isCascaded()));
+    sw.print(Boolean.toString(p.isCascaded()) + ",");
+
+    // beanMetadata,
+    sw.print("beanMetadata");
 
     // myProperty_c0,
     // myProperty_c1 );
@@ -1012,29 +1270,41 @@
     }
   }
 
-  private void writeValidate(SourceWriter sw) throws UnableToCompleteException {
-    // public <T> Set<ConstraintViolation<T>> validate(
-    sw.println("public <T> Set<ConstraintViolation<T>> validate(");
+  private void writeValidateAllNonInheritedProperties(SourceWriter sw) {
+    // private <T> void validateAllNonInheritedProperties(
+    sw.println("private <T> void validateAllNonInheritedProperties(");
+    sw.indent();
+    sw.indent();
 
-    // GwtValidationContext<T> context, BeanType object, Class<?>... groups) {
+    // GwtValidationContext<T> context, BeanType object,
+    // Set<ConstraintViolation<T>> violations, Class<?>... groups) {
+    sw.println("GwtValidationContext<T> context,");
+    sw.println(beanHelper.getTypeCanonicalName() + " object,");
+    sw.println("Set<ConstraintViolation<T>> violations,");
+    sw.println("Class<?>... groups) {");
+    sw.outdent();
+
+    for (PropertyDescriptor p : beanHelper.getBeanDescriptor().getConstrainedProperties()) {
+      writeValidatePropertyCall(sw, p, false, true);
+    }
+
+    sw.outdent();
+    sw.println("}");
+  }
+
+  private void writeValidateClassGroups(SourceWriter sw) throws UnableToCompleteException {
+    // public <T> void validateClassGroups(
+    sw.println("public <T> void validateClassGroups(");
+
+    // GwtValidationContext<T> context, BeanType object,
+    // Set<ConstraintViolation<T>> violations, Group... groups) {
     sw.indent();
     sw.indent();
     sw.println("GwtValidationContext<T> context,");
     sw.println(beanHelper.getTypeCanonicalName() + " object,");
+    sw.println("Set<ConstraintViolation<T>> violations,");
     sw.println("Class<?>... groups) {");
     sw.outdent();
-    
-    // groups = addDefaultGroupWhenEmpty(groups);
-    sw.println("groups = addDefaultGroupWhenEmpty(groups);");
-
-    // try {
-    sw.println("try {");
-    sw.indent();
-
-    writeNewViolations(sw);
-
-    // context.addValidatedObject(object);
-    sw.println("context.addValidatedObject(object);");
 
     // /// For each group
 
@@ -1045,52 +1315,12 @@
     // all reachable getters (both) at once
     // including all reachable and cascadable associations
 
-    Set<PropertyDescriptor> properties = beanHelper.getBeanDescriptor().getConstrainedProperties();
-
-    for (PropertyDescriptor p : properties) {
-      writeValidatePropertyCall(sw, p, false, true);
-    }
-
-    // all class level constraints
-    int count = 0;
-    Class<?> clazz = beanHelper.getClazz();
-    for (ConstraintDescriptor<?> constraint : beanHelper.getBeanDescriptor().getConstraintDescriptors()) {
-      if (hasMatchingAnnotation(constraint)) {
-
-        if (!constraint.getConstraintValidatorClasses().isEmpty()) {
-          Class<? extends ConstraintValidator<? extends Annotation, ?>> validatorClass = getValidatorForType(
-              constraint, clazz);
-
-          // validate(context, violations, null, object,
-          sw.print("validate(context, violations, null, object, ");
-
-          // new MyValidtor();
-          sw.print("new ");
-          sw.print(validatorClass.getCanonicalName());
-          sw.print("(), "); // TODO(nchalko) use ConstraintValidatorFactory
-
-          // this.aConstraintDescriptor, groups);;
-          sw.print(constraintDescriptorVar("this", count));
-          sw.println(", groups);");
-        } else if (constraint.getComposingConstraints().isEmpty()) {
-          // TODO(nchalko) What does the spec say to do here.
-          logger.log(TreeLogger.WARN, "No ConstraintValidator of " + constraint
-              + " for type " + clazz);
-        }
-        // TODO(nchalko) handle constraint.isReportAsSingleViolation() and
-        // hasComposingConstraints
-      }
-      count++;
-    }
+    sw.println("validateAllNonInheritedProperties(context, object, violations, groups);");
 
     // validate super classes and super interfaces
-    writeValidateInheritance(sw, clazz, Stage.OBJECT, null);
+    writeValidateInheritance(sw, beanHelper.getClazz(), Stage.OBJECT, null, false, "groups");
 
-    // return violations;
-    sw.println("return violations;");
-
-    writeCatchUnexpectedException(sw,
-        "\"Error validating " + beanHelper.getTypeCanonicalName() + "\"");
+    writeClassLevelConstraintsValidation(sw, "groups");
 
     // }
     sw.outdent();
@@ -1308,21 +1538,27 @@
     sw.println(", groups);");
   }
 
-  private void writeValidateInheritance(SourceWriter sw, Class<?> clazz,
-      Stage stage, PropertyDescriptor property)
+  private void writeValidateInheritance(SourceWriter sw, Class<?> clazz, Stage stage,
+      PropertyDescriptor property) throws UnableToCompleteException {
+    writeValidateInheritance(sw, clazz, stage, property, false, "groups");
+  }
+
+  private void writeValidateInheritance(SourceWriter sw, Class<?> clazz, Stage stage,
+      PropertyDescriptor property, boolean expandDefaultGroupSequence, String groupsVarName)
       throws UnableToCompleteException {
-    writeValidateInterfaces(sw, clazz, stage, property);
+    writeValidateInterfaces(sw, clazz, stage, property, expandDefaultGroupSequence, groupsVarName);
     Class<?> superClass = clazz.getSuperclass();
     if (superClass != null) {
-      writeValidatorCall(sw, superClass, stage, property);
+      writeValidatorCall(sw, superClass, stage, property, expandDefaultGroupSequence, groupsVarName);
     }
   }
 
   private void writeValidateInterfaces(SourceWriter sw, Class<?> clazz,
-      Stage stage, PropertyDescriptor p) throws UnableToCompleteException {
+      Stage stage, PropertyDescriptor p, boolean expandDefaultGroupSequence, String groupsVarName)
+      throws UnableToCompleteException {
     for (Class<?> type : clazz.getInterfaces()) {
-      writeValidatorCall(sw, type, stage, p);
-      writeValidateInterfaces(sw, type, stage, p);
+      writeValidatorCall(sw, type, stage, p, expandDefaultGroupSequence, groupsVarName);
+      writeValidateInterfaces(sw, type, stage, p, expandDefaultGroupSequence, groupsVarName);
     }
   }
 
@@ -1423,60 +1659,6 @@
     sw.println("}");
   }
 
-  private void writeValidateProperty(SourceWriter sw)
-      throws UnableToCompleteException {
-    // public <T> Set<ConstraintViolation<T>> validate(
-    sw.println("public <T> Set<ConstraintViolation<T>> validateProperty(");
-
-    // GwtValidationContext<T> context, BeanType object, String propertyName,
-    // Class<?>... groups) throws ValidationException {
-    sw.indent();
-    sw.indent();
-    sw.println("GwtValidationContext<T> context,");
-    sw.println(beanHelper.getTypeCanonicalName() + " object,");
-    sw.println("String propertyName,");
-    sw.println("Class<?>... groups) throws ValidationException {");
-    sw.outdent();
-
-    // try {
-    sw.println("try {");
-    sw.indent();
-
-    writeNewViolations(sw);
-
-    for (PropertyDescriptor property : beanHelper.getBeanDescriptor().getConstrainedProperties()) {
-      // if (propertyName.equals(myPropety)) {
-      sw.print("if (propertyName.equals(\"");
-      sw.print(property.getPropertyName());
-      sw.println("\")) {");
-      sw.indent();
-
-      writeValidatePropertyCall(sw, property, false, false);
-
-      // validate all super classes and interfaces
-      writeValidateInheritance(sw, beanHelper.getClazz(), Stage.PROPERTY,
-          property);
-
-      // }
-      sw.outdent();
-      sw.print("} else ");
-    }
-
-    writeIfPropertyNameNotFound(sw);
-
-    // return violations;
-    sw.println("return violations;");
-
-    writeCatchUnexpectedException(
-        sw,
-        "\"Error validating \" + propertyName + \" of "
-        + beanHelper.getTypeCanonicalName() + "\"");
-
-    // }
-    sw.outdent();
-    sw.println("}");
-  }
-
   private void writeValidatePropertyCall(SourceWriter sw,
       PropertyDescriptor property, boolean useValue, boolean honorValid) {
     if (useValue) {
@@ -1541,6 +1723,47 @@
     }
   }
 
+  private void writeValidatePropertyGroups(SourceWriter sw)
+      throws UnableToCompleteException {
+    // public <T> void validatePropertyGroups(
+    sw.println("public <T> void validatePropertyGroups(");
+
+    // GwtValidationContext<T> context, BeanType object, String propertyName,
+    // Set<ConstraintViolation<T>> violations, Class<?>... groups) throws ValidationException {
+    sw.indent();
+    sw.indent();
+    sw.println("GwtValidationContext<T> context,");
+    sw.println(beanHelper.getTypeCanonicalName() + " object,");
+    sw.println("String propertyName,");
+    sw.println("Set<ConstraintViolation<T>> violations,");
+    sw.println("Class<?>... groups) throws ValidationException {");
+    sw.outdent();
+
+    for (PropertyDescriptor property : beanHelper.getBeanDescriptor().getConstrainedProperties()) {
+      // if (propertyName.equals(myPropety)) {
+      sw.print("if (propertyName.equals(\"");
+      sw.print(property.getPropertyName());
+      sw.println("\")) {");
+      sw.indent();
+
+      writeValidatePropertyCall(sw, property, false, false);
+
+      // validate all super classes and interfaces
+      writeValidateInheritance(sw, beanHelper.getClazz(), Stage.PROPERTY,
+          property);
+
+      // }
+      sw.outdent();
+      sw.print("} else ");
+    }
+
+    writeIfPropertyNameNotFound(sw);
+
+    // }
+    sw.outdent();
+    sw.println("}");
+  }
+
   private void writeValidatePropertyMethod(SourceWriter sw,
       PropertyDescriptor p, boolean useField) throws UnableToCompleteException {
     Class<?> elementClass = p.getElementClass();
@@ -1583,9 +1806,6 @@
     sw.print(p.getPropertyName());
     sw.println("\");");
 
-    // groups = addDefaultGroupWhenEmpty(groups);
-    sw.println("groups = addDefaultGroupWhenEmpty(groups);");
-
     // TODO(nchalko) move this out of here to the Validate method
     if (p.isCascaded() && hasValid(p, useField)) {
 
@@ -1660,31 +1880,23 @@
     sw.println("}");
   }
 
-  private void writeValidateValue(SourceWriter sw)
+  private void writeValidateValueGroups(SourceWriter sw)
       throws UnableToCompleteException {
-    // public <T> Set<ConstraintViolation<T>> validate(
-    sw.println("public <T> Set<ConstraintViolation<T>> validateValue(");
+    // public <T> void validateValueGroups(
+    sw.println("public <T> void validateValueGroups(");
 
-    // GwtValidationContext<T> context, Class<Author> beanType,
-    // String propertyName, Object value, Class<?>... groups) {
+    // GwtValidationContext<T> context, Class<Author> beanType, String propertyName,
+    // Object value, Set<ConstraintViolation<T>> violations, Class<?>... groups) {
     sw.indent();
     sw.indent();
     sw.println("GwtValidationContext<T> context,");
     sw.println("Class<" + beanHelper.getTypeCanonicalName() + "> beanType,");
     sw.println("String propertyName,");
     sw.println("Object value,");
+    sw.println("Set<ConstraintViolation<T>> violations,");
     sw.println("Class<?>... groups) {");
     sw.outdent();
 
-    // groups = addDefaultGroupWhenEmpty(groups);
-    sw.println("groups = addDefaultGroupWhenEmpty(groups);");
-
-    // try {
-    sw.println("try {");
-    sw.indent();
-
-    writeNewViolations(sw);
-
     for (PropertyDescriptor property :
         beanHelper.getBeanDescriptor().getConstrainedProperties()) {
       // if (propertyName.equals(myPropety)) {
@@ -1694,7 +1906,7 @@
       sw.indent();
 
       if (!isIterableOrMap(property.getElementClass())) {
-        writeValidatePropertyCall(sw, property, true, true);
+        writeValidatePropertyCall(sw, property, true, false);
       }
 
       // validate all super classes and interfaces
@@ -1708,50 +1920,51 @@
 
     writeIfPropertyNameNotFound(sw);
 
-    // return violations;
-    sw.println("return violations;");
-
-    writeCatchUnexpectedException(
-        sw,
-        "\"Error validating \" + propertyName + \" of "
-            + beanHelper.getTypeCanonicalName() + "\"");
-
     sw.outdent();
     sw.println("}");
   }
 
+  /**
+   * @param p Only used if writing a call to validate a property - otherwise can be null.
+   * @param expandDefaultGroupSequence Only used if writing a call to validate a bean.
+   * @param groupsVarName The name of the variable containing the groups.
+   */
   private void writeValidatorCall(SourceWriter sw, Class<?> type, Stage stage,
-      PropertyDescriptor p) throws UnableToCompleteException {
+      PropertyDescriptor p, boolean expandDefaultGroupSequence, String groupsVarName)
+      throws UnableToCompleteException {
     if (BeanHelper.isClassConstrained(type) && !isIterableOrMap(type)) {
       BeanHelper helper = createBeanHelper(type);
       beansToValidate.add(helper);
       switch (stage) {
         case OBJECT:
-          // voilations.addAll(myValidator.validate(context,object,groups));
-          sw.print("violations.addAll(");
+          // myValidator
           sw.print(helper.getValidatorInstanceName());
-          sw.println(".validate(context, object, groups));");
+          if (expandDefaultGroupSequence) {
+            // .expandDefaultAndValidateClassGroups(context,object,violations,groups);
+            sw.println(".expandDefaultAndValidateClassGroups(context, object, violations, " +
+                groupsVarName + ");");
+          } else {
+            // .validateClassGroups(context,object,violations,groups);
+            sw.println(".validateClassGroups(context, object, violations, " + groupsVarName + ");");
+          }
           break;
         case PROPERTY:
           if (isPropertyConstrained(helper, p)) {
-            // voilations.addAll(myValidator.validateProperty(context,object
-            // ,propertyName, groups));
-            sw.print("violations.addAll(");
+            // myValidator.validatePropertyGroups(context,object
+            // ,propertyName, violations, groups);
             sw.print(helper.getValidatorInstanceName());
-            sw.print(".validateProperty(context, object,");
-            sw.println(" propertyName, groups));");
+            sw.print(".validatePropertyGroups(context, object,");
+            sw.println(" propertyName, violations, " + groupsVarName + ");");
           }
           break;
         case VALUE:
           if (isPropertyConstrained(helper, p)) {
-            // voilations.addAll(myValidator.validateProperty(context,beanType
-            // ,propertyName, value, groups));
-            sw.print("violations.addAll(");
+            // myValidator.validateValueGroups(context,beanType
+            // ,propertyName, value, violations, groups);
             sw.print(helper.getValidatorInstanceName());
-            sw.print(".validateValue(context, ");
-            // TODO(nchalko) this seems like an unneeded param
+            sw.print(".validateValueGroups(context, ");
             sw.print(helper.getTypeCanonicalName());
-            sw.println(".class, propertyName, value, groups));");
+            sw.println(".class, propertyName, value, violations, " + groupsVarName + ");");
           }
           break;
         default:
diff --git a/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java b/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java
index d8f4751..a805ab3 100644
--- a/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java
+++ b/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java
@@ -25,7 +25,7 @@
 import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
 import com.google.gwt.user.rebind.SourceWriter;
 import com.google.gwt.validation.client.GwtValidation;
-import com.google.gwt.validation.client.GroupInheritanceMap;
+import com.google.gwt.validation.client.ValidationGroupsMetadata;
 import com.google.gwt.validation.client.impl.AbstractGwtValidator;
 import com.google.gwt.validation.client.impl.GwtBeanDescriptor;
 import com.google.gwt.validation.client.impl.GwtSpecificValidator;
@@ -38,6 +38,7 @@
 import java.util.Set;
 
 import javax.validation.ConstraintViolation;
+import javax.validation.GroupSequence;
 import javax.validation.groups.Default;
 import javax.validation.metadata.BeanDescriptor;
 
@@ -77,7 +78,7 @@
        GwtBeanDescriptor.class,
        GwtSpecificValidator.class,
        GwtValidationContext.class,
-       GroupInheritanceMap.class,
+       ValidationGroupsMetadata.class,
        Set.class,
        HashSet.class,
        Map.class,
@@ -93,7 +94,7 @@
   protected void writeClassBody(SourceWriter sourceWriter) {
     writeConstructor(sourceWriter);
     sourceWriter.println();
-    writeCreateGroupInheritanceMap(sourceWriter);
+    writeCreateValidationGroupsMetadata(sourceWriter);
     sourceWriter.println();
     writeValidate(sourceWriter);
     sourceWriter.println();
@@ -111,8 +112,8 @@
     sw.println("public " + getSimpleName() + "() {");
     sw.indent();
 
-    // super(createGroupInheritanceMap());
-    sw.println("super(createGroupInheritanceMap());");
+    // super(createValidationGroupsMetadata());
+    sw.println("super(createValidationGroupsMetadata());");
 
     sw.outdent();
     sw.println("}");
@@ -134,9 +135,9 @@
     // object,
     sw.println(objectName + ", ");
 
-    // MyBeanValidator.INSTANCE.getConstraints(getGroupInheritanceMap()),
+    // MyBeanValidator.INSTANCE.getConstraints(getValidationGroupsMetadata()),
     sw.print(bean.getFullyQualifiedValidatorName());
-    sw.println(".INSTANCE.getConstraints(getGroupInheritanceMap()), ");
+    sw.println(".INSTANCE.getConstraints(getValidationGroupsMetadata()), ");
 
     // getMessageInterpolator(),
     sw.println("getMessageInterpolator(), ");
@@ -147,24 +148,33 @@
     sw.outdent();
   }
 
-  private void writeCreateGroupInheritanceMap(SourceWriter sw) {
-    // private static GroupInheritanceMap creategroupInheritanceMap() {
-    sw.println("private static GroupInheritanceMap createGroupInheritanceMap() {");
+  private void writeCreateValidationGroupsMetadata(SourceWriter sw) {
+    // private static ValidationGroupsMetadata createValidationGroupsMetadata() {
+    sw.println("private static ValidationGroupsMetadata createValidationGroupsMetadata() {");
     sw.indent();
     
-    // GroupInheritanceMap groupInheritanceMap = GroupInheritanceMap.builder()
-    sw.println("return GroupInheritanceMap.builder()");
+    // return ValidationGroupsMetadata.builder()
+    sw.println("return ValidationGroupsMetadata.builder()");
     sw.indent();
     sw.indent();
     for (Class<?> group : gwtValidation.groups()) {
-      // .addGroup(<<group>>
-      sw.print(".addGroup(");
-      sw.print(group.getCanonicalName() + ".class");
-      Class<?>[] parentInterfaces = group.getInterfaces();
-      for (Class<?> parent : parentInterfaces) {
-        // , <<parent class>>
+      GroupSequence sequenceAnnotation = group.getAnnotation(GroupSequence.class);
+      Class<?>[] groups;
+      if (sequenceAnnotation != null) {
+        // .addSequence(<<sequence>>
+        sw.print(".addSequence(");
+        sw.print(group.getCanonicalName() + ".class");
+        groups = sequenceAnnotation.value();
+      } else {
+        // .addGroup(<<group>>
+        sw.print(".addGroup(");
+        sw.print(group.getCanonicalName() + ".class");
+        groups = group.getInterfaces();
+      }
+      for (Class<?> clazz : groups) {
+        // , <<group class>>
         sw.print(", ");
-        sw.print(parent.getCanonicalName() + ".class");
+        sw.print(clazz.getCanonicalName() + ".class");
       }
       // )
       sw.println(")");
@@ -205,10 +215,10 @@
     sw.println("if (clazz.equals(" + bean.getTypeCanonicalName() + ".class)) {");
     sw.indent();
 
-    // return MyBeanValidator.INSTANCE.getConstraints(getGroupInheritanceMap());
+    // return MyBeanValidator.INSTANCE.getConstraints(getValidationGroupsMetadata());
     sw.print("return ");
     sw.print(bean.getFullyQualifiedValidatorName());
-    sw.println(".INSTANCE.getConstraints(getGroupInheritanceMap());");
+    sw.println(".INSTANCE.getConstraints(getValidationGroupsMetadata());");
 
     // }
     sw.outdent();
diff --git a/user/src/com/google/gwt/validation/super/com/google/gwt/validation/client/spi/GwtConfigurationState.java b/user/src/com/google/gwt/validation/super/com/google/gwt/validation/client/spi/GwtConfigurationState.java
index 95d267f..a69c185 100644
--- a/user/src/com/google/gwt/validation/super/com/google/gwt/validation/client/spi/GwtConfigurationState.java
+++ b/user/src/com/google/gwt/validation/super/com/google/gwt/validation/client/spi/GwtConfigurationState.java
@@ -15,13 +15,24 @@
  */
 package com.google.gwt.validation.client.spi;
 
+import java.util.Map;
 import java.util.Set;
 
+import javax.validation.ConstraintValidatorFactory;
+import javax.validation.MessageInterpolator;
+import javax.validation.TraversableResolver;
+
 /**
  * Only the GWT incompatible parts.
  */
 public final class GwtConfigurationState extends BaseConfigurationState {
 
+  public GwtConfigurationState(ConstraintValidatorFactory constraintValidatorFactory,
+      MessageInterpolator messageInterpolator, Map<String, String> properties,
+      TraversableResolver traversableResolver) {
+    super(constraintValidatorFactory, messageInterpolator, properties, traversableResolver);
+  }
+
   public Set<String> getMappingStreams() {
     throw new UnsupportedOperationException(
         "GWT Validation does not support getMappingStreams");
diff --git a/user/test-super/org/testng/super/org/testng/Assert.java b/user/test-super/org/testng/super/org/testng/Assert.java
index 7326ef0..33db0f1 100644
--- a/user/test-super/org/testng/super/org/testng/Assert.java
+++ b/user/test-super/org/testng/super/org/testng/Assert.java
@@ -137,29 +137,181 @@
    * @param message the assertion error message
    */
   private static void assertArrayEquals(Object actual, Object expected, String message) {
-    //is called only when expected is an array
-//    if (actual.getClass().isArray()) {
-//      int expectedLength = Array.getLength(expected);
-//      if (expectedLength == Array.getLength(actual)) {
-//         for (int i = 0 ; i < expectedLength ; i++) {
-//            Object _actual = Array.get(actual, i);
-//            Object _expected = Array.get(expected, i);
-//            try {
-//               assertEquals(_actual, _expected);
-//            } catch (AssertionError ae) {
-//               failNotEquals(actual, expected, message == null ? "" : message
-//                        + " (values as index " + i + " are not the same)");
-//            }
-//         }
-//         //array values matched
-//         return;
-//      } else {
-//         failNotEquals(Array.getLength(actual), expectedLength, message == null ? "" : message
-//                  + " (Array lengths are not the same)");
-//      }
-//    }
-//    failNotEquals(actual, expected, message);
-    fail("assertArrayEquals not implemented");
+    // is called only when expected is an array
+    if (actual.getClass().isArray()) {
+      if (actual instanceof Object[] && expected instanceof Object[]) {
+        Object[] actualArray = (Object[]) actual;
+        Object[] expectedArray = (Object[]) expected;
+        int expectedLength = expectedArray.length;
+        if (expectedLength == actualArray.length) {
+          for (int i = 0; i < expectedLength; i++) {
+            Object _actual = actualArray[i];
+            Object _expected = expectedArray[i];
+            try {
+              assertEquals(_actual, _expected);
+            } catch (AssertionError ae) {
+              failArrayValuesAtIndexNotEqual(_actual, _expected, i, message);
+            }
+          }
+          return;
+        } else {
+          failArrayLengthsNotEqual(actualArray.length, expectedLength, message);
+        }
+      }
+      else if (actual instanceof int[] && expected instanceof int[]) {
+        int[] actualArray = (int[]) actual;
+        int[] expectedArray = (int[]) expected;
+        int expectedLength = expectedArray.length;
+        if (expectedLength == actualArray.length) {
+          for (int i = 0; i < expectedLength; i++) {
+            int _actual = actualArray[i];
+            int _expected = expectedArray[i];
+            try {
+              assertEquals(_actual, _expected);
+            } catch (AssertionError ae) {
+              failArrayValuesAtIndexNotEqual(_actual, _expected, i, message);
+            }
+          }
+          return;
+        } else {
+          failArrayLengthsNotEqual(actualArray.length, expectedLength, message);
+        }
+      }
+      else if (actual instanceof float[] && expected instanceof float[]) {
+        float[] actualArray = (float[]) actual;
+        float[] expectedArray = (float[]) expected;
+        int expectedLength = expectedArray.length;
+        if (expectedLength == actualArray.length) {
+          for (int i = 0; i < expectedLength; i++) {
+            float _actual = actualArray[i];
+            float _expected = expectedArray[i];
+            try {
+              assertEquals(_actual, _expected);
+            } catch (AssertionError ae) {
+              failArrayValuesAtIndexNotEqual(_actual, _expected, i, message);
+            }
+          }
+          return;
+        } else {
+          failArrayLengthsNotEqual(actualArray.length, expectedLength, message);
+        }
+      }
+      else if (actual instanceof long[] && expected instanceof long[]) {
+        long[] actualArray = (long[]) actual;
+        long[] expectedArray = (long[]) expected;
+        int expectedLength = expectedArray.length;
+        if (expectedLength == actualArray.length) {
+          for (int i = 0; i < expectedLength; i++) {
+            long _actual = actualArray[i];
+            long _expected = expectedArray[i];
+            try {
+              assertEquals(_actual, _expected);
+            } catch (AssertionError ae) {
+              failArrayValuesAtIndexNotEqual(_actual, _expected, i, message);
+            }
+          }
+          return;
+        } else {
+          failArrayLengthsNotEqual(actualArray.length, expectedLength, message);
+        }
+      }
+      else if (actual instanceof double[] && expected instanceof double[]) {
+        double[] actualArray = (double[]) actual;
+        double[] expectedArray = (double[]) expected;
+        int expectedLength = expectedArray.length;
+        if (expectedLength == actualArray.length) {
+          for (int i = 0; i < expectedLength; i++) {
+            double _actual = actualArray[i];
+            double _expected = expectedArray[i];
+            try {
+              assertEquals(_actual, _expected);
+            } catch (AssertionError ae) {
+              failArrayValuesAtIndexNotEqual(_actual, _expected, i, message);
+            }
+          }
+          return;
+        } else {
+          failArrayLengthsNotEqual(actualArray.length, expectedLength, message);
+        }
+      }
+      else if (actual instanceof boolean[] && expected instanceof boolean[]) {
+        boolean[] actualArray = (boolean[]) actual;
+        boolean[] expectedArray = (boolean[]) expected;
+        int expectedLength = expectedArray.length;
+        if (expectedLength == actualArray.length) {
+          for (int i = 0; i < expectedLength; i++) {
+            boolean _actual = actualArray[i];
+            boolean _expected = expectedArray[i];
+            try {
+              assertEquals(_actual, _expected);
+            } catch (AssertionError ae) {
+              failArrayValuesAtIndexNotEqual(_actual, _expected, i, message);
+            }
+          }
+          return;
+        } else {
+          failArrayLengthsNotEqual(actualArray.length, expectedLength, message);
+        }
+      }
+      else if (actual instanceof byte[] && expected instanceof byte[]) {
+        byte[] actualArray = (byte[]) actual;
+        byte[] expectedArray = (byte[]) expected;
+        int expectedLength = expectedArray.length;
+        if (expectedLength == actualArray.length) {
+          for (int i = 0; i < expectedLength; i++) {
+            byte _actual = actualArray[i];
+            byte _expected = expectedArray[i];
+            try {
+              assertEquals(_actual, _expected);
+            } catch (AssertionError ae) {
+              failArrayValuesAtIndexNotEqual(_actual, _expected, i, message);
+            }
+          }
+          return;
+        } else {
+          failArrayLengthsNotEqual(actualArray.length, expectedLength, message);
+        }
+      }
+      else if (actual instanceof short[] && expected instanceof short[]) {
+        short[] actualArray = (short[]) actual;
+        short[] expectedArray = (short[]) expected;
+        int expectedLength = expectedArray.length;
+        if (expectedLength == actualArray.length) {
+          for (int i = 0; i < expectedLength; i++) {
+            short _actual = actualArray[i];
+            short _expected = expectedArray[i];
+            try {
+              assertEquals(_actual, _expected);
+            } catch (AssertionError ae) {
+              failArrayValuesAtIndexNotEqual(_actual, _expected, i, message);
+            }
+          }
+          return;
+        } else {
+          failArrayLengthsNotEqual(actualArray.length, expectedLength, message);
+        }
+      }
+      else if (actual instanceof char[] && expected instanceof char[]) {
+        char[] actualArray = (char[]) actual;
+        char[] expectedArray = (char[]) expected;
+        int expectedLength = expectedArray.length;
+        if (expectedLength == actualArray.length) {
+          for (int i = 0; i < expectedLength; i++) {
+            char _actual = actualArray[i];
+            char _expected = expectedArray[i];
+            try {
+              assertEquals(_actual, _expected);
+            } catch (AssertionError ae) {
+              failArrayValuesAtIndexNotEqual(_actual, _expected, i, message);
+            }
+          }
+          return;
+        } else {
+          failArrayLengthsNotEqual(actualArray.length, expectedLength, message);
+        }
+      }
+    }
+    failNotEquals(actual, expected, message);
   }
 
 /**
@@ -472,6 +624,18 @@
     assertNotSame(actual, expected, null);
   }
 
+  static private void failArrayLengthsNotEqual(int actualLength, int expectedLength, 
+      String message) {
+    failNotEquals(actualLength, expectedLength, message == null ? "" : message
+        + " (Array lengths are not the same)");
+  }
+
+  static private void failArrayValuesAtIndexNotEqual(Object actual, Object expected, int index, 
+      String message) {
+    failNotEquals(actual, expected, message == null ? "" : message
+        + " (values as index " + index + " are not the same)");
+  }
+
   static private void failSame(Object actual, Object expected, String message) {
     String formatted = "";
     if(message != null) {
diff --git a/user/test/com/google/gwt/aria/AriaSuite.java b/user/test/com/google/gwt/aria/AriaSuite.java
index 8e5dee4..7c1b296 100644
--- a/user/test/com/google/gwt/aria/AriaSuite.java
+++ b/user/test/com/google/gwt/aria/AriaSuite.java
@@ -14,7 +14,7 @@
 package com.google.gwt.aria;
 
 import com.google.gwt.aria.client.AttributeTest;
-import com.google.gwt.aria.client.RoleTest;
+import com.google.gwt.aria.client.RoleImplTest;
 import com.google.gwt.junit.tools.GWTTestSuite;
 
 import junit.framework.Test;
@@ -26,7 +26,7 @@
   public static Test suite() {
     GWTTestSuite suite = new GWTTestSuite("Test for suite for aria");
     suite.addTestSuite(AttributeTest.class);
-    suite.addTestSuite(RoleTest.class);
+    suite.addTestSuite(RoleImplTest.class);
     return suite;
   }
 }
diff --git a/user/test/com/google/gwt/aria/client/RoleTest.java b/user/test/com/google/gwt/aria/client/RoleImplTest.java
similarity index 96%
rename from user/test/com/google/gwt/aria/client/RoleTest.java
rename to user/test/com/google/gwt/aria/client/RoleImplTest.java
index ade10b3..4fd88f2 100644
--- a/user/test/com/google/gwt/aria/client/RoleTest.java
+++ b/user/test/com/google/gwt/aria/client/RoleImplTest.java
@@ -20,9 +20,9 @@
 import com.google.gwt.junit.client.GWTTestCase;
 
 /**
- * Tests {@link Role} ARIA classes
+ * Tests generic role methods implemented in {@link RoleImpl}.
  */
-public class RoleTest extends GWTTestCase {
+public class RoleImplTest extends GWTTestCase {
   private Element div;
   private RegionRole regionRole;
 
diff --git a/user/test/com/google/gwt/user/cellview/client/SimplePagerTest.java b/user/test/com/google/gwt/user/cellview/client/SimplePagerTest.java
index 0f8891c..19bfe20 100644
--- a/user/test/com/google/gwt/user/cellview/client/SimplePagerTest.java
+++ b/user/test/com/google/gwt/user/cellview/client/SimplePagerTest.java
@@ -16,7 +16,6 @@
 package com.google.gwt.user.cellview.client;
 
 import com.google.gwt.aria.client.Property;
-import com.google.gwt.aria.client.Role;
 import com.google.gwt.aria.client.Roles;
 import com.google.gwt.aria.client.State;
 import com.google.gwt.core.client.GWT;
@@ -43,7 +42,7 @@
     NodeList<Element> nodeList = pager.getElement().getElementsByTagName("img");
     for (int i = 0; i < nodeList.getLength(); i++) {
       Element imgElem = nodeList.getItem(i);
-      assertEquals(Roles.getButtonRole().getName(), imgElem.getAttribute(Role.ATTR_NAME_ROLE));
+      assertEquals(Roles.getButtonRole().getName(), imgElem.getAttribute("role"));
       String label = imgElem.getAttribute(Property.LABEL.getName());
       assertNotNull(label);
       if (label.equals(imageButtonConstants.firstPage()) 
diff --git a/user/test/com/google/gwt/validation/ValidationClientJreSuite.java b/user/test/com/google/gwt/validation/ValidationClientJreSuite.java
index 7d17aa8..5522679 100644
--- a/user/test/com/google/gwt/validation/ValidationClientJreSuite.java
+++ b/user/test/com/google/gwt/validation/ValidationClientJreSuite.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.validation;
 
-import com.google.gwt.validation.client.GroupInheritanceMapTest;
+import com.google.gwt.validation.client.ValidationGroupsMetadataTest;
 import com.google.gwt.validation.client.impl.NodeImplTest;
 import com.google.gwt.validation.client.impl.PathImplTest;
 
@@ -32,7 +32,7 @@
         "Test suite for validation client code that does not require GWT.");
     suite.addTestSuite(PathImplTest.class);
     suite.addTestSuite(NodeImplTest.class);
-    suite.addTestSuite(GroupInheritanceMapTest.class);
+    suite.addTestSuite(ValidationGroupsMetadataTest.class);
     return suite;
   }
 }
diff --git a/user/test/com/google/gwt/validation/client/GroupInheritanceMapTest.java b/user/test/com/google/gwt/validation/client/ValidationGroupsMetadataTest.java
similarity index 71%
rename from user/test/com/google/gwt/validation/client/GroupInheritanceMapTest.java
rename to user/test/com/google/gwt/validation/client/ValidationGroupsMetadataTest.java
index a582a93..f5d7e39 100644
--- a/user/test/com/google/gwt/validation/client/GroupInheritanceMapTest.java
+++ b/user/test/com/google/gwt/validation/client/ValidationGroupsMetadataTest.java
@@ -23,12 +23,12 @@
 import javax.validation.groups.Default;
 
 /**
- * Test case for {@link GroupInheritanceMap}.
+ * Test case for {@link ValidationGroupsMetadata}.
  */
-public class GroupInheritanceMapTest extends TestCase {
+public class ValidationGroupsMetadataTest extends TestCase {
 
-  private GroupInheritanceMap createWithTestGroups() {
-    return GroupInheritanceMap.builder()
+  private ValidationGroupsMetadata createWithTestGroups() {
+    return ValidationGroupsMetadata.builder()
         .addGroup(Part1.class, MiniPart.class)
         .addGroup(Part2.class)
         .addGroup(Big.class, Part1.class, Part2.class)
@@ -38,12 +38,12 @@
   }
 
   public void testDefaultGroupExists() {
-    assertTrue(GroupInheritanceMap.builder().build().containsGroup(Default.class));
+    assertTrue(ValidationGroupsMetadata.builder().build().containsGroup(Default.class));
   }
   
   public void testFindAllExtendedGroups() {
     // should get all of the groups and all of their parents recursively
-    GroupInheritanceMap groupInheritanceMap = createWithTestGroups();
+    ValidationGroupsMetadata groupsMetadata = createWithTestGroups();
     Set<Class<?>> baseGroups = new HashSet<Class<?>>();
     baseGroups.add(Part1.class);
     baseGroups.add(Part2.class);
@@ -52,26 +52,26 @@
     desired.add(Part2.class);
     desired.add(MiniPart.class);
     desired.add(SuperSmall.class);
-    assertEquals(desired, groupInheritanceMap.findAllExtendedGroups(baseGroups));
+    assertEquals(desired, groupsMetadata.findAllExtendedGroups(baseGroups));
   }
 
   public void testFindingExtendedGroupsThrowsExceptionWhenUnknown() {
     // should throw exception when the group has not been added to the map
-    GroupInheritanceMap groupInheritanceMap = GroupInheritanceMap.builder().build();
-    assertFalse(groupInheritanceMap.containsGroup(MiniPart.class));
+    ValidationGroupsMetadata groupsMetadata = ValidationGroupsMetadata.builder().build();
+    assertFalse(groupsMetadata.containsGroup(MiniPart.class));
     try {
       Set<Class<?>> miniPart = new HashSet<Class<?>>();
       miniPart.add(MiniPart.class);
-      groupInheritanceMap.findAllExtendedGroups(miniPart);
+      groupsMetadata.findAllExtendedGroups(miniPart);
       fail("Expected an " + IllegalArgumentException.class);
     } catch (IllegalArgumentException expected) {
       // expected
     }
   }
 
-  public void testGetAllGroups() {
-    // should return all groups and their parents recursively
-    GroupInheritanceMap groupInheritanceMap = createWithTestGroups();
+  public void testGetAllGroupsAndSequences() {
+    // should return all groups and their parents recursively as well as sequence groups
+    ValidationGroupsMetadata groupsMetadata = createWithTestGroups();
     Set<Class<?>> desired = new HashSet<Class<?>>();
     desired.add(Default.class);
     desired.add(Part1.class);
@@ -79,7 +79,7 @@
     desired.add(MiniPart.class);
     desired.add(SuperSmall.class);
     desired.add(Big.class);
-    assertEquals(desired, groupInheritanceMap.getAllGroups());
+    assertEquals(desired, groupsMetadata.getAllGroupsAndSequences());
   }
 
   private interface Part1 extends MiniPart {
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/CustomMessageInterpolatorGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/CustomMessageInterpolatorGwtTest.java
index 949bc13..1ba006b 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/CustomMessageInterpolatorGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/CustomMessageInterpolatorGwtTest.java
@@ -17,8 +17,6 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
-
 /**
  * Wraps {@link CustomMessageInterpolatorTest} .
  */
@@ -30,7 +28,6 @@
     return "org.hibernate.jsr303.tck.tests.bootstrap.TckTest";
   }
 
-  @Failing(issue = 6663)
   public void testCustomMessageInterpolatorViaConfiguration() {
     delegate.testCustomMessageInterpolatorViaConfiguration();
   }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/BuiltinValidatorOverrideGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/BuiltinValidatorOverrideGwtTest.java
index 98a0952..b512308 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/BuiltinValidatorOverrideGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/BuiltinValidatorOverrideGwtTest.java
@@ -20,7 +20,7 @@
 import org.hibernate.jsr303.tck.util.client.Failing;
 
 /**
- * Test wrapper for {@link BuiltinValidatorOverrideGwtTest}.
+ * Test wrapper for {@link BuiltinValidatorOverrideTest}.
  */
 public class BuiltinValidatorOverrideGwtTest extends GWTTestCase {
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/DefaultGroupRedefinitionGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/DefaultGroupRedefinitionGwtTest.java
index 4a43b8c..09168f4 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/DefaultGroupRedefinitionGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/DefaultGroupRedefinitionGwtTest.java
@@ -17,8 +17,6 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
-
 /**
  * Test wrapper for {@link DefaultGroupRedefinitionTest}.
  */
@@ -30,12 +28,10 @@
     return "org.hibernate.jsr303.tck.tests.constraints.groups.TckTest";
   }
 
-  @Failing(issue = 5801)
   public void testRedefiningDefaultGroup() {
     delegate.testRedefiningDefaultGroup();
   }
 
-  @Failing(issue = 5801)
   public void testValidatingAgainstRedefinedDefaultGroup() {
     delegate.testValidatingAgainstRedefinedDefaultGroup();
   }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupGwtTest.java
index 36f9864..0358ab9 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupGwtTest.java
@@ -17,7 +17,7 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
+import javax.validation.GroupDefinitionException;
 
 /**
  * Test wrapper for {@link GroupTest}.
@@ -39,14 +39,18 @@
   }
 
   public void testCyclicGroupSequence() {
-    delegate.testCyclicGroupSequence();
+    try {
+      delegate.testCyclicGroupSequence();
+      fail("Expected a " + GroupDefinitionException.class);
+    } catch (GroupDefinitionException expected) {
+      // expected
+    }
   }
 
   public void testGroups() {
     delegate.testGroups();
   }
 
-  @Failing(issue = 5801)
   public void testGroupSequence() {
     delegate.testGroupSequence();
   }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequence/SequenceResolutionGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequence/SequenceResolutionGwtTest.java
index 67d7581..674b761 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequence/SequenceResolutionGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequence/SequenceResolutionGwtTest.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
 import org.hibernate.jsr303.tck.util.client.NonTckTest;
 
 import javax.validation.GroupDefinitionException;
@@ -38,16 +37,10 @@
     // There must be at least one passing test.
   }
 
-  @Failing(issue = 6291)
   public void testGroupSequenceContainerOtherGroupSequences() {
-    try {
-      delegate.testGroupSequenceContainerOtherGroupSequences();
-      fail("Expected a " + GroupDefinitionException.class);
-    } catch (GroupDefinitionException expected) {
-    }
+    delegate.testGroupSequenceContainerOtherGroupSequences();
   }
 
-  @Failing(issue = 6291)
   public void testInvalidDefinitionOfDefaultSequenceInEntity() {
     try {
       delegate.testInvalidDefinitionOfDefaultSequenceInEntity();
@@ -56,7 +49,6 @@
     }
   }
 
-  @Failing(issue = 6291)
   public void testOnlyFirstGroupInSequenceGetEvaluated() {
     delegate.testOnlyFirstGroupInSequenceGetEvaluated();
   }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/GroupSequenceIsolationGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/GroupSequenceIsolationGwtTest.java
index 866b369..44fdf68 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/GroupSequenceIsolationGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/GroupSequenceIsolationGwtTest.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
 import org.hibernate.jsr303.tck.util.client.NonTckTest;
 
 /**
@@ -31,29 +30,24 @@
     return "org.hibernate.jsr303.tck.tests.constraints.groups.groupsequenceisolation.TckTest";
   }
 
-  @Failing(issue = 6291)
   public void testCorrectDefaultSequenceContainedCaseWithGroupRedefinitionOnContainedEntity() {
     delegate
         .testCorrectDefaultSequenceContainedCaseWithGroupRedefinitionOnContainedEntity();
   }
 
-  @Failing(issue = 6291)
   public void testCorrectDefaultSequenceContainedCaseWithoutGroupRedefinitionOnContainedEntity() {
     delegate
         .testCorrectDefaultSequenceContainedCaseWithoutGroupRedefinitionOnContainedEntity();
   }
 
-  @Failing(issue = 6291)
   public void testCorrectDefaultSequenceInheritance() {
     delegate.testCorrectDefaultSequenceInheritance();
   }
 
-  @Failing(issue = 6291)
   public void testCorrectDefaultSequenceInheritance2() {
     delegate.testCorrectDefaultSequenceInheritance2();
   }
 
-  @Failing(issue = 6291)
   public void testCorrectDefaultSequenceInheritance3() {
     delegate.testCorrectDefaultSequenceInheritance3();
   }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTestValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTestValidatorFactory.java
index 3d78e06..58764fe 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTestValidatorFactory.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTestValidatorFactory.java
@@ -30,7 +30,8 @@
   /**
    * Marker Interface to {@link GWT#create(Class)}.
    */
-  @GwtValidation(value = {B1.class, B2.class, B3.class, C.class, E.class})
+  @GwtValidation(value = {B1.class, B2.class, B3.class, C.class, E.class},
+      groups = {Heavy.class, Minimal.class})
   public static interface GwtValidator extends Validator {
   }
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/ValidatorResolutionGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/ValidatorResolutionGwtTest.java
index c7b7070..b035b1d 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/ValidatorResolutionGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/ValidatorResolutionGwtTest.java
@@ -17,8 +17,6 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
-
 /**
  * Wraps {@link ValidatorResolutionTest} .
  */
@@ -33,7 +31,6 @@
     delegate.testResolutionOfMinMaxForDifferentTypes();
   }
 
-  @Failing(issue = 5806)
   public void testResolutionOfMultipleSizeValidators() {
     delegate.testResolutionOfMultipleSizeValidators();
   }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/metadata/ElementDescriptorGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/metadata/ElementDescriptorGwtTest.java
index 8d2622b..fbf9eaf 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/metadata/ElementDescriptorGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/metadata/ElementDescriptorGwtTest.java
@@ -17,8 +17,6 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
-
 /**
  * Test wrapper for {@link ElementDescriptorTest}.
  */
@@ -50,12 +48,10 @@
     delegate.testLookingAt();
   }
 
-  @Failing(issue = 5932)
   public void testUnorderedAndMatchingGroups() {
     delegate.testUnorderedAndMatchingGroups();
   }
 
-  @Failing(issue = 5932)
   public void testUnorderedAndMatchingGroupsWithDefaultGroupOverriding() {
     delegate.testUnorderedAndMatchingGroupsWithDefaultGroupOverriding();
   }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTestValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTestValidatorFactory.java
index a32aaf5..f7a1d6d 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTestValidatorFactory.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTestValidatorFactory.java
@@ -34,8 +34,8 @@
   @GwtValidation(value = {
         Account.class, Customer.class, Man.class, Order.class, Person.class,
         SubClass.class, SuperClass.class, UnconstraintEntity.class},
-      groups = {Default.class, SuperClass.BasicGroup.class, SuperClass.InheritedGroup.class,
-        SuperClass.UnusedGroup.class})
+      groups = {Default.class, SubClass.DefaultGroup.class, SuperClass.BasicGroup.class,
+        SuperClass.InheritedGroup.class, SuperClass.UnusedGroup.class})
   public static interface GwtValidator extends Validator {
   }
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/GraphNavigationGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/GraphNavigationGwtTest.java
index 78f6003..e52990f 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/GraphNavigationGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/GraphNavigationGwtTest.java
@@ -17,8 +17,6 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
-
 /**
  * Test wrapper for {@link GraphNavigationTest}.
  */
@@ -43,7 +41,6 @@
     delegate.testContainedSet();
   }
 
-  @Failing(issue = 5946)
   public void testFullGraphValidationBeforeNextGroupInSequence() {
     delegate.testFullGraphValidationBeforeNextGroupInSequence();
   }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/TckTestValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/TckTestValidatorFactory.java
index 8938936..b26f4e9 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/TckTestValidatorFactory.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/TckTestValidatorFactory.java
@@ -20,6 +20,9 @@
 import com.google.gwt.validation.client.GwtValidation;
 import com.google.gwt.validation.client.impl.AbstractGwtValidator;
 
+import org.hibernate.jsr303.tck.tests.validation.graphnavigation.Parent.ChildFirst;
+import org.hibernate.jsr303.tck.tests.validation.graphnavigation.Parent.ParentSecond;
+
 import javax.validation.Validator;
 import javax.validation.groups.Default;
 
@@ -35,7 +38,7 @@
         AnimalCaretaker.class, Condor.class, Elephant.class, GameReserve.class,
         MultiCage.class, MultiCage.class, Order.class, Parent.class,
         SingleCage.class, User.class, Zebra.class, Zoo.class},
-      groups = {Default.class, Parent.ProperOrder.class})
+      groups = {Default.class, Parent.ProperOrder.class, ChildFirst.class, ParentSecond.class})
   public static interface GwtValidator extends Validator {
   }
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validatorfactory/CustomConstraintValidatorGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/validatorfactory/CustomConstraintValidatorGwtTest.java
index 480da20..e83d4ee 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validatorfactory/CustomConstraintValidatorGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/validatorfactory/CustomConstraintValidatorGwtTest.java
@@ -17,7 +17,10 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+import javax.validation.ValidationException;
 
 /**
  * Wraps
@@ -37,13 +40,19 @@
     delegate.testDefaultConstructorInValidatorCalled();
   }
 
-  @Failing(issue = 5805)
   public void testRuntimeExceptionInValidatorCreationIsWrapped() {
-    delegate.testRuntimeExceptionInValidatorCreationIsWrapped();
+    try {
+      delegate.testRuntimeExceptionInValidatorCreationIsWrapped();
+      fail("Expected a " + ValidationException.class);
+    } catch (ValidationException expected) {
+      Throwable cause = expected.getCause();
+      assertEquals(RuntimeException.class, cause.getClass());
+      assertEquals("Runtime exception in validator creation", cause.getMessage());
+    }
   }
 
-  @Failing(issue = 5805)
+  @NotSupported(reason = Reason.CONSTRAINT_VALIDATOR_FACTORY)
   public void testValidationExceptionIsThrownInCaseFactoryReturnsNull() {
-    delegate.testValidationExceptionIsThrownInCaseFactoryReturnsNull();
+    fail("ConstraintValidatorFactory is not supported. GWT.create() is used in its place.");
   }
 }
diff --git a/user/test/org/hibernate/jsr303/tck/util/client/NotSupported.java b/user/test/org/hibernate/jsr303/tck/util/client/NotSupported.java
index cf49ea7..13d8593 100644
--- a/user/test/org/hibernate/jsr303/tck/util/client/NotSupported.java
+++ b/user/test/org/hibernate/jsr303/tck/util/client/NotSupported.java
@@ -37,7 +37,7 @@
    * Constants for why a test is not supported.
    */
   public enum Reason {
-    XML, IO, CALENDAR
+    XML, IO, CALENDAR, CONSTRAINT_VALIDATOR_FACTORY
   }
 
   /**