Defines API containing definition of ARIA attributes as defined by the W3C ARIA
specification.
The central concept in ARIA are the roles. Roles are organized in hierarchy.
Roles can be abstract and concrete. The abstract roles are building blocks in
the roles hierarchy. States and properties are defined for roles. Roles inherit
the states and properties of patent roles. Roles are constant when set to an
HTML elements and are not supposed to change.
The central class in this ARIA API is the Roles class that defines all the
roles defined in the W3C specification
(http://www.w3.org/WAI/ARIA/schemata/aria-1.rdf). Each role is an instance of
the Role class, and implements a role interface. Role interfaces are organized
in a hierarchy. Roles contain get/set/remove methods for the own and inherited
attributes. Attributes can be of 3 types -- properties/ states and extra
attributes (tabindex). All the attributes can be accessed and modified by the
particular role instance and its getter/setter/remover attribute methods.
The attributes types, values and types are defined in
http://www.w3.org/MarkUp/SCHEMA/aria-attributes-1.xsd.
In this change list is added a usage of the ARIA API. The ImageButtons in the
SimplePager (used in the CellTable) are added 'button' ARIA roles and are added
'aria-label' property that provides the user with a recognizable name of the
ImageButton.

Review at http://gwt-code-reviews.appspot.com/1624803


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10864 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/aria/Aria.gwt.xml b/user/src/com/google/gwt/aria/Aria.gwt.xml
new file mode 100644
index 0000000..31723c5
--- /dev/null
+++ b/user/src/com/google/gwt/aria/Aria.gwt.xml
@@ -0,0 +1,18 @@
+<!--                                                                        -->
+<!-- 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   -->
+<!-- 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. License for the specific language governing permissions and   -->
+<!-- limitations under the License.                                         -->
+
+<module>
+  <inherits name="com.google.gwt.dom.DOM" />
+  <source path="client"/>
+</module>
diff --git a/user/src/com/google/gwt/aria/client/AlertRole.java b/user/src/com/google/gwt/aria/client/AlertRole.java
new file mode 100644
index 0000000..28e02ee
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/AlertRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..6adc3ee
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/AlertRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link AlertRole}.
+ */
+class AlertRoleImpl extends Role implements AlertRole {
+  AlertRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/AlertdialogRole.java b/user/src/com/google/gwt/aria/client/AlertdialogRole.java
new file mode 100644
index 0000000..991d04f
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/AlertdialogRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..7ea8f0d
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/AlertdialogRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link AlertdialogRole}.
+ */
+class AlertdialogRoleImpl extends Role implements AlertdialogRole {
+  AlertdialogRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ApplicationRole.java b/user/src/com/google/gwt/aria/client/ApplicationRole.java
new file mode 100644
index 0000000..5c5e796
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ApplicationRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..17238c5
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ApplicationRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ApplicationRole}.
+ */
+class ApplicationRoleImpl extends Role implements ApplicationRole {
+  ApplicationRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ArticleRole.java b/user/src/com/google/gwt/aria/client/ArticleRole.java
new file mode 100644
index 0000000..9a71ccf
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ArticleRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..b4ce96f
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ArticleRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ArticleRole}.
+ */
+class ArticleRoleImpl extends Role implements ArticleRole {
+  ArticleRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/Attribute.java b/user/src/com/google/gwt/aria/client/Attribute.java
new file mode 100644
index 0000000..094e9a4
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/Attribute.java
@@ -0,0 +1,119 @@
+/*
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.AriaAttributeType;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * <p>Class representing ARIA state/property attribute. Contains methods for setting, getting,
+ * removing ARIA attributes for an HTML {@link com.google.gwt.dom.client.Element}.</p>
+ *
+ * <p>For more details about ARIA states and properties check the W3C ARIA documentation
+ * <a href="http://www.w3.org/TR/wai-aria/states_and_properties"> Supported States and Properties
+ * </a>.</p>
+ *
+ * @param <T> The attribute value type
+ */
+public class Attribute<T> {
+  private final String name;
+  private String defaultValue;
+
+  /**
+   * Constructs a state/property ARIA attribute with name {@code name} and {@code defaultValue}.
+   *
+   * @param name State/Property name
+   * @param defaultValue Default values
+   */
+  public Attribute(String name, String defaultValue) {
+    assert name != null : "Name cannot be null";
+    this.name = name;
+    this.defaultValue = defaultValue;
+  }
+
+  /**
+   * Constructs a state/property ARIA attribute with name {@code name} and null default value.
+   *
+   * @param name State/Property name
+   */
+  public Attribute(String name) {
+    this(name, null);
+  }
+
+  /**
+   * Gets the HTML attribute value for the attribute with name {@code name} for element
+   * {@code element}
+   *
+   * @param element HTM element
+   * @return The attribute value for {@code element}
+   */
+  public String get(Element element) {
+    assert element != null : "Element cannot be null.";
+    return element.getAttribute(name);
+  }
+
+  /**
+   * Gets the property/state name
+   *
+   * @return The attribute name
+   */
+  public String getName() {
+    return name;
+  }
+
+  /**
+   * Removes the state/property attribute for element {@code element}.
+   *
+   * @param element HTM element
+   */
+  public void remove(Element element) {
+    assert element != null : "Element cannot be null.";
+    element.removeAttribute(name);
+  }
+
+  /**
+   * Sets the state/property {@code value} for the HTML element {@code element}.
+   *
+   * @param element HTML element
+   * @param value Attribute value
+   */
+  public void set(Element element, T value) {
+    assert element != null : "Element cannot be null.";
+    element.setAttribute(name, getAriaValue(value));
+  }
+
+  /**
+   * Sets the state/property value to the defaultValue if not null. If a list of default values is
+   * set, every default value is converted to string and the string values are concatenated in a
+   * string token list. There is an assertion checking whether the default is null. Note that the
+   * asserts are enabled during development and testing but they will be stripped in production
+   * mode.
+   *
+   * @param element HTML element
+   */
+  public void setDefault(Element element) {
+    assert element != null : "Element cannot be null.";
+    assert defaultValue != null && !defaultValue.isEmpty() : "Default value cannot be null.";
+    element.setAttribute(name, defaultValue);
+  }
+
+  private String getAriaValue(T value) {
+    if (value instanceof AriaAttributeType) {
+      return ((AriaAttributeType) value).getAriaValue();
+    } else {
+      return String.valueOf(value);
+    }
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/BannerRole.java b/user/src/com/google/gwt/aria/client/BannerRole.java
new file mode 100644
index 0000000..b68237c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/BannerRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..a48e1a7
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/BannerRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link BannerRole}.
+ */
+class BannerRoleImpl extends Role implements BannerRole {
+  BannerRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ButtonRole.java b/user/src/com/google/gwt/aria/client/ButtonRole.java
new file mode 100644
index 0000000..72c5cd2
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ButtonRole.java
@@ -0,0 +1,49 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 ButtonRole extends CommandRole {
+  String getAriaExpandedState(Element element);
+
+  String getAriaPressedState(Element element);
+
+  void removeAriaExpandedState(Element element);
+
+  void removeAriaPressedState(Element element);
+
+  void setAriaExpandedState(Element element, BooleanAndUndefined value);
+
+  void setAriaPressedState(Element element, BooleanAndUndefined value);
+}
diff --git a/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java b/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java
new file mode 100644
index 0000000..3e9689d
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java
@@ -0,0 +1,316 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ButtonRole}.
+ */
+class ButtonRoleImpl extends Role implements ButtonRole {
+  ButtonRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaPressedState(Element element) {
+    return State.PRESSED.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaPressedState(Element element) {
+    State.PRESSED.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaPressedState(Element element, BooleanAndUndefined value) {
+    State.PRESSED.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/CheckboxRole.java b/user/src/com/google/gwt/aria/client/CheckboxRole.java
new file mode 100644
index 0000000..9a686ec
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/CheckboxRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 CheckboxRole extends InputRole {
+  String getAriaCheckedState(Element element);
+
+  void removeAriaCheckedState(Element element);
+
+  void setAriaCheckedState(Element element, BooleanAndUndefined value);
+}
diff --git a/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java b/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java
new file mode 100644
index 0000000..10dfd0d
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link CheckboxRole}.
+ */
+class CheckboxRoleImpl extends Role implements CheckboxRole {
+  CheckboxRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaCheckedState(Element element) {
+    return State.CHECKED.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaCheckedState(Element element) {
+    State.CHECKED.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaCheckedState(Element element, BooleanAndUndefined value) {
+    State.CHECKED.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ColumnheaderRole.java b/user/src/com/google/gwt/aria/client/ColumnheaderRole.java
new file mode 100644
index 0000000..19ec9c8
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ColumnheaderRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.PropertyTokenTypes.SortToken;
+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>
+ *
+ * <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 ColumnheaderRole extends GridcellRole, SectionheadRole, WidgetRole {
+  String getAriaSortProperty(Element element);
+
+  void removeAriaSortProperty(Element element);
+
+  void setAriaSortProperty(Element element, SortToken value);
+}
diff --git a/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java b/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java
new file mode 100644
index 0000000..c0a145e
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java
@@ -0,0 +1,362 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.SortToken;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ColumnheaderRole}.
+ */
+class ColumnheaderRoleImpl extends Role implements ColumnheaderRole {
+  ColumnheaderRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaReadonlyProperty(Element element) {
+    return Property.READONLY.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaRequiredProperty(Element element) {
+    return Property.REQUIRED.get(element);
+  }
+
+  @Override
+  public String getAriaSelectedState(Element element) {
+    return State.SELECTED.get(element);
+  }
+
+  @Override
+  public String getAriaSortProperty(Element element) {
+    return Property.SORT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaReadonlyProperty(Element element) {
+    Property.READONLY.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaRequiredProperty(Element element) {
+    Property.REQUIRED.remove(element);
+  }
+
+  @Override
+  public void removeAriaSelectedState(Element element) {
+    State.SELECTED.remove(element);
+  }
+
+  @Override
+  public void removeAriaSortProperty(Element element) {
+    Property.SORT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaReadonlyProperty(Element element, boolean value) {
+    Property.READONLY.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaRequiredProperty(Element element, boolean value) {
+    Property.REQUIRED.set(element, value);
+  }
+
+  @Override
+  public void setAriaSelectedState(Element element, BooleanAndUndefined value) {
+    State.SELECTED.set(element, value);
+  }
+
+  @Override
+  public void setAriaSortProperty(Element element, SortToken value) {
+    Property.SORT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ComboboxRole.java b/user/src/com/google/gwt/aria/client/ComboboxRole.java
new file mode 100644
index 0000000..906b077
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ComboboxRole.java
@@ -0,0 +1,49 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.PropertyTokenTypes.AutocompleteToken;
+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>
+ *
+ * <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 ComboboxRole extends SelectRole {
+  String getAriaAutocompleteProperty(Element element);
+
+  String getAriaRequiredProperty(Element element);
+
+  void removeAriaAutocompleteProperty(Element element);
+
+  void removeAriaRequiredProperty(Element element);
+
+  void setAriaAutocompleteProperty(Element element, AutocompleteToken value);
+
+  void setAriaRequiredProperty(Element element, boolean value);
+}
diff --git a/user/src/com/google/gwt/aria/client/ComboboxRoleImpl.java b/user/src/com/google/gwt/aria/client/ComboboxRoleImpl.java
new file mode 100644
index 0000000..5c45660
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ComboboxRoleImpl.java
@@ -0,0 +1,348 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.AutocompleteToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ComboboxRole}.
+ */
+class ComboboxRoleImpl extends Role implements ComboboxRole {
+  ComboboxRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaAutocompleteProperty(Element element) {
+    return Property.AUTOCOMPLETE.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaRequiredProperty(Element element) {
+    return Property.REQUIRED.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaAutocompleteProperty(Element element) {
+    Property.AUTOCOMPLETE.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaRequiredProperty(Element element) {
+    Property.REQUIRED.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaAutocompleteProperty(Element element, AutocompleteToken value) {
+    Property.AUTOCOMPLETE.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaRequiredProperty(Element element, boolean value) {
+    Property.REQUIRED.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/CommandRole.java b/user/src/com/google/gwt/aria/client/CommandRole.java
new file mode 100644
index 0000000..fd84fb1
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/CommandRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 CommandRole extends WidgetRole {
+}
diff --git a/user/src/com/google/gwt/aria/client/CommonAttributeTypes.java b/user/src/com/google/gwt/aria/client/CommonAttributeTypes.java
new file mode 100644
index 0000000..02862b7
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/CommonAttributeTypes.java
@@ -0,0 +1,129 @@
+/*
+ * 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;
+
+/**
+ *
+ * ARIA attributes common non primitive types as defined by the W3C specification
+ * <a href="http://www.w3.org/TR/wai-aria/">W3C ARIA specification</a>.
+ * Users should use the types defined in this class to get instances of {@link Tristate),
+ * {@link BooleanAndUndefined}, {@link IdReference} and {@link IdReferenceList}.
+ * For more details about ARIA states and properties check
+ * <a href="http://www.w3.org/TR/wai-aria/states_and_properties"> Supported States and Properties
+ * </a>.
+ */
+public final class CommonAttributeTypes {
+  public static final String TRUE_VALUE = "true";
+  public static final String FALSE_VALUE = "false";
+  public static final String MIXED_TRISTATE_VALUE = "mixed";
+  public static final String UNDEFINED_VALUE = "undefined";
+
+  // This class cannot be instanted
+  private CommonAttributeTypes() {
+  }
+  
+  /**
+   * Interface that is and needs to be implemented by ALL non primitive attribute types
+   */
+  public static interface AriaAttributeType {
+    String getAriaValue();
+  }
+
+  /**
+   * Tristate enum type
+   */
+  public static enum Tristate implements AriaAttributeType {
+    TRUE(TRUE_VALUE), FALSE(FALSE_VALUE), MIXED(MIXED_TRISTATE_VALUE);
+
+    private final String value;
+
+    private Tristate(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String getAriaValue() {
+      return value;
+    }
+  }
+
+  /**
+   * Boolean and undefined enum type
+   */
+  public static enum BooleanAndUndefined implements AriaAttributeType {
+    TRUE(TRUE_VALUE), FALSE(FALSE_VALUE), UNDEFINED(UNDEFINED_VALUE);
+
+    private final String value;
+
+    private BooleanAndUndefined(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String getAriaValue() {
+      return value;
+    }
+  }
+
+  /**
+   * Id reference type
+   */
+  public static class IdReference implements AriaAttributeType {
+    private final String id;
+
+    /**
+     * An instance of {@link IdReference} is created.
+     *
+     * @param value String id value
+     */
+    public IdReference(String value) {
+      this.id = value;
+    }
+
+    @Override
+    public String getAriaValue() {
+      return id;
+    }
+  }
+
+  /**
+   * Id reference list type
+   */
+  public static class IdReferenceList implements AriaAttributeType {
+    private final String ids;
+
+    /**
+     * An instance of {@link IdReferenceList} is created.
+     *
+     * @param values String ids array
+     */
+    public IdReferenceList(String... values) {
+      assert values.length > 0 : "The ids cannot be empty";
+      StringBuffer ariaValue = new StringBuffer();
+      for (String value : values) {
+        ariaValue.append(value).append(" ");
+      }
+      ids = ariaValue.toString().trim();
+    }
+
+    /**
+     * Creates a String token list
+     */
+    @Override
+    public String getAriaValue() {
+      return ids;
+    }
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ComplementaryRole.java b/user/src/com/google/gwt/aria/client/ComplementaryRole.java
new file mode 100644
index 0000000..6718741
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ComplementaryRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..a27295c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ComplementaryRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ComplementaryRole}.
+ */
+class ComplementaryRoleImpl extends Role implements ComplementaryRole {
+  ComplementaryRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/CompositeRole.java b/user/src/com/google/gwt/aria/client/CompositeRole.java
new file mode 100644
index 0000000..07eca66
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/CompositeRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+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>
+ *
+ * <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 CompositeRole extends WidgetRole {
+  String getAriaActivedescendantProperty(Element element);
+
+  void removeAriaActivedescendantProperty(Element element);
+
+  void setAriaActivedescendantProperty(Element element, IdReference value);
+}
diff --git a/user/src/com/google/gwt/aria/client/ContentinfoRole.java b/user/src/com/google/gwt/aria/client/ContentinfoRole.java
new file mode 100644
index 0000000..7382d3a
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ContentinfoRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..2d3c29e
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ContentinfoRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ContentinfoRole}.
+ */
+class ContentinfoRoleImpl extends Role implements ContentinfoRole {
+  ContentinfoRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/DefinitionRole.java b/user/src/com/google/gwt/aria/client/DefinitionRole.java
new file mode 100644
index 0000000..64dce8c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/DefinitionRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..d5a240e
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/DefinitionRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link DefinitionRole}.
+ */
+class DefinitionRoleImpl extends Role implements DefinitionRole {
+  DefinitionRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/DialogRole.java b/user/src/com/google/gwt/aria/client/DialogRole.java
new file mode 100644
index 0000000..588f227
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/DialogRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..c4b3e99
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/DialogRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link DialogRole}.
+ */
+class DialogRoleImpl extends Role implements DialogRole {
+  DialogRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/DirectoryRole.java b/user/src/com/google/gwt/aria/client/DirectoryRole.java
new file mode 100644
index 0000000..733d289
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/DirectoryRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..0168a9a
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/DirectoryRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link DirectoryRole}.
+ */
+class DirectoryRoleImpl extends Role implements DirectoryRole {
+  DirectoryRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/DocumentRole.java b/user/src/com/google/gwt/aria/client/DocumentRole.java
new file mode 100644
index 0000000..fc6118d
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/DocumentRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 DocumentRole extends StructureRole {
+  String getAriaExpandedState(Element element);
+
+  void removeAriaExpandedState(Element element);
+
+  void setAriaExpandedState(Element element, BooleanAndUndefined value);
+}
diff --git a/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java b/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java
new file mode 100644
index 0000000..872fee8
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link DocumentRole}.
+ */
+class DocumentRoleImpl extends Role implements DocumentRole {
+  DocumentRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ExtraAttribute.java b/user/src/com/google/gwt/aria/client/ExtraAttribute.java
new file mode 100644
index 0000000..f9ba389
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ExtraAttribute.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * Defines additional attributes that are interpreted by readers. Such an attribute is
+ * 'tabindex' which indicates the tab order position of the element.
+ *
+ * @param <T> The extra attribute value type
+ */
+public final class ExtraAttribute<T> extends Attribute<T> {
+  public static final ExtraAttribute<Integer> TABINDEX =
+      new ExtraAttribute<Integer>("tabindex", "");
+
+
+  public ExtraAttribute(String name) {
+    super(name);
+  }
+
+  public ExtraAttribute(String name, String defaultValue) {
+    super(name, defaultValue);
+  }
+}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/aria/client/FormRole.java b/user/src/com/google/gwt/aria/client/FormRole.java
new file mode 100644
index 0000000..e238a0c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/FormRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..896a735
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/FormRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link FormRole}.
+ */
+class FormRoleImpl extends Role implements FormRole {
+  FormRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/GridRole.java b/user/src/com/google/gwt/aria/client/GridRole.java
new file mode 100644
index 0000000..5536c2d
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/GridRole.java
@@ -0,0 +1,54 @@
+/**
+ * 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;
+
+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>
+ *
+ * <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 GridRole extends CompositeRole, RegionRole {
+  String getAriaLevelProperty(Element element);
+
+  String getAriaMultiselectableProperty(Element element);
+
+  String getAriaReadonlyProperty(Element element);
+
+  void removeAriaLevelProperty(Element element);
+
+  void removeAriaMultiselectableProperty(Element element);
+
+  void removeAriaReadonlyProperty(Element element);
+
+  void setAriaLevelProperty(Element element, int value);
+
+  void setAriaMultiselectableProperty(Element element, boolean value);
+
+  void setAriaReadonlyProperty(Element element, boolean value);
+}
diff --git a/user/src/com/google/gwt/aria/client/GridRoleImpl.java b/user/src/com/google/gwt/aria/client/GridRoleImpl.java
new file mode 100644
index 0000000..07ad316
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/GridRoleImpl.java
@@ -0,0 +1,362 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link GridRole}.
+ */
+class GridRoleImpl extends Role implements GridRole {
+  GridRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLevelProperty(Element element) {
+    return Property.LEVEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaMultiselectableProperty(Element element) {
+    return Property.MULTISELECTABLE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaReadonlyProperty(Element element) {
+    return Property.READONLY.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLevelProperty(Element element) {
+    Property.LEVEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaMultiselectableProperty(Element element) {
+    Property.MULTISELECTABLE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaReadonlyProperty(Element element) {
+    Property.READONLY.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLevelProperty(Element element, int value) {
+    Property.LEVEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaMultiselectableProperty(Element element, boolean value) {
+    Property.MULTISELECTABLE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaReadonlyProperty(Element element, boolean value) {
+    Property.READONLY.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/GridcellRole.java b/user/src/com/google/gwt/aria/client/GridcellRole.java
new file mode 100644
index 0000000..ee50619
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/GridcellRole.java
@@ -0,0 +1,55 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 GridcellRole extends SectionRole, WidgetRole {
+  String getAriaReadonlyProperty(Element element);
+
+  String getAriaRequiredProperty(Element element);
+
+  String getAriaSelectedState(Element element);
+
+  void removeAriaReadonlyProperty(Element element);
+
+  void removeAriaRequiredProperty(Element element);
+
+  void removeAriaSelectedState(Element element);
+
+  void setAriaReadonlyProperty(Element element, boolean value);
+
+  void setAriaRequiredProperty(Element element, boolean value);
+
+  void setAriaSelectedState(Element element, BooleanAndUndefined value);
+}
diff --git a/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java b/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java
new file mode 100644
index 0000000..55051b2
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java
@@ -0,0 +1,346 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link GridcellRole}.
+ */
+class GridcellRoleImpl extends Role implements GridcellRole {
+  GridcellRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaReadonlyProperty(Element element) {
+    return Property.READONLY.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaRequiredProperty(Element element) {
+    return Property.REQUIRED.get(element);
+  }
+
+  @Override
+  public String getAriaSelectedState(Element element) {
+    return State.SELECTED.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaReadonlyProperty(Element element) {
+    Property.READONLY.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaRequiredProperty(Element element) {
+    Property.REQUIRED.remove(element);
+  }
+
+  @Override
+  public void removeAriaSelectedState(Element element) {
+    State.SELECTED.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaReadonlyProperty(Element element, boolean value) {
+    Property.READONLY.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaRequiredProperty(Element element, boolean value) {
+    Property.REQUIRED.set(element, value);
+  }
+
+  @Override
+  public void setAriaSelectedState(Element element, BooleanAndUndefined value) {
+    State.SELECTED.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/GroupRole.java b/user/src/com/google/gwt/aria/client/GroupRole.java
new file mode 100644
index 0000000..f898cd2
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/GroupRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+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>
+ *
+ * <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 GroupRole extends SectionRole {
+  String getAriaActivedescendantProperty(Element element);
+
+  void removeAriaActivedescendantProperty(Element element);
+
+  void setAriaActivedescendantProperty(Element element, IdReference value);
+}
diff --git a/user/src/com/google/gwt/aria/client/GroupRoleImpl.java b/user/src/com/google/gwt/aria/client/GroupRoleImpl.java
new file mode 100644
index 0000000..c859292
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/GroupRoleImpl.java
@@ -0,0 +1,317 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link GroupRole}.
+ */
+class GroupRoleImpl extends Role implements GroupRole {
+  GroupRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/HeadingRole.java b/user/src/com/google/gwt/aria/client/HeadingRole.java
new file mode 100644
index 0000000..2f7797e
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/HeadingRole.java
@@ -0,0 +1,42 @@
+/**
+ * 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;
+
+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>
+ *
+ * <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 HeadingRole extends SectionheadRole {
+  String getAriaLevelProperty(Element element);
+
+  void removeAriaLevelProperty(Element element);
+
+  void setAriaLevelProperty(Element element, int value);
+}
diff --git a/user/src/com/google/gwt/aria/client/HeadingRoleImpl.java b/user/src/com/google/gwt/aria/client/HeadingRoleImpl.java
new file mode 100644
index 0000000..ec4752c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/HeadingRoleImpl.java
@@ -0,0 +1,316 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link HeadingRole}.
+ */
+class HeadingRoleImpl extends Role implements HeadingRole {
+  HeadingRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLevelProperty(Element element) {
+    return Property.LEVEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLevelProperty(Element element) {
+    Property.LEVEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLevelProperty(Element element, int value) {
+    Property.LEVEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ImgRole.java b/user/src/com/google/gwt/aria/client/ImgRole.java
new file mode 100644
index 0000000..4bacca3
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ImgRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..2544478
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ImgRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ImgRole}.
+ */
+class ImgRoleImpl extends Role implements ImgRole {
+  ImgRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/InputRole.java b/user/src/com/google/gwt/aria/client/InputRole.java
new file mode 100644
index 0000000..3fa9d1f
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/InputRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..fa5f760
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/LandmarkRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..2432e0b
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/LinkRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 LinkRole extends CommandRole {
+  String getAriaExpandedState(Element element);
+
+  void removeAriaExpandedState(Element element);
+
+  void setAriaExpandedState(Element element, BooleanAndUndefined value);
+}
diff --git a/user/src/com/google/gwt/aria/client/LinkRoleImpl.java b/user/src/com/google/gwt/aria/client/LinkRoleImpl.java
new file mode 100644
index 0000000..b94f99e
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/LinkRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link LinkRole}.
+ */
+class LinkRoleImpl extends Role implements LinkRole {
+  LinkRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ListRole.java b/user/src/com/google/gwt/aria/client/ListRole.java
new file mode 100644
index 0000000..e88c513
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ListRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..4878654
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ListRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ListRole}.
+ */
+class ListRoleImpl extends Role implements ListRole {
+  ListRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ListboxRole.java b/user/src/com/google/gwt/aria/client/ListboxRole.java
new file mode 100644
index 0000000..83f51b9
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ListboxRole.java
@@ -0,0 +1,48 @@
+/**
+ * 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;
+
+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>
+ *
+ * <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 ListboxRole extends ListRole, SelectRole {
+  String getAriaMultiselectableProperty(Element element);
+
+  String getAriaRequiredProperty(Element element);
+
+  void removeAriaMultiselectableProperty(Element element);
+
+  void removeAriaRequiredProperty(Element element);
+
+  void setAriaMultiselectableProperty(Element element, boolean value);
+
+  void setAriaRequiredProperty(Element element, boolean value);
+}
diff --git a/user/src/com/google/gwt/aria/client/ListboxRoleImpl.java b/user/src/com/google/gwt/aria/client/ListboxRoleImpl.java
new file mode 100644
index 0000000..86f4d3a
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ListboxRoleImpl.java
@@ -0,0 +1,347 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ListboxRole}.
+ */
+class ListboxRoleImpl extends Role implements ListboxRole {
+  ListboxRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaMultiselectableProperty(Element element) {
+    return Property.MULTISELECTABLE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaRequiredProperty(Element element) {
+    return Property.REQUIRED.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaMultiselectableProperty(Element element) {
+    Property.MULTISELECTABLE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaRequiredProperty(Element element) {
+    Property.REQUIRED.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaMultiselectableProperty(Element element, boolean value) {
+    Property.MULTISELECTABLE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaRequiredProperty(Element element, boolean value) {
+    Property.REQUIRED.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ListitemRole.java b/user/src/com/google/gwt/aria/client/ListitemRole.java
new file mode 100644
index 0000000..81d3bff
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ListitemRole.java
@@ -0,0 +1,54 @@
+/**
+ * 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;
+
+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>
+ *
+ * <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 ListitemRole extends SectionRole {
+  String getAriaLevelProperty(Element element);
+
+  String getAriaPosinsetProperty(Element element);
+
+  String getAriaSetsizeProperty(Element element);
+
+  void removeAriaLevelProperty(Element element);
+
+  void removeAriaPosinsetProperty(Element element);
+
+  void removeAriaSetsizeProperty(Element element);
+
+  void setAriaLevelProperty(Element element, int value);
+
+  void setAriaPosinsetProperty(Element element, int value);
+
+  void setAriaSetsizeProperty(Element element, int value);
+}
diff --git a/user/src/com/google/gwt/aria/client/ListitemRoleImpl.java b/user/src/com/google/gwt/aria/client/ListitemRoleImpl.java
new file mode 100644
index 0000000..e46a4d9
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ListitemRoleImpl.java
@@ -0,0 +1,346 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ListitemRole}.
+ */
+class ListitemRoleImpl extends Role implements ListitemRole {
+  ListitemRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLevelProperty(Element element) {
+    return Property.LEVEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaPosinsetProperty(Element element) {
+    return Property.POSINSET.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaSetsizeProperty(Element element) {
+    return Property.SETSIZE.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLevelProperty(Element element) {
+    Property.LEVEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaPosinsetProperty(Element element) {
+    Property.POSINSET.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaSetsizeProperty(Element element) {
+    Property.SETSIZE.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLevelProperty(Element element, int value) {
+    Property.LEVEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaPosinsetProperty(Element element, int value) {
+    Property.POSINSET.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaSetsizeProperty(Element element, int value) {
+    Property.SETSIZE.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/LogRole.java b/user/src/com/google/gwt/aria/client/LogRole.java
new file mode 100644
index 0000000..6cfd188
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/LogRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..ce074f1
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/LogRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link LogRole}.
+ */
+class LogRoleImpl extends Role implements LogRole {
+  LogRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/MainRole.java b/user/src/com/google/gwt/aria/client/MainRole.java
new file mode 100644
index 0000000..14675b8
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MainRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..42ff686
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MainRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link MainRole}.
+ */
+class MainRoleImpl extends Role implements MainRole {
+  MainRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/MarqueeRole.java b/user/src/com/google/gwt/aria/client/MarqueeRole.java
new file mode 100644
index 0000000..341a1e1
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MarqueeRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..0f35e1e
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MarqueeRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link MarqueeRole}.
+ */
+class MarqueeRoleImpl extends Role implements MarqueeRole {
+  MarqueeRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/MathRole.java b/user/src/com/google/gwt/aria/client/MathRole.java
new file mode 100644
index 0000000..8a7d9b5
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MathRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..81f8030
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MathRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link MathRole}.
+ */
+class MathRoleImpl extends Role implements MathRole {
+  MathRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/MenuRole.java b/user/src/com/google/gwt/aria/client/MenuRole.java
new file mode 100644
index 0000000..29d8e8a
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MenuRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..b73b32b
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MenuRoleImpl.java
@@ -0,0 +1,317 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link MenuRole}.
+ */
+class MenuRoleImpl extends Role implements MenuRole {
+  MenuRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/MenubarRole.java b/user/src/com/google/gwt/aria/client/MenubarRole.java
new file mode 100644
index 0000000..d613866
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MenubarRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..fd85ce6
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MenubarRoleImpl.java
@@ -0,0 +1,317 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link MenubarRole}.
+ */
+class MenubarRoleImpl extends Role implements MenubarRole {
+  MenubarRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/MenuitemRole.java b/user/src/com/google/gwt/aria/client/MenuitemRole.java
new file mode 100644
index 0000000..4a018e7
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MenuitemRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..97eb233
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MenuitemRoleImpl.java
@@ -0,0 +1,286 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link MenuitemRole}.
+ */
+class MenuitemRoleImpl extends Role implements MenuitemRole {
+  MenuitemRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/MenuitemcheckboxRole.java b/user/src/com/google/gwt/aria/client/MenuitemcheckboxRole.java
new file mode 100644
index 0000000..2ece737
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MenuitemcheckboxRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..2a4258c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MenuitemcheckboxRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link MenuitemcheckboxRole}.
+ */
+class MenuitemcheckboxRoleImpl extends Role implements MenuitemcheckboxRole {
+  MenuitemcheckboxRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaCheckedState(Element element) {
+    return State.CHECKED.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaCheckedState(Element element) {
+    State.CHECKED.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaCheckedState(Element element, BooleanAndUndefined value) {
+    State.CHECKED.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/MenuitemradioRole.java b/user/src/com/google/gwt/aria/client/MenuitemradioRole.java
new file mode 100644
index 0000000..1346217
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MenuitemradioRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..21b048f
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/MenuitemradioRoleImpl.java
@@ -0,0 +1,346 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link MenuitemradioRole}.
+ */
+class MenuitemradioRoleImpl extends Role implements MenuitemradioRole {
+  MenuitemradioRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaCheckedState(Element element) {
+    return State.CHECKED.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaPosinsetProperty(Element element) {
+    return Property.POSINSET.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaSelectedState(Element element) {
+    return State.SELECTED.get(element);
+  }
+
+  @Override
+  public String getAriaSetsizeProperty(Element element) {
+    return Property.SETSIZE.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaCheckedState(Element element) {
+    State.CHECKED.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaPosinsetProperty(Element element) {
+    Property.POSINSET.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaSelectedState(Element element) {
+    State.SELECTED.remove(element);
+  }
+
+  @Override
+  public void removeAriaSetsizeProperty(Element element) {
+    Property.SETSIZE.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaCheckedState(Element element, BooleanAndUndefined value) {
+    State.CHECKED.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaPosinsetProperty(Element element, int value) {
+    Property.POSINSET.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaSelectedState(Element element, BooleanAndUndefined value) {
+    State.SELECTED.set(element, value);
+  }
+
+  @Override
+  public void setAriaSetsizeProperty(Element element, int value) {
+    Property.SETSIZE.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/NavigationRole.java b/user/src/com/google/gwt/aria/client/NavigationRole.java
new file mode 100644
index 0000000..fe206f7
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/NavigationRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..739155c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/NavigationRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link NavigationRole}.
+ */
+class NavigationRoleImpl extends Role implements NavigationRole {
+  NavigationRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/NoteRole.java b/user/src/com/google/gwt/aria/client/NoteRole.java
new file mode 100644
index 0000000..588f97b
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/NoteRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..630e9ee
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/NoteRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link NoteRole}.
+ */
+class NoteRoleImpl extends Role implements NoteRole {
+  NoteRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/OptionRole.java b/user/src/com/google/gwt/aria/client/OptionRole.java
new file mode 100644
index 0000000..085d0e5
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/OptionRole.java
@@ -0,0 +1,61 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 OptionRole extends InputRole {
+  String getAriaCheckedState(Element element);
+
+  String getAriaPosinsetProperty(Element element);
+
+  String getAriaSelectedState(Element element);
+
+  String getAriaSetsizeProperty(Element element);
+
+  void removeAriaCheckedState(Element element);
+
+  void removeAriaPosinsetProperty(Element element);
+
+  void removeAriaSelectedState(Element element);
+
+  void removeAriaSetsizeProperty(Element element);
+
+  void setAriaCheckedState(Element element, BooleanAndUndefined value);
+
+  void setAriaPosinsetProperty(Element element, int value);
+
+  void setAriaSelectedState(Element element, BooleanAndUndefined value);
+
+  void setAriaSetsizeProperty(Element element, int value);
+}
diff --git a/user/src/com/google/gwt/aria/client/OptionRoleImpl.java b/user/src/com/google/gwt/aria/client/OptionRoleImpl.java
new file mode 100644
index 0000000..292de3c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/OptionRoleImpl.java
@@ -0,0 +1,346 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link OptionRole}.
+ */
+class OptionRoleImpl extends Role implements OptionRole {
+  OptionRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaCheckedState(Element element) {
+    return State.CHECKED.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaPosinsetProperty(Element element) {
+    return Property.POSINSET.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaSelectedState(Element element) {
+    return State.SELECTED.get(element);
+  }
+
+  @Override
+  public String getAriaSetsizeProperty(Element element) {
+    return Property.SETSIZE.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaCheckedState(Element element) {
+    State.CHECKED.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaPosinsetProperty(Element element) {
+    Property.POSINSET.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaSelectedState(Element element) {
+    State.SELECTED.remove(element);
+  }
+
+  @Override
+  public void removeAriaSetsizeProperty(Element element) {
+    Property.SETSIZE.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaCheckedState(Element element, BooleanAndUndefined value) {
+    State.CHECKED.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaPosinsetProperty(Element element, int value) {
+    Property.POSINSET.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaSelectedState(Element element, BooleanAndUndefined value) {
+    State.SELECTED.set(element, value);
+  }
+
+  @Override
+  public void setAriaSetsizeProperty(Element element, int value) {
+    Property.SETSIZE.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/PresentationRole.java b/user/src/com/google/gwt/aria/client/PresentationRole.java
new file mode 100644
index 0000000..61ad6a0
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/PresentationRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..07ceca7
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/PresentationRoleImpl.java
@@ -0,0 +1,286 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link PresentationRole}.
+ */
+class PresentationRoleImpl extends Role implements PresentationRole {
+  PresentationRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ProgressbarRole.java b/user/src/com/google/gwt/aria/client/ProgressbarRole.java
new file mode 100644
index 0000000..3122f9c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ProgressbarRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..f741d14
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ProgressbarRoleImpl.java
@@ -0,0 +1,346 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ProgressbarRole}.
+ */
+class ProgressbarRoleImpl extends Role implements ProgressbarRole {
+  ProgressbarRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaValuemaxProperty(Element element) {
+    return Property.VALUEMAX.get(element);
+  }
+
+  @Override
+  public String getAriaValueminProperty(Element element) {
+    return Property.VALUEMIN.get(element);
+  }
+
+  @Override
+  public String getAriaValuenowProperty(Element element) {
+    return Property.VALUENOW.get(element);
+  }
+
+  @Override
+  public String getAriaValuetextProperty(Element element) {
+    return Property.VALUETEXT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuemaxProperty(Element element) {
+    Property.VALUEMAX.remove(element);
+  }
+
+  @Override
+  public void removeAriaValueminProperty(Element element) {
+    Property.VALUEMIN.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuenowProperty(Element element) {
+    Property.VALUENOW.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuetextProperty(Element element) {
+    Property.VALUETEXT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuemaxProperty(Element element, Number value) {
+    Property.VALUEMAX.set(element, value);
+  }
+
+  @Override
+  public void setAriaValueminProperty(Element element, Number value) {
+    Property.VALUEMIN.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuenowProperty(Element element, Number value) {
+    Property.VALUENOW.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuetextProperty(Element element, String value) {
+    Property.VALUETEXT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/Property.java b/user/src/com/google/gwt/aria/client/Property.java
new file mode 100644
index 0000000..850ffa8
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/Property.java
@@ -0,0 +1,137 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.AutocompleteToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.OrientationToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.SortToken;
+
+/**
+ * <p>Class that contains constants for all ARIA properties as defined by the W3C specification
+ * <a href="http://www.w3.org/TR/wai-aria/">W3C ARIA specification</a>.</p>
+ *
+ * <p>An ARIA property is a characteristic feature of a widget/control that can change over time but
+ * more rare than the ARIA state and is often not changed as a result of user action.<p>
+ *
+ * <p>The following groups of properties exist:
+ * <ol>
+ * <li>Widget properties -- specific to common user interface elements found on GUI systems or
+ * in rich Internet applications which receive user input and process user actions</li>
+ * <li>Live Region properties -- specific to live regions in rich Internet applications; may be
+ * applied to any element; indicate that content changes may occur without the element having
+ * focus, and provides assistive technologies with information on how to process those content
+ * updates. </li>
+ * <li>Drag-and-drop states -- indicates information about draggable elements and their drop
+ * targets</li>
+ * <li>Relationship properties -- indicates relationships or associations between elements which
+ * cannot be readily determined from the document structure</li>
+ * </ol>
+ * </p>
+ *
+ * @param <T> The property value type
+ */
+public final class Property<T> extends Attribute<T> {
+  public static final Property<IdReference> ACTIVEDESCENDANT =
+      new Property<IdReference>("aria-activedescendant", "");
+
+  public static final Property<Boolean> ATOMIC =
+      new Property<Boolean>("aria-atomic", "false");
+
+  public static final Property<AutocompleteToken> AUTOCOMPLETE =
+      new Property<AutocompleteToken>("aria-autocomplete", "none");
+
+  public static final Property<IdReferenceList> CONTROLS =
+      new Property<IdReferenceList>("aria-controls", "");
+
+  public static final Property<IdReferenceList> DESCRIBEDBY =
+      new Property<IdReferenceList>("aria-describedby", "");
+
+  public static final Property<DropeffectTokenList> DROPEFFECT =
+      new Property<DropeffectTokenList>("aria-dropeffect", "none");
+
+  public static final Property<IdReferenceList> FLOWTO =
+      new Property<IdReferenceList>("aria-flowto", "");
+
+  public static final Property<Boolean> HASPOPUP =
+      new Property<Boolean>("aria-haspopup", "false");
+
+  public static final Property<String> LABEL =
+      new Property<String>("aria-label", "");
+
+  public static final Property<IdReferenceList> LABELLEDBY =
+      new Property<IdReferenceList>("aria-labelledby", "");
+
+  public static final Property<Integer> LEVEL =
+      new Property<Integer>("aria-level", "");
+
+  public static final Property<LiveToken> LIVE =
+      new Property<LiveToken>("aria-live", "off");
+
+  public static final Property<Boolean> MULTILINE =
+      new Property<Boolean>("aria-multiline", "false");
+
+  public static final Property<Boolean> MULTISELECTABLE =
+      new Property<Boolean>("aria-multiselectable", "false");
+
+  public static final Property<OrientationToken> ORIENTATION =
+      new Property<OrientationToken>("aria-orientation", "vertical");
+
+  public static final Property<IdReferenceList> OWNS =
+      new Property<IdReferenceList>("aria-owns", "");
+
+  public static final Property<Integer> POSINSET =
+      new Property<Integer>("aria-posinset", "");
+
+  public static final Property<Boolean> READONLY =
+      new Property<Boolean>("aria-readonly", "false");
+
+  public static final Property<RelevantTokenList> RELEVANT =
+      new Property<RelevantTokenList>("aria-relevant", "additions text");
+
+  public static final Property<Boolean> REQUIRED =
+      new Property<Boolean>("aria-required", "false");
+
+  public static final Property<Integer> SETSIZE =
+      new Property<Integer>("aria-setsize", "");
+
+  public static final Property<SortToken> SORT =
+      new Property<SortToken>("aria-sort", "none");
+
+  public static final Property<Number> VALUEMAX =
+      new Property<Number>("aria-valuemax", "");
+
+  public static final Property<Number> VALUEMIN =
+      new Property<Number>("aria-valuemin", "");
+
+  public static final Property<Number> VALUENOW =
+      new Property<Number>("aria-valuenow", "");
+
+  public static final Property<String> VALUETEXT =
+      new Property<String>("aria-valuetext", "");
+
+
+  public Property(String name) {
+    super(name);
+  }
+
+  public Property(String name, String defaultValue) {
+    super(name, defaultValue);
+  }
+}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/aria/client/PropertyTokenTypes.java b/user/src/com/google/gwt/aria/client/PropertyTokenTypes.java
new file mode 100644
index 0000000..4ad727b
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/PropertyTokenTypes.java
@@ -0,0 +1,172 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.AriaAttributeType;
+
+/**
+ * Token type enums for Property ARIA attributes
+ */
+public final class PropertyTokenTypes {
+  /**
+   * AutocompleteToken enum type
+   */
+  public static enum AutocompleteToken implements AriaAttributeType {
+    INLINE("inline"), LIST("list"), BOTH("both"), NONE("none");
+
+    private final String value;
+
+    private AutocompleteToken(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String getAriaValue() {
+      return value;
+    }
+  }
+
+  /**
+   * DropeffectToken enum type
+   */
+  public static enum DropeffectToken implements AriaAttributeType {
+    COPY("copy"), MOVE("move"), LINK("link"), EXECUTE("execute"), POPUP("popup"), NONE("none");
+
+    private final String value;
+
+    private DropeffectToken(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String getAriaValue() {
+      return value;
+    }
+  }
+
+  /**
+   * DropeffectTokenList tokens class type
+   */
+  public static final class DropeffectTokenList implements AriaAttributeType {
+
+    private final DropeffectToken[] tokens;
+
+    public DropeffectTokenList(DropeffectToken... tokens) {
+      this.tokens = tokens;
+    }
+
+    @Override
+    public String getAriaValue() {
+      StringBuffer buf = new StringBuffer();
+       for (DropeffectToken token : tokens) {
+         buf.append(token.getAriaValue()).append(" ");
+      }
+      return buf.toString().trim();
+    }
+  }
+
+  /**
+   * LiveToken enum type
+   */
+  public static enum LiveToken implements AriaAttributeType {
+    OFF("off"), POLITE("polite"), ASSERTIVE("assertive");
+
+    private final String value;
+
+    private LiveToken(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String getAriaValue() {
+      return value;
+    }
+  }
+
+  /**
+   * OrientationToken enum type
+   */
+  public static enum OrientationToken implements AriaAttributeType {
+    HORIZONTAL("horizontal"), VERTICAL("vertical");
+
+    private final String value;
+
+    private OrientationToken(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String getAriaValue() {
+      return value;
+    }
+  }
+
+  /**
+   * RelevantToken enum type
+   */
+  public static enum RelevantToken implements AriaAttributeType {
+    ADDITIONS("additions"), REMOVALS("removals"), TEXT("text"), ALL("all");
+
+    private final String value;
+
+    private RelevantToken(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String getAriaValue() {
+      return value;
+    }
+  }
+
+  /**
+   * RelevantTokenList tokens class type
+   */
+  public static final class RelevantTokenList implements AriaAttributeType {
+
+    private final RelevantToken[] tokens;
+
+    public RelevantTokenList(RelevantToken... tokens) {
+      this.tokens = tokens;
+    }
+
+    @Override
+    public String getAriaValue() {
+      StringBuffer buf = new StringBuffer();
+       for (RelevantToken token : tokens) {
+         buf.append(token.getAriaValue()).append(" ");
+      }
+      return buf.toString().trim();
+    }
+  }
+
+  /**
+   * SortToken enum type
+   */
+  public static enum SortToken implements AriaAttributeType {
+    ASCENDING("ascending"), DESCENDING("descending"), NONE("none"), OTHER("other");
+
+    private final String value;
+
+    private SortToken(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String getAriaValue() {
+      return value;
+    }
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/RadioRole.java b/user/src/com/google/gwt/aria/client/RadioRole.java
new file mode 100644
index 0000000..1fc9ce3
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RadioRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..c431c5e
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RadioRoleImpl.java
@@ -0,0 +1,346 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link RadioRole}.
+ */
+class RadioRoleImpl extends Role implements RadioRole {
+  RadioRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaCheckedState(Element element) {
+    return State.CHECKED.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaPosinsetProperty(Element element) {
+    return Property.POSINSET.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaSelectedState(Element element) {
+    return State.SELECTED.get(element);
+  }
+
+  @Override
+  public String getAriaSetsizeProperty(Element element) {
+    return Property.SETSIZE.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaCheckedState(Element element) {
+    State.CHECKED.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaPosinsetProperty(Element element) {
+    Property.POSINSET.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaSelectedState(Element element) {
+    State.SELECTED.remove(element);
+  }
+
+  @Override
+  public void removeAriaSetsizeProperty(Element element) {
+    Property.SETSIZE.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaCheckedState(Element element, BooleanAndUndefined value) {
+    State.CHECKED.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaPosinsetProperty(Element element, int value) {
+    Property.POSINSET.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaSelectedState(Element element, BooleanAndUndefined value) {
+    State.SELECTED.set(element, value);
+  }
+
+  @Override
+  public void setAriaSetsizeProperty(Element element, int value) {
+    Property.SETSIZE.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/RadiogroupRole.java b/user/src/com/google/gwt/aria/client/RadiogroupRole.java
new file mode 100644
index 0000000..30b1f55
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RadiogroupRole.java
@@ -0,0 +1,42 @@
+/**
+ * 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;
+
+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>
+ *
+ * <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 RadiogroupRole extends SelectRole {
+  String getAriaRequiredProperty(Element element);
+
+  void removeAriaRequiredProperty(Element element);
+
+  void setAriaRequiredProperty(Element element, boolean value);
+}
diff --git a/user/src/com/google/gwt/aria/client/RadiogroupRoleImpl.java b/user/src/com/google/gwt/aria/client/RadiogroupRoleImpl.java
new file mode 100644
index 0000000..86bcb12
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RadiogroupRoleImpl.java
@@ -0,0 +1,332 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link RadiogroupRole}.
+ */
+class RadiogroupRoleImpl extends Role implements RadiogroupRole {
+  RadiogroupRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaRequiredProperty(Element element) {
+    return Property.REQUIRED.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaRequiredProperty(Element element) {
+    Property.REQUIRED.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaRequiredProperty(Element element, boolean value) {
+    Property.REQUIRED.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/RangeRole.java b/user/src/com/google/gwt/aria/client/RangeRole.java
new file mode 100644
index 0000000..b7bbedef
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RangeRole.java
@@ -0,0 +1,60 @@
+/**
+ * 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;
+
+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>
+ *
+ * <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 RangeRole extends WidgetRole {
+  String getAriaValuemaxProperty(Element element);
+
+  String getAriaValueminProperty(Element element);
+
+  String getAriaValuenowProperty(Element element);
+
+  String getAriaValuetextProperty(Element element);
+
+  void removeAriaValuemaxProperty(Element element);
+
+  void removeAriaValueminProperty(Element element);
+
+  void removeAriaValuenowProperty(Element element);
+
+  void removeAriaValuetextProperty(Element element);
+
+  void setAriaValuemaxProperty(Element element, Number value);
+
+  void setAriaValueminProperty(Element element, Number value);
+
+  void setAriaValuenowProperty(Element element, Number value);
+
+  void setAriaValuetextProperty(Element element, String value);
+}
diff --git a/user/src/com/google/gwt/aria/client/RegionRole.java b/user/src/com/google/gwt/aria/client/RegionRole.java
new file mode 100644
index 0000000..aa494c1
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RegionRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..76da60b
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RegionRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link RegionRole}.
+ */
+class RegionRoleImpl extends Role implements RegionRole {
+  RegionRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/Role.java b/user/src/com/google/gwt/aria/client/Role.java
new file mode 100644
index 0000000..3d7c4dd
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/Role.java
@@ -0,0 +1,82 @@
+/*
+ * 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;
+
+import com.google.gwt.dom.client.Element;
+
+/**
+ * <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>This class defines some of the supported operations for a role -- set/get/remove
+ * role to/from a DOM 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 class Role {
+  public static final String ATTR_NAME_ROLE = "role";
+  private final String roleName;
+
+  public Role(String roleName) {
+    assert roleName != null : "Role name cannot be null";
+    this.roleName = roleName;
+  }
+
+  /**
+   * Gets the role for the element {@code element}. If none is set, "" is returned.
+   *
+   * @param element HTML element
+   * @return The role attribute value
+   */
+  public String get(Element element) {
+    assert element != null : "Element cannot be null.";
+    return element.getAttribute(ATTR_NAME_ROLE);
+  }
+
+  /**
+   * Gets the role name
+   *
+   * @return The role name
+   */
+  public String getName() {
+    return roleName;
+  }
+
+  /**
+   * Removes the role for element {@code element}
+   *
+   * @param element HTML element
+   */
+  public void remove(Element element) {
+    assert element != null : "Element cannot be null.";
+    element.removeAttribute(ATTR_NAME_ROLE);
+  }
+
+  /**
+   * Sets the role to element {@code element}
+   *
+   * @param element HTML element
+   */
+  public void set(Element element) {
+    assert element != null : "Element cannot be null.";
+    element.setAttribute(ATTR_NAME_ROLE, roleName);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/Roles.java b/user/src/com/google/gwt/aria/client/Roles.java
new file mode 100644
index 0000000..37255ae
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/Roles.java
@@ -0,0 +1,364 @@
+/**
+ * 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;
+
+/**
+ * <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>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>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>
+ *
+ * <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>There are 4 groups of roles:
+ * <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>
+ * </ol>
+ * </p>
+ *
+ * <p>For more details about ARIA roles check <a href="http://www.w3.org/TR/wai-aria/roles"></p>
+ */
+public final class Roles {
+  private static final AlertdialogRole ALERTDIALOG = new AlertdialogRoleImpl("alertdialog");
+  private static final AlertRole ALERT = new AlertRoleImpl("alert");
+  private static final ApplicationRole APPLICATION = new ApplicationRoleImpl("application");
+  private static final ArticleRole ARTICLE = new ArticleRoleImpl("article");
+  private static final BannerRole BANNER = new BannerRoleImpl("banner");
+  private static final ButtonRole BUTTON = new ButtonRoleImpl("button");
+  private static final CheckboxRole CHECKBOX = new CheckboxRoleImpl("checkbox");
+  private static final ColumnheaderRole COLUMNHEADER = new ColumnheaderRoleImpl("columnheader");
+  private static final ComboboxRole COMBOBOX = new ComboboxRoleImpl("combobox");
+  private static final ComplementaryRole COMPLEMENTARY = new ComplementaryRoleImpl("complementary");
+  private static final ContentinfoRole CONTENTINFO = new ContentinfoRoleImpl("contentinfo");
+  private static final DefinitionRole DEFINITION = new DefinitionRoleImpl("definition");
+  private static final DialogRole DIALOG = new DialogRoleImpl("dialog");
+  private static final DirectoryRole DIRECTORY = new DirectoryRoleImpl("directory");
+  private static final DocumentRole DOCUMENT = new DocumentRoleImpl("document");
+  private static final FormRole FORM = new FormRoleImpl("form");
+  private static final GridcellRole GRIDCELL = new GridcellRoleImpl("gridcell");
+  private static final GridRole GRID = new GridRoleImpl("grid");
+  private static final GroupRole GROUP = new GroupRoleImpl("group");
+  private static final HeadingRole HEADING = new HeadingRoleImpl("heading");
+  private static final ImgRole IMG = new ImgRoleImpl("img");
+  private static final LinkRole LINK = new LinkRoleImpl("link");
+  private static final ListboxRole LISTBOX = new ListboxRoleImpl("listbox");
+  private static final ListitemRole LISTITEM = new ListitemRoleImpl("listitem");
+  private static final ListRole LIST = new ListRoleImpl("list");
+  private static final LogRole LOG = new LogRoleImpl("log");
+  private static final MainRole MAIN = new MainRoleImpl("main");
+  private static final MarqueeRole MARQUEE = new MarqueeRoleImpl("marquee");
+  private static final MathRole MATH = new MathRoleImpl("math");
+  private static final MenubarRole MENUBAR = new MenubarRoleImpl("menubar");
+  private static final MenuitemcheckboxRole MENUITEMCHECKBOX = new MenuitemcheckboxRoleImpl("menuitemcheckbox");
+  private static final MenuitemradioRole MENUITEMRADIO = new MenuitemradioRoleImpl("menuitemradio");
+  private static final MenuitemRole MENUITEM = new MenuitemRoleImpl("menuitem");
+  private static final MenuRole MENU = new MenuRoleImpl("menu");
+  private static final NavigationRole NAVIGATION = new NavigationRoleImpl("navigation");
+  private static final NoteRole NOTE = new NoteRoleImpl("note");
+  private static final OptionRole OPTION = new OptionRoleImpl("option");
+  private static final PresentationRole PRESENTATION = new PresentationRoleImpl("presentation");
+  private static final ProgressbarRole PROGRESSBAR = new ProgressbarRoleImpl("progressbar");
+  private static final RadiogroupRole RADIOGROUP = new RadiogroupRoleImpl("radiogroup");
+  private static final RadioRole RADIO = new RadioRoleImpl("radio");
+  private static final RegionRole REGION = new RegionRoleImpl("region");
+  private static final RowgroupRole ROWGROUP = new RowgroupRoleImpl("rowgroup");
+  private static final RowheaderRole ROWHEADER = new RowheaderRoleImpl("rowheader");
+  private static final RowRole ROW = new RowRoleImpl("row");
+  private static final ScrollbarRole SCROLLBAR = new ScrollbarRoleImpl("scrollbar");
+  private static final SearchRole SEARCH = new SearchRoleImpl("search");
+  private static final SeparatorRole SEPARATOR = new SeparatorRoleImpl("separator");
+  private static final SliderRole SLIDER = new SliderRoleImpl("slider");
+  private static final SpinbuttonRole SPINBUTTON = new SpinbuttonRoleImpl("spinbutton");
+  private static final StatusRole STATUS = new StatusRoleImpl("status");
+  private static final TablistRole TABLIST = new TablistRoleImpl("tablist");
+  private static final TabpanelRole TABPANEL = new TabpanelRoleImpl("tabpanel");
+  private static final TabRole TAB = new TabRoleImpl("tab");
+  private static final TextboxRole TEXTBOX = new TextboxRoleImpl("textbox");
+  private static final TimerRole TIMER = new TimerRoleImpl("timer");
+  private static final ToolbarRole TOOLBAR = new ToolbarRoleImpl("toolbar");
+  private static final TooltipRole TOOLTIP = new TooltipRoleImpl("tooltip");
+  private static final TreegridRole TREEGRID = new TreegridRoleImpl("treegrid");
+  private static final TreeitemRole TREEITEM = new TreeitemRoleImpl("treeitem");
+  private static final TreeRole TREE = new TreeRoleImpl("tree");
+
+  public static AlertdialogRole getAlertdialogRole() {
+    return ALERTDIALOG;
+  }
+
+  public static AlertRole getAlertRole() {
+    return ALERT;
+  }
+
+  public static ApplicationRole getApplicationRole() {
+    return APPLICATION;
+  }
+
+  public static ArticleRole getArticleRole() {
+    return ARTICLE;
+  }
+
+  public static BannerRole getBannerRole() {
+    return BANNER;
+  }
+
+  public static ButtonRole getButtonRole() {
+    return BUTTON;
+  }
+
+  public static CheckboxRole getCheckboxRole() {
+    return CHECKBOX;
+  }
+
+  public static ColumnheaderRole getColumnheaderRole() {
+    return COLUMNHEADER;
+  }
+
+  public static ComboboxRole getComboboxRole() {
+    return COMBOBOX;
+  }
+
+  public static ComplementaryRole getComplementaryRole() {
+    return COMPLEMENTARY;
+  }
+
+  public static ContentinfoRole getContentinfoRole() {
+    return CONTENTINFO;
+  }
+
+  public static DefinitionRole getDefinitionRole() {
+    return DEFINITION;
+  }
+
+  public static DialogRole getDialogRole() {
+    return DIALOG;
+  }
+
+  public static DirectoryRole getDirectoryRole() {
+    return DIRECTORY;
+  }
+
+  public static DocumentRole getDocumentRole() {
+    return DOCUMENT;
+  }
+
+  public static FormRole getFormRole() {
+    return FORM;
+  }
+
+  public static GridcellRole getGridcellRole() {
+    return GRIDCELL;
+  }
+
+  public static GridRole getGridRole() {
+    return GRID;
+  }
+
+  public static GroupRole getGroupRole() {
+    return GROUP;
+  }
+
+  public static HeadingRole getHeadingRole() {
+    return HEADING;
+  }
+
+  public static ImgRole getImgRole() {
+    return IMG;
+  }
+
+  public static LinkRole getLinkRole() {
+    return LINK;
+  }
+
+  public static ListboxRole getListboxRole() {
+    return LISTBOX;
+  }
+
+  public static ListitemRole getListitemRole() {
+    return LISTITEM;
+  }
+
+  public static ListRole getListRole() {
+    return LIST;
+  }
+
+  public static LogRole getLogRole() {
+    return LOG;
+  }
+
+  public static MainRole getMainRole() {
+    return MAIN;
+  }
+
+  public static MarqueeRole getMarqueeRole() {
+    return MARQUEE;
+  }
+
+  public static MathRole getMathRole() {
+    return MATH;
+  }
+
+  public static MenubarRole getMenubarRole() {
+    return MENUBAR;
+  }
+
+  public static MenuitemcheckboxRole getMenuitemcheckboxRole() {
+    return MENUITEMCHECKBOX;
+  }
+
+  public static MenuitemradioRole getMenuitemradioRole() {
+    return MENUITEMRADIO;
+  }
+
+  public static MenuitemRole getMenuitemRole() {
+    return MENUITEM;
+  }
+
+  public static MenuRole getMenuRole() {
+    return MENU;
+  }
+
+  public static NavigationRole getNavigationRole() {
+    return NAVIGATION;
+  }
+
+  public static NoteRole getNoteRole() {
+    return NOTE;
+  }
+
+  public static OptionRole getOptionRole() {
+    return OPTION;
+  }
+
+  public static PresentationRole getPresentationRole() {
+    return PRESENTATION;
+  }
+
+  public static ProgressbarRole getProgressbarRole() {
+    return PROGRESSBAR;
+  }
+
+  public static RadiogroupRole getRadiogroupRole() {
+    return RADIOGROUP;
+  }
+
+  public static RadioRole getRadioRole() {
+    return RADIO;
+  }
+
+  public static RegionRole getRegionRole() {
+    return REGION;
+  }
+
+  public static RowgroupRole getRowgroupRole() {
+    return ROWGROUP;
+  }
+
+  public static RowheaderRole getRowheaderRole() {
+    return ROWHEADER;
+  }
+
+  public static RowRole getRowRole() {
+    return ROW;
+  }
+
+  public static ScrollbarRole getScrollbarRole() {
+    return SCROLLBAR;
+  }
+
+  public static SearchRole getSearchRole() {
+    return SEARCH;
+  }
+
+  public static SeparatorRole getSeparatorRole() {
+    return SEPARATOR;
+  }
+
+  public static SliderRole getSliderRole() {
+    return SLIDER;
+  }
+
+  public static SpinbuttonRole getSpinbuttonRole() {
+    return SPINBUTTON;
+  }
+
+  public static StatusRole getStatusRole() {
+    return STATUS;
+  }
+
+  public static TablistRole getTablistRole() {
+    return TABLIST;
+  }
+
+  public static TabpanelRole getTabpanelRole() {
+    return TABPANEL;
+  }
+
+  public static TabRole getTabRole() {
+    return TAB;
+  }
+
+  public static TextboxRole getTextboxRole() {
+    return TEXTBOX;
+  }
+
+  public static TimerRole getTimerRole() {
+    return TIMER;
+  }
+
+  public static ToolbarRole getToolbarRole() {
+    return TOOLBAR;
+  }
+
+  public static TooltipRole getTooltipRole() {
+    return TOOLTIP;
+  }
+
+  public static TreegridRole getTreegridRole() {
+    return TREEGRID;
+  }
+
+  public static TreeitemRole getTreeitemRole() {
+    return TREEITEM;
+  }
+
+  public static TreeRole getTreeRole() {
+    return TREE;
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/RoletypeRole.java b/user/src/com/google/gwt/aria/client/RoletypeRole.java
new file mode 100644
index 0000000..1d56cdc
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RoletypeRole.java
@@ -0,0 +1,152 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+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, IdReferenceList value);
+
+  void setAriaDescribedbyProperty(Element element, IdReferenceList value);
+
+  void setAriaDisabledState(Element element, boolean value);
+
+  void setAriaDropeffectProperty(Element element, DropeffectTokenList value);
+
+  void setAriaFlowtoProperty(Element element, IdReferenceList value);
+
+  void setAriaGrabbedState(Element element, BooleanAndUndefined value);
+
+  void setAriaHaspopupProperty(Element element, boolean value);
+
+  void setAriaHiddenState(Element element, boolean value);
+
+  void setAriaInvalidState(Element element, InvalidToken value);
+
+  void setAriaLabelledbyProperty(Element element, IdReferenceList value);
+
+  void setAriaLabelProperty(Element element, String value);
+
+  void setAriaLiveProperty(Element element, LiveToken value);
+
+  void setAriaOwnsProperty(Element element, IdReferenceList value);
+
+  void setAriaRelevantProperty(Element element, RelevantTokenList 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
new file mode 100644
index 0000000..3c5fa69
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RowRole.java
@@ -0,0 +1,49 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 RowRole extends GroupRole, WidgetRole {
+  String getAriaLevelProperty(Element element);
+
+  String getAriaSelectedState(Element element);
+
+  void removeAriaLevelProperty(Element element);
+
+  void removeAriaSelectedState(Element element);
+
+  void setAriaLevelProperty(Element element, int value);
+
+  void setAriaSelectedState(Element element, BooleanAndUndefined value);
+}
diff --git a/user/src/com/google/gwt/aria/client/RowRoleImpl.java b/user/src/com/google/gwt/aria/client/RowRoleImpl.java
new file mode 100644
index 0000000..7962d22
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RowRoleImpl.java
@@ -0,0 +1,347 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link RowRole}.
+ */
+class RowRoleImpl extends Role implements RowRole {
+  RowRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLevelProperty(Element element) {
+    return Property.LEVEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaSelectedState(Element element) {
+    return State.SELECTED.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLevelProperty(Element element) {
+    Property.LEVEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaSelectedState(Element element) {
+    State.SELECTED.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLevelProperty(Element element, int value) {
+    Property.LEVEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaSelectedState(Element element, BooleanAndUndefined value) {
+    State.SELECTED.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/RowgroupRole.java b/user/src/com/google/gwt/aria/client/RowgroupRole.java
new file mode 100644
index 0000000..279ff2b
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RowgroupRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..4adbde8
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RowgroupRoleImpl.java
@@ -0,0 +1,317 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link RowgroupRole}.
+ */
+class RowgroupRoleImpl extends Role implements RowgroupRole {
+  RowgroupRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/RowheaderRole.java b/user/src/com/google/gwt/aria/client/RowheaderRole.java
new file mode 100644
index 0000000..506df38
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RowheaderRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.PropertyTokenTypes.SortToken;
+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>
+ *
+ * <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 RowheaderRole extends GridcellRole, SectionheadRole, WidgetRole {
+  String getAriaSortProperty(Element element);
+
+  void removeAriaSortProperty(Element element);
+
+  void setAriaSortProperty(Element element, SortToken value);
+}
diff --git a/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java b/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java
new file mode 100644
index 0000000..43d1a46
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java
@@ -0,0 +1,362 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.SortToken;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link RowheaderRole}.
+ */
+class RowheaderRoleImpl extends Role implements RowheaderRole {
+  RowheaderRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaReadonlyProperty(Element element) {
+    return Property.READONLY.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaRequiredProperty(Element element) {
+    return Property.REQUIRED.get(element);
+  }
+
+  @Override
+  public String getAriaSelectedState(Element element) {
+    return State.SELECTED.get(element);
+  }
+
+  @Override
+  public String getAriaSortProperty(Element element) {
+    return Property.SORT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaReadonlyProperty(Element element) {
+    Property.READONLY.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaRequiredProperty(Element element) {
+    Property.REQUIRED.remove(element);
+  }
+
+  @Override
+  public void removeAriaSelectedState(Element element) {
+    State.SELECTED.remove(element);
+  }
+
+  @Override
+  public void removeAriaSortProperty(Element element) {
+    Property.SORT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaReadonlyProperty(Element element, boolean value) {
+    Property.READONLY.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaRequiredProperty(Element element, boolean value) {
+    Property.REQUIRED.set(element, value);
+  }
+
+  @Override
+  public void setAriaSelectedState(Element element, BooleanAndUndefined value) {
+    State.SELECTED.set(element, value);
+  }
+
+  @Override
+  public void setAriaSortProperty(Element element, SortToken value) {
+    Property.SORT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ScrollbarRole.java b/user/src/com/google/gwt/aria/client/ScrollbarRole.java
new file mode 100644
index 0000000..c8d69ec
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ScrollbarRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.PropertyTokenTypes.OrientationToken;
+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>
+ *
+ * <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 ScrollbarRole extends InputRole, RangeRole {
+  String getAriaOrientationProperty(Element element);
+
+  void removeAriaOrientationProperty(Element element);
+
+  void setAriaOrientationProperty(Element element, OrientationToken value);
+}
diff --git a/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java b/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java
new file mode 100644
index 0000000..c99501f
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java
@@ -0,0 +1,362 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.OrientationToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ScrollbarRole}.
+ */
+class ScrollbarRoleImpl extends Role implements ScrollbarRole {
+  ScrollbarRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOrientationProperty(Element element) {
+    return Property.ORIENTATION.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaValuemaxProperty(Element element) {
+    return Property.VALUEMAX.get(element);
+  }
+
+  @Override
+  public String getAriaValueminProperty(Element element) {
+    return Property.VALUEMIN.get(element);
+  }
+
+  @Override
+  public String getAriaValuenowProperty(Element element) {
+    return Property.VALUENOW.get(element);
+  }
+
+  @Override
+  public String getAriaValuetextProperty(Element element) {
+    return Property.VALUETEXT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOrientationProperty(Element element) {
+    Property.ORIENTATION.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuemaxProperty(Element element) {
+    Property.VALUEMAX.remove(element);
+  }
+
+  @Override
+  public void removeAriaValueminProperty(Element element) {
+    Property.VALUEMIN.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuenowProperty(Element element) {
+    Property.VALUENOW.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuetextProperty(Element element) {
+    Property.VALUETEXT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOrientationProperty(Element element, OrientationToken value) {
+    Property.ORIENTATION.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuemaxProperty(Element element, Number value) {
+    Property.VALUEMAX.set(element, value);
+  }
+
+  @Override
+  public void setAriaValueminProperty(Element element, Number value) {
+    Property.VALUEMIN.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuenowProperty(Element element, Number value) {
+    Property.VALUENOW.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuetextProperty(Element element, String value) {
+    Property.VALUETEXT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/SearchRole.java b/user/src/com/google/gwt/aria/client/SearchRole.java
new file mode 100644
index 0000000..750e98c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SearchRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..2415513
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SearchRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link SearchRole}.
+ */
+class SearchRoleImpl extends Role implements SearchRole {
+  SearchRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/SectionRole.java b/user/src/com/google/gwt/aria/client/SectionRole.java
new file mode 100644
index 0000000..f2c40e0
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SectionRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 SectionRole extends StructureRole {
+  String getAriaExpandedState(Element element);
+
+  void removeAriaExpandedState(Element element);
+
+  void setAriaExpandedState(Element element, BooleanAndUndefined value);
+}
diff --git a/user/src/com/google/gwt/aria/client/SectionheadRole.java b/user/src/com/google/gwt/aria/client/SectionheadRole.java
new file mode 100644
index 0000000..132194e
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SectionheadRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 SectionheadRole extends StructureRole {
+  String getAriaExpandedState(Element element);
+
+  void removeAriaExpandedState(Element element);
+
+  void setAriaExpandedState(Element element, BooleanAndUndefined value);
+}
diff --git a/user/src/com/google/gwt/aria/client/SelectRole.java b/user/src/com/google/gwt/aria/client/SelectRole.java
new file mode 100644
index 0000000..7176527
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SelectRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..3913505
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SeparatorRole.java
@@ -0,0 +1,50 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.PropertyTokenTypes.OrientationToken;
+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>
+ *
+ * <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 SeparatorRole extends StructureRole {
+  String getAriaExpandedState(Element element);
+
+  String getAriaOrientationProperty(Element element);
+
+  void removeAriaExpandedState(Element element);
+
+  void removeAriaOrientationProperty(Element element);
+
+  void setAriaExpandedState(Element element, BooleanAndUndefined value);
+
+  void setAriaOrientationProperty(Element element, OrientationToken value);
+}
diff --git a/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java b/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java
new file mode 100644
index 0000000..36cc575
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java
@@ -0,0 +1,317 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.OrientationToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link SeparatorRole}.
+ */
+class SeparatorRoleImpl extends Role implements SeparatorRole {
+  SeparatorRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOrientationProperty(Element element) {
+    return Property.ORIENTATION.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOrientationProperty(Element element) {
+    Property.ORIENTATION.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOrientationProperty(Element element, OrientationToken value) {
+    Property.ORIENTATION.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/SliderRole.java b/user/src/com/google/gwt/aria/client/SliderRole.java
new file mode 100644
index 0000000..9917d54
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SliderRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.PropertyTokenTypes.OrientationToken;
+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>
+ *
+ * <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 SliderRole extends InputRole, RangeRole {
+  String getAriaOrientationProperty(Element element);
+
+  void removeAriaOrientationProperty(Element element);
+
+  void setAriaOrientationProperty(Element element, OrientationToken value);
+}
diff --git a/user/src/com/google/gwt/aria/client/SliderRoleImpl.java b/user/src/com/google/gwt/aria/client/SliderRoleImpl.java
new file mode 100644
index 0000000..2564346
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SliderRoleImpl.java
@@ -0,0 +1,362 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.OrientationToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link SliderRole}.
+ */
+class SliderRoleImpl extends Role implements SliderRole {
+  SliderRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOrientationProperty(Element element) {
+    return Property.ORIENTATION.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaValuemaxProperty(Element element) {
+    return Property.VALUEMAX.get(element);
+  }
+
+  @Override
+  public String getAriaValueminProperty(Element element) {
+    return Property.VALUEMIN.get(element);
+  }
+
+  @Override
+  public String getAriaValuenowProperty(Element element) {
+    return Property.VALUENOW.get(element);
+  }
+
+  @Override
+  public String getAriaValuetextProperty(Element element) {
+    return Property.VALUETEXT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOrientationProperty(Element element) {
+    Property.ORIENTATION.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuemaxProperty(Element element) {
+    Property.VALUEMAX.remove(element);
+  }
+
+  @Override
+  public void removeAriaValueminProperty(Element element) {
+    Property.VALUEMIN.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuenowProperty(Element element) {
+    Property.VALUENOW.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuetextProperty(Element element) {
+    Property.VALUETEXT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOrientationProperty(Element element, OrientationToken value) {
+    Property.ORIENTATION.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuemaxProperty(Element element, Number value) {
+    Property.VALUEMAX.set(element, value);
+  }
+
+  @Override
+  public void setAriaValueminProperty(Element element, Number value) {
+    Property.VALUEMIN.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuenowProperty(Element element, Number value) {
+    Property.VALUENOW.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuetextProperty(Element element, String value) {
+    Property.VALUETEXT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/SpinbuttonRole.java b/user/src/com/google/gwt/aria/client/SpinbuttonRole.java
new file mode 100644
index 0000000..1c6ff92
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SpinbuttonRole.java
@@ -0,0 +1,42 @@
+/**
+ * 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;
+
+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>
+ *
+ * <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 SpinbuttonRole extends InputRole, RangeRole {
+  String getAriaRequiredProperty(Element element);
+
+  void removeAriaRequiredProperty(Element element);
+
+  void setAriaRequiredProperty(Element element, boolean value);
+}
diff --git a/user/src/com/google/gwt/aria/client/SpinbuttonRoleImpl.java b/user/src/com/google/gwt/aria/client/SpinbuttonRoleImpl.java
new file mode 100644
index 0000000..e74c883
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/SpinbuttonRoleImpl.java
@@ -0,0 +1,361 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link SpinbuttonRole}.
+ */
+class SpinbuttonRoleImpl extends Role implements SpinbuttonRole {
+  SpinbuttonRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaRequiredProperty(Element element) {
+    return Property.REQUIRED.get(element);
+  }
+
+  @Override
+  public String getAriaValuemaxProperty(Element element) {
+    return Property.VALUEMAX.get(element);
+  }
+
+  @Override
+  public String getAriaValueminProperty(Element element) {
+    return Property.VALUEMIN.get(element);
+  }
+
+  @Override
+  public String getAriaValuenowProperty(Element element) {
+    return Property.VALUENOW.get(element);
+  }
+
+  @Override
+  public String getAriaValuetextProperty(Element element) {
+    return Property.VALUETEXT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaRequiredProperty(Element element) {
+    Property.REQUIRED.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuemaxProperty(Element element) {
+    Property.VALUEMAX.remove(element);
+  }
+
+  @Override
+  public void removeAriaValueminProperty(Element element) {
+    Property.VALUEMIN.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuenowProperty(Element element) {
+    Property.VALUENOW.remove(element);
+  }
+
+  @Override
+  public void removeAriaValuetextProperty(Element element) {
+    Property.VALUETEXT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaRequiredProperty(Element element, boolean value) {
+    Property.REQUIRED.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuemaxProperty(Element element, Number value) {
+    Property.VALUEMAX.set(element, value);
+  }
+
+  @Override
+  public void setAriaValueminProperty(Element element, Number value) {
+    Property.VALUEMIN.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuenowProperty(Element element, Number value) {
+    Property.VALUENOW.set(element, value);
+  }
+
+  @Override
+  public void setAriaValuetextProperty(Element element, String value) {
+    Property.VALUETEXT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/State.java b/user/src/com/google/gwt/aria/client/State.java
new file mode 100644
index 0000000..e8a0c0e
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/State.java
@@ -0,0 +1,76 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+
+/**
+ * <p>Class that contains constants for ARIA states. States combined with ARIA roles supply
+ * information about the changes in the web page that can be used for alerts, notification,
+ * navigation assistance. The state is changed as a result of an user interaction and developers
+ * should consider changing the widget state when handling user actions.</p>
+ *
+ * <p>The following groups of states exist:
+ * <ol>
+ * <li>Widget states -- specific to common user interface elements found on GUI systems or
+ * in rich Internet applications which receive user input and process user actions</li>
+ * <li>Live Region states -- specific to live regions in rich Internet applications; may be applied
+ * to any element; indicate that content changes may occur without the element having focus, and
+ * provides assistive technologies with information on how to process those content updates. </li>
+ * <li>Drag-and-drop states -- indicates information about draggable elements and their drop
+ * targets</li>
+ * </ol>
+ * </p>
+ *
+ * @param <T> The state value type
+ */
+public final class State<T> extends Attribute<T> {
+  public static final State<Boolean> BUSY =
+      new State<Boolean>("aria-busy", "false");
+
+  public static final State<BooleanAndUndefined> CHECKED =
+      new State<BooleanAndUndefined>("aria-checked", "undefined");
+
+  public static final State<Boolean> DISABLED =
+      new State<Boolean>("aria-disabled", "false");
+
+  public static final State<BooleanAndUndefined> EXPANDED =
+      new State<BooleanAndUndefined>("aria-expanded", "undefined");
+
+  public static final State<BooleanAndUndefined> GRABBED =
+      new State<BooleanAndUndefined>("aria-grabbed", "undefined");
+
+  public static final State<Boolean> HIDDEN =
+      new State<Boolean>("aria-hidden", "false");
+
+  public static final State<InvalidToken> INVALID =
+      new State<InvalidToken>("aria-invalid", "false");
+
+  public static final State<BooleanAndUndefined> PRESSED =
+      new State<BooleanAndUndefined>("aria-pressed", "undefined");
+
+  public static final State<BooleanAndUndefined> SELECTED =
+      new State<BooleanAndUndefined>("aria-selected", "undefined");
+
+
+  public State(String name) {
+    super(name);
+  }
+
+  public State(String name, String defaultValue) {
+    super(name, defaultValue);
+  }
+}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/aria/client/StateTokenTypes.java b/user/src/com/google/gwt/aria/client/StateTokenTypes.java
new file mode 100644
index 0000000..f458d88
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/StateTokenTypes.java
@@ -0,0 +1,40 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.AriaAttributeType;
+
+/**
+ * Token type enums for State ARIA attributes
+ */
+public final class StateTokenTypes {
+  /**
+   * InvalidToken enum type
+   */
+  public static enum InvalidToken implements AriaAttributeType {
+    GRAMMAR("grammar"), FALSE("false"), SPELLING("spelling"), TRUE("true");
+
+    private final String value;
+
+    private InvalidToken(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String getAriaValue() {
+      return value;
+    }
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/StatusRole.java b/user/src/com/google/gwt/aria/client/StatusRole.java
new file mode 100644
index 0000000..e7fc9dc
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/StatusRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..778d2df
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/StatusRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link StatusRole}.
+ */
+class StatusRoleImpl extends Role implements StatusRole {
+  StatusRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/StructureRole.java b/user/src/com/google/gwt/aria/client/StructureRole.java
new file mode 100644
index 0000000..963de37
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/StructureRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 StructureRole extends RoletypeRole {
+}
diff --git a/user/src/com/google/gwt/aria/client/TabRole.java b/user/src/com/google/gwt/aria/client/TabRole.java
new file mode 100644
index 0000000..4bb9533
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TabRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 TabRole extends SectionheadRole, WidgetRole {
+  String getAriaSelectedState(Element element);
+
+  void removeAriaSelectedState(Element element);
+
+  void setAriaSelectedState(Element element, BooleanAndUndefined value);
+}
diff --git a/user/src/com/google/gwt/aria/client/TabRoleImpl.java b/user/src/com/google/gwt/aria/client/TabRoleImpl.java
new file mode 100644
index 0000000..1437a71
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TabRoleImpl.java
@@ -0,0 +1,316 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link TabRole}.
+ */
+class TabRoleImpl extends Role implements TabRole {
+  TabRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaSelectedState(Element element) {
+    return State.SELECTED.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaSelectedState(Element element) {
+    State.SELECTED.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaSelectedState(Element element, BooleanAndUndefined value) {
+    State.SELECTED.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/TablistRole.java b/user/src/com/google/gwt/aria/client/TablistRole.java
new file mode 100644
index 0000000..9023834
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TablistRole.java
@@ -0,0 +1,42 @@
+/**
+ * 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;
+
+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>
+ *
+ * <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 TablistRole extends CompositeRole, DirectoryRole {
+  String getAriaLevelProperty(Element element);
+
+  void removeAriaLevelProperty(Element element);
+
+  void setAriaLevelProperty(Element element, int value);
+}
diff --git a/user/src/com/google/gwt/aria/client/TablistRoleImpl.java b/user/src/com/google/gwt/aria/client/TablistRoleImpl.java
new file mode 100644
index 0000000..aeb019b
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TablistRoleImpl.java
@@ -0,0 +1,332 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link TablistRole}.
+ */
+class TablistRoleImpl extends Role implements TablistRole {
+  TablistRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLevelProperty(Element element) {
+    return Property.LEVEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLevelProperty(Element element) {
+    Property.LEVEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLevelProperty(Element element, int value) {
+    Property.LEVEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/TabpanelRole.java b/user/src/com/google/gwt/aria/client/TabpanelRole.java
new file mode 100644
index 0000000..6c90b18
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TabpanelRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..7660187
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TabpanelRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link TabpanelRole}.
+ */
+class TabpanelRoleImpl extends Role implements TabpanelRole {
+  TabpanelRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/TextboxRole.java b/user/src/com/google/gwt/aria/client/TextboxRole.java
new file mode 100644
index 0000000..34eb529
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TextboxRole.java
@@ -0,0 +1,68 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.PropertyTokenTypes.AutocompleteToken;
+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>
+ *
+ * <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 TextboxRole extends InputRole {
+  String getAriaActivedescendantProperty(Element element);
+
+  String getAriaAutocompleteProperty(Element element);
+
+  String getAriaMultilineProperty(Element element);
+
+  String getAriaReadonlyProperty(Element element);
+
+  String getAriaRequiredProperty(Element element);
+
+  void removeAriaActivedescendantProperty(Element element);
+
+  void removeAriaAutocompleteProperty(Element element);
+
+  void removeAriaMultilineProperty(Element element);
+
+  void removeAriaReadonlyProperty(Element element);
+
+  void removeAriaRequiredProperty(Element element);
+
+  void setAriaActivedescendantProperty(Element element, IdReference value);
+
+  void setAriaAutocompleteProperty(Element element, AutocompleteToken value);
+
+  void setAriaMultilineProperty(Element element, boolean value);
+
+  void setAriaReadonlyProperty(Element element, boolean value);
+
+  void setAriaRequiredProperty(Element element, boolean value);
+}
diff --git a/user/src/com/google/gwt/aria/client/TextboxRoleImpl.java b/user/src/com/google/gwt/aria/client/TextboxRoleImpl.java
new file mode 100644
index 0000000..b27c92c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TextboxRoleImpl.java
@@ -0,0 +1,363 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.AutocompleteToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link TextboxRole}.
+ */
+class TextboxRoleImpl extends Role implements TextboxRole {
+  TextboxRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaAutocompleteProperty(Element element) {
+    return Property.AUTOCOMPLETE.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaMultilineProperty(Element element) {
+    return Property.MULTILINE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaReadonlyProperty(Element element) {
+    return Property.READONLY.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaRequiredProperty(Element element) {
+    return Property.REQUIRED.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaAutocompleteProperty(Element element) {
+    Property.AUTOCOMPLETE.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaMultilineProperty(Element element) {
+    Property.MULTILINE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaReadonlyProperty(Element element) {
+    Property.READONLY.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaRequiredProperty(Element element) {
+    Property.REQUIRED.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaAutocompleteProperty(Element element, AutocompleteToken value) {
+    Property.AUTOCOMPLETE.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaMultilineProperty(Element element, boolean value) {
+    Property.MULTILINE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaReadonlyProperty(Element element, boolean value) {
+    Property.READONLY.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaRequiredProperty(Element element, boolean value) {
+    Property.REQUIRED.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/TimerRole.java b/user/src/com/google/gwt/aria/client/TimerRole.java
new file mode 100644
index 0000000..636b48d
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TimerRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..1818a63
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TimerRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link TimerRole}.
+ */
+class TimerRoleImpl extends Role implements TimerRole {
+  TimerRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/ToolbarRole.java b/user/src/com/google/gwt/aria/client/ToolbarRole.java
new file mode 100644
index 0000000..7230b2b
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ToolbarRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..326635c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/ToolbarRoleImpl.java
@@ -0,0 +1,317 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link ToolbarRole}.
+ */
+class ToolbarRoleImpl extends Role implements ToolbarRole {
+  ToolbarRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/TooltipRole.java b/user/src/com/google/gwt/aria/client/TooltipRole.java
new file mode 100644
index 0000000..4b2d992
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TooltipRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..0aa68bd
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TooltipRoleImpl.java
@@ -0,0 +1,301 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link TooltipRole}.
+ */
+class TooltipRoleImpl extends Role implements TooltipRole {
+  TooltipRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/TreeRole.java b/user/src/com/google/gwt/aria/client/TreeRole.java
new file mode 100644
index 0000000..456f690
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TreeRole.java
@@ -0,0 +1,48 @@
+/**
+ * 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;
+
+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>
+ *
+ * <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 TreeRole extends SelectRole {
+  String getAriaMultiselectableProperty(Element element);
+
+  String getAriaRequiredProperty(Element element);
+
+  void removeAriaMultiselectableProperty(Element element);
+
+  void removeAriaRequiredProperty(Element element);
+
+  void setAriaMultiselectableProperty(Element element, boolean value);
+
+  void setAriaRequiredProperty(Element element, boolean value);
+}
diff --git a/user/src/com/google/gwt/aria/client/TreeRoleImpl.java b/user/src/com/google/gwt/aria/client/TreeRoleImpl.java
new file mode 100644
index 0000000..1a878a2
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TreeRoleImpl.java
@@ -0,0 +1,347 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link TreeRole}.
+ */
+class TreeRoleImpl extends Role implements TreeRole {
+  TreeRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaMultiselectableProperty(Element element) {
+    return Property.MULTISELECTABLE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaRequiredProperty(Element element) {
+    return Property.REQUIRED.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaMultiselectableProperty(Element element) {
+    Property.MULTISELECTABLE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaRequiredProperty(Element element) {
+    Property.REQUIRED.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaMultiselectableProperty(Element element, boolean value) {
+    Property.MULTISELECTABLE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaRequiredProperty(Element element, boolean value) {
+    Property.REQUIRED.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/TreegridRole.java b/user/src/com/google/gwt/aria/client/TreegridRole.java
new file mode 100644
index 0000000..c889d6c
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TreegridRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..c77baa9
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TreegridRoleImpl.java
@@ -0,0 +1,377 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link TreegridRole}.
+ */
+class TreegridRoleImpl extends Role implements TreegridRole {
+  TreegridRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaActivedescendantProperty(Element element) {
+    return Property.ACTIVEDESCENDANT.get(element);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLevelProperty(Element element) {
+    return Property.LEVEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaMultiselectableProperty(Element element) {
+    return Property.MULTISELECTABLE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaReadonlyProperty(Element element) {
+    return Property.READONLY.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaRequiredProperty(Element element) {
+    return Property.REQUIRED.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaActivedescendantProperty(Element element) {
+    Property.ACTIVEDESCENDANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLevelProperty(Element element) {
+    Property.LEVEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaMultiselectableProperty(Element element) {
+    Property.MULTISELECTABLE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaReadonlyProperty(Element element) {
+    Property.READONLY.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaRequiredProperty(Element element) {
+    Property.REQUIRED.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaActivedescendantProperty(Element element, IdReference value) {
+    Property.ACTIVEDESCENDANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLevelProperty(Element element, int value) {
+    Property.LEVEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaMultiselectableProperty(Element element, boolean value) {
+    Property.MULTISELECTABLE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaReadonlyProperty(Element element, boolean value) {
+    Property.READONLY.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaRequiredProperty(Element element, boolean value) {
+    Property.REQUIRED.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/TreeitemRole.java b/user/src/com/google/gwt/aria/client/TreeitemRole.java
new file mode 100644
index 0000000..e337934
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TreeitemRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 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
new file mode 100644
index 0000000..14984e5
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/TreeitemRoleImpl.java
@@ -0,0 +1,376 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.aria.client.PropertyTokenTypes.LiveToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantTokenList;
+import com.google.gwt.aria.client.StateTokenTypes.InvalidToken;
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Implements {@link TreeitemRole}.
+ */
+class TreeitemRoleImpl extends Role implements TreeitemRole {
+  TreeitemRoleImpl(String roleName) {
+    super(roleName);
+  }
+
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
+  }
+
+  @Override
+  public String getAriaBusyState(Element element) {
+    return State.BUSY.get(element);
+  }
+
+  @Override
+  public String getAriaCheckedState(Element element) {
+    return State.CHECKED.get(element);
+  }
+
+  @Override
+  public String getAriaControlsProperty(Element element) {
+    return Property.CONTROLS.get(element);
+  }
+
+  @Override
+  public String getAriaDescribedbyProperty(Element element) {
+    return Property.DESCRIBEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaDisabledState(Element element) {
+    return State.DISABLED.get(element);
+  }
+
+  @Override
+  public String getAriaDropeffectProperty(Element element) {
+    return Property.DROPEFFECT.get(element);
+  }
+
+  @Override
+  public String getAriaExpandedState(Element element) {
+    return State.EXPANDED.get(element);
+  }
+
+  @Override
+  public String getAriaFlowtoProperty(Element element) {
+    return Property.FLOWTO.get(element);
+  }
+
+  @Override
+  public String getAriaGrabbedState(Element element) {
+    return State.GRABBED.get(element);
+  }
+
+  @Override
+  public String getAriaHaspopupProperty(Element element) {
+    return Property.HASPOPUP.get(element);
+  }
+
+  @Override
+  public String getAriaHiddenState(Element element) {
+    return State.HIDDEN.get(element);
+  }
+
+  @Override
+  public String getAriaInvalidState(Element element) {
+    return State.INVALID.get(element);
+  }
+
+  @Override
+  public String getAriaLabelledbyProperty(Element element) {
+    return Property.LABELLEDBY.get(element);
+  }
+
+  @Override
+  public String getAriaLabelProperty(Element element) {
+    return Property.LABEL.get(element);
+  }
+
+  @Override
+  public String getAriaLevelProperty(Element element) {
+    return Property.LEVEL.get(element);
+  }
+
+  @Override
+  public String getAriaLiveProperty(Element element) {
+    return Property.LIVE.get(element);
+  }
+
+  @Override
+  public String getAriaOwnsProperty(Element element) {
+    return Property.OWNS.get(element);
+  }
+
+  @Override
+  public String getAriaPosinsetProperty(Element element) {
+    return Property.POSINSET.get(element);
+  }
+
+  @Override
+  public String getAriaRelevantProperty(Element element) {
+    return Property.RELEVANT.get(element);
+  }
+
+  @Override
+  public String getAriaSelectedState(Element element) {
+    return State.SELECTED.get(element);
+  }
+
+  @Override
+  public String getAriaSetsizeProperty(Element element) {
+    return Property.SETSIZE.get(element);
+  }
+
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
+  public void removeAriaAtomicProperty(Element element) {
+    Property.ATOMIC.remove(element);
+  }
+
+  @Override
+  public void removeAriaBusyState(Element element) {
+    State.BUSY.remove(element);
+  }
+
+  @Override
+  public void removeAriaCheckedState(Element element) {
+    State.CHECKED.remove(element);
+  }
+
+  @Override
+  public void removeAriaControlsProperty(Element element) {
+    Property.CONTROLS.remove(element);
+  }
+
+  @Override
+  public void removeAriaDescribedbyProperty(Element element) {
+    Property.DESCRIBEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaDisabledState(Element element) {
+    State.DISABLED.remove(element);
+  }
+
+  @Override
+  public void removeAriaDropeffectProperty(Element element) {
+    Property.DROPEFFECT.remove(element);
+  }
+
+  @Override
+  public void removeAriaExpandedState(Element element) {
+    State.EXPANDED.remove(element);
+  }
+
+  @Override
+  public void removeAriaFlowtoProperty(Element element) {
+    Property.FLOWTO.remove(element);
+  }
+
+  @Override
+  public void removeAriaGrabbedState(Element element) {
+    State.GRABBED.remove(element);
+  }
+
+  @Override
+  public void removeAriaHaspopupProperty(Element element) {
+    Property.HASPOPUP.remove(element);
+  }
+
+  @Override
+  public void removeAriaHiddenState(Element element) {
+    State.HIDDEN.remove(element);
+  }
+
+  @Override
+  public void removeAriaInvalidState(Element element) {
+    State.INVALID.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelledbyProperty(Element element) {
+    Property.LABELLEDBY.remove(element);
+  }
+
+  @Override
+  public void removeAriaLabelProperty(Element element) {
+    Property.LABEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLevelProperty(Element element) {
+    Property.LEVEL.remove(element);
+  }
+
+  @Override
+  public void removeAriaLiveProperty(Element element) {
+    Property.LIVE.remove(element);
+  }
+
+  @Override
+  public void removeAriaOwnsProperty(Element element) {
+    Property.OWNS.remove(element);
+  }
+
+  @Override
+  public void removeAriaPosinsetProperty(Element element) {
+    Property.POSINSET.remove(element);
+  }
+
+  @Override
+  public void removeAriaRelevantProperty(Element element) {
+    Property.RELEVANT.remove(element);
+  }
+
+  @Override
+  public void removeAriaSelectedState(Element element) {
+    State.SELECTED.remove(element);
+  }
+
+  @Override
+  public void removeAriaSetsizeProperty(Element element) {
+    Property.SETSIZE.remove(element);
+  }
+
+  @Override
+  public void removeTabindexExtraAttribute(Element element) {
+    ExtraAttribute.TABINDEX.remove(element);
+  }
+
+  @Override
+  public void setAriaAtomicProperty(Element element, boolean value) {
+    Property.ATOMIC.set(element, value);
+  }
+
+  @Override
+  public void setAriaBusyState(Element element, boolean value) {
+    State.BUSY.set(element, value);
+  }
+
+  @Override
+  public void setAriaCheckedState(Element element, BooleanAndUndefined value) {
+    State.CHECKED.set(element, value);
+  }
+
+  @Override
+  public void setAriaControlsProperty(Element element, IdReferenceList value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, IdReferenceList value) {
+    Property.DESCRIBEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaDisabledState(Element element, boolean value) {
+    State.DISABLED.set(element, value);
+  }
+
+  @Override
+  public void setAriaDropeffectProperty(Element element, DropeffectTokenList value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaExpandedState(Element element, BooleanAndUndefined value) {
+    State.EXPANDED.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, IdReferenceList value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, BooleanAndUndefined value) {
+    State.GRABBED.set(element, value);
+  }
+
+  @Override
+  public void setAriaHaspopupProperty(Element element, boolean value) {
+    Property.HASPOPUP.set(element, value);
+  }
+
+  @Override
+  public void setAriaHiddenState(Element element, boolean value) {
+    State.HIDDEN.set(element, value);
+  }
+
+  @Override
+  public void setAriaInvalidState(Element element, InvalidToken value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, IdReferenceList value) {
+    Property.LABELLEDBY.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelProperty(Element element, String value) {
+    Property.LABEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLevelProperty(Element element, int value) {
+    Property.LEVEL.set(element, value);
+  }
+
+  @Override
+  public void setAriaLiveProperty(Element element, LiveToken value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, IdReferenceList value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaPosinsetProperty(Element element, int value) {
+    Property.POSINSET.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantTokenList value) {
+    Property.RELEVANT.set(element, value);
+  }
+
+  @Override
+  public void setAriaSelectedState(Element element, BooleanAndUndefined value) {
+    State.SELECTED.set(element, value);
+  }
+
+  @Override
+  public void setAriaSetsizeProperty(Element element, int value) {
+    Property.SETSIZE.set(element, value);
+  }
+
+  @Override
+  public void setTabindexExtraAttribute(Element element, int value) {
+    ExtraAttribute.TABINDEX.set(element, value);
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/WidgetRole.java b/user/src/com/google/gwt/aria/client/WidgetRole.java
new file mode 100644
index 0000000..63b9440
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/WidgetRole.java
@@ -0,0 +1,36 @@
+/**
+ * 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;
+
+
+/**
+ * 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>
+ *
+ * <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 WidgetRole extends RoletypeRole {
+}
diff --git a/user/src/com/google/gwt/aria/client/WindowRole.java b/user/src/com/google/gwt/aria/client/WindowRole.java
new file mode 100644
index 0000000..e74164b
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/WindowRole.java
@@ -0,0 +1,43 @@
+/**
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.BooleanAndUndefined;
+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>
+ *
+ * <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 WindowRole extends RoletypeRole {
+  String getAriaExpandedState(Element element);
+
+  void removeAriaExpandedState(Element element);
+
+  void setAriaExpandedState(Element element, BooleanAndUndefined value);
+}
diff --git a/user/src/com/google/gwt/user/cellview/CellView.gwt.xml b/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
index e0bf51b..fca9f5f 100644
--- a/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
+++ b/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
@@ -14,6 +14,7 @@
   the License.
 -->
 <module>
+   <inherits name="com.google.gwt.aria.Aria"/>
    <inherits name="com.google.gwt.user.User"/>
    <inherits name="com.google.gwt.cell.Cell"/>
    <inherits name="com.google.gwt.editor.Editor"/>
diff --git a/user/src/com/google/gwt/user/cellview/client/SimplePager.java b/user/src/com/google/gwt/user/cellview/client/SimplePager.java
index 7c1f5b5..e753f7c 100644
--- a/user/src/com/google/gwt/user/cellview/client/SimplePager.java
+++ b/user/src/com/google/gwt/user/cellview/client/SimplePager.java
@@ -15,9 +15,12 @@
  */
 package com.google.gwt.user.cellview.client;
 
+import com.google.gwt.aria.client.Roles;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.i18n.client.Constants;
+import com.google.gwt.i18n.client.LocalizableResource.DefaultLocale;
 import com.google.gwt.i18n.client.NumberFormat;
 import com.google.gwt.resources.client.ClientBundle;
 import com.google.gwt.resources.client.CssResource;
@@ -42,6 +45,22 @@
  * </p>
  */
 public class SimplePager extends AbstractPager {
+  /**
+   * Constant for labeling the simple pager navigational {@link ImageButton}s  
+   */
+  @DefaultLocale("en_US")
+  public interface ImageButtonsConstants extends Constants {
+    @DefaultStringValue("Fast forward")
+    String fastForward();
+    @DefaultStringValue("First page")
+    String firstPage();
+    @DefaultStringValue("Last page")
+    String lastPage();
+    @DefaultStringValue("Next page")
+    String nextPage();
+    @DefaultStringValue("Previous page")
+    String prevPage();
+  }
 
   /**
    * A ClientBundle that provides images for this widget.
@@ -153,11 +172,13 @@
     private final String styleDisabled;
 
     public ImageButton(ImageResource resEnabled, ImageResource resDiabled,
-        String disabledStyle) {
+        String disabledStyle, String label) {
       super(resEnabled);
       this.resEnabled = resEnabled;
       this.resDisabled = resDiabled;
       this.styleDisabled = disabledStyle;
+      Roles.getButtonRole().set(getElement());
+      Roles.getButtonRole().setAriaLabelProperty(getElement(), label);
     }
 
     public boolean isDisabled() {
@@ -187,6 +208,7 @@
         setResource(resEnabled);
         getElement().getParentElement().removeClassName(styleDisabled);
       }
+      Roles.getButtonRole().setAriaDisabledState(getElement(), disabled);
     }
   }
 
@@ -253,33 +275,35 @@
    *          advances by a larger increment than a single page
    * @param fastForwardRows the number of rows to jump when fast forwarding
    * @param showLastPageButton if true, show a button to go the the last page
+   * @param imageButtonConstants Constants that contain the image button names
    */
   public SimplePager(TextLocation location, Resources resources,
       boolean showFastForwardButton, final int fastForwardRows,
-      boolean showLastPageButton) {
+      boolean showLastPageButton, ImageButtonsConstants imageButtonConstants) {
     this.resources = resources;
     this.fastForwardRows = fastForwardRows;
     this.style = resources.simplePagerStyle();
     this.style.ensureInjected();
-
+    
     // Create the buttons.
     String disabledStyle = style.disabledButton();
     firstPage = new ImageButton(resources.simplePagerFirstPage(),
-        resources.simplePagerFirstPageDisabled(), disabledStyle);
+        resources.simplePagerFirstPageDisabled(), disabledStyle, imageButtonConstants.firstPage());
     firstPage.addClickHandler(new ClickHandler() {
       public void onClick(ClickEvent event) {
         firstPage();
       }
     });
     nextPage = new ImageButton(resources.simplePagerNextPage(),
-        resources.simplePagerNextPageDisabled(), disabledStyle);
+        resources.simplePagerNextPageDisabled(), disabledStyle, imageButtonConstants.nextPage());
     nextPage.addClickHandler(new ClickHandler() {
       public void onClick(ClickEvent event) {
         nextPage();
       }
     });
     prevPage = new ImageButton(resources.simplePagerPreviousPage(),
-        resources.simplePagerPreviousPageDisabled(), disabledStyle);
+        resources.simplePagerPreviousPageDisabled(), disabledStyle, 
+        imageButtonConstants.prevPage());
     prevPage.addClickHandler(new ClickHandler() {
       public void onClick(ClickEvent event) {
         previousPage();
@@ -287,7 +311,7 @@
     });
     if (showLastPageButton) {
       lastPage = new ImageButton(resources.simplePagerLastPage(),
-          resources.simplePagerLastPageDisabled(), disabledStyle);
+          resources.simplePagerLastPageDisabled(), disabledStyle, imageButtonConstants.lastPage());
       lastPage.addClickHandler(new ClickHandler() {
         public void onClick(ClickEvent event) {
           lastPage();
@@ -298,7 +322,8 @@
     }
     if (showFastForwardButton) {
       fastForward = new ImageButton(resources.simplePagerFastForward(),
-          resources.simplePagerFastForwardDisabled(), disabledStyle);
+          resources.simplePagerFastForwardDisabled(), disabledStyle, 
+          imageButtonConstants.fastForward());
       fastForward.addClickHandler(new ClickHandler() {
         public void onClick(ClickEvent event) {
           setPage(getPage() + getFastForwardPages());
@@ -346,7 +371,24 @@
     // Disable the buttons by default.
     setDisplay(null);
   }
-
+  
+  /**
+   * Construct a {@link SimplePager} with the specified resources and default image button names.
+   * 
+   * @param location the location of the text relative to the buttons
+   * @param resources the {@link Resources} to use
+   * @param showFastForwardButton if true, show a fast-forward button that
+   *          advances by a larger increment than a single page
+   * @param fastForwardRows the number of rows to jump when fast forwarding
+   * @param showLastPageButton if true, show a button to go the the last page
+   */
+  public SimplePager(TextLocation location, Resources resources,
+      boolean showFastForwardButton, final int fastForwardRows,
+      boolean showLastPageButton) {
+    this(location, resources, showFastForwardButton, fastForwardRows, showLastPageButton,
+        GWT.<ImageButtonsConstants>create(ImageButtonsConstants.class));
+  }
+  
   @Override
   public void firstPage() {
     super.firstPage();
diff --git a/user/test/com/google/gwt/aria/AriaSuite.java b/user/test/com/google/gwt/aria/AriaSuite.java
new file mode 100644
index 0000000..ada7fe9
--- /dev/null
+++ b/user/test/com/google/gwt/aria/AriaSuite.java
@@ -0,0 +1,34 @@
+/*
+ * 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;
+
+import com.google.gwt.aria.client.AttributeTest;
+import com.google.gwt.aria.client.CommonAttributeTypesTest;
+import com.google.gwt.aria.client.RoleTest;
+import com.google.gwt.junit.tools.GWTTestSuite;
+
+import junit.framework.Test;
+
+/**
+ * Tests of the aria package.
+ */
+public class AriaSuite {
+  public static Test suite() {
+    GWTTestSuite suite = new GWTTestSuite("Test for suite for aria");
+    suite.addTestSuite(CommonAttributeTypesTest.class);
+    suite.addTestSuite(AttributeTest.class);
+    suite.addTestSuite(RoleTest.class);
+    return suite;
+  }
+}
diff --git a/user/test/com/google/gwt/aria/client/AttributeTest.java b/user/test/com/google/gwt/aria/client/AttributeTest.java
new file mode 100644
index 0000000..0a4d8e7
--- /dev/null
+++ b/user/test/com/google/gwt/aria/client/AttributeTest.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.aria.client;
+
+import com.google.gwt.aria.client.PropertyTokenTypes.OrientationToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.RelevantToken;
+import com.google.gwt.dom.client.Document;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * Tests {@link Attribute} ARIA class 
+ */
+public class AttributeTest extends GWTTestCase {
+  private Element div;
+  private Attribute<OrientationToken> attribute1;
+  private Attribute<Boolean> attribute2;
+  private Attribute<String> attribute3;
+  private Attribute<RelevantToken> attribute4;
+  
+  public void testSetGetRemove_booleanValue() {
+    attribute2.setDefault(div);
+    attribute2.set(div, false);
+    attribute2.set(div, true);
+    assertEquals("true", attribute2.get(div));
+    attribute2.set(div, false);
+    assertEquals("false", attribute2.get(div));
+    attribute2.remove(div);
+    assertEquals("", attribute2.get(div));
+  }
+  
+  public void testSetGetRemove_tokenValue() {
+    attribute1.setDefault(div);
+    assertEquals(OrientationToken.VERTICAL.getAriaValue(), attribute1.get(div));
+    attribute1.remove(div);
+    assertEquals("", attribute1.get(div));
+    attribute1.set(div, OrientationToken.HORIZONTAL);
+    assertEquals(OrientationToken.HORIZONTAL.getAriaValue(), attribute1.get(div));
+  }
+  
+  public void testSetGetRemove_tokenListValue() {
+    attribute4.setDefault(div);
+    assertEquals(RelevantToken.ADDITIONS.getAriaValue() + " " + RelevantToken.TEXT.getAriaValue(), 
+        attribute4.get(div));
+    attribute4.remove(div);
+    assertEquals("", attribute1.get(div));
+    attribute4.set(div, RelevantToken.REMOVALS);
+    assertEquals(RelevantToken.REMOVALS.getAriaValue(), attribute4.get(div));
+  }
+  
+  public void testSetDefaultValue_noSet() {
+    try {
+      attribute3.setDefault(div);
+      fail();
+    } catch (AssertionError e) {
+      // Expected -- no default value for attribute2
+    }
+  }
+  
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.aria.Aria";
+  }
+  
+  @Override
+  protected void gwtSetUp() throws Exception {
+    super.gwtSetUp();
+    div = Document.get().createDivElement();
+    div.setAttribute("id", "test1");
+    Document.get().getBody().appendChild(div);
+    attribute1 = new Attribute<OrientationToken>("attr1", "vertical");
+    attribute2 = new Attribute<Boolean>("attr2", "true");
+    attribute3 = new Attribute<String>("attr3");
+    attribute4 = new Attribute<RelevantToken>("attr4", "additions text");
+  }
+  
+  @Override
+  protected void gwtTearDown() throws Exception {
+    super.gwtTearDown();
+    div.removeFromParent();
+  }
+}
diff --git a/user/test/com/google/gwt/aria/client/CommonAttributeTypesTest.java b/user/test/com/google/gwt/aria/client/CommonAttributeTypesTest.java
new file mode 100644
index 0000000..7bf22d7
--- /dev/null
+++ b/user/test/com/google/gwt/aria/client/CommonAttributeTypesTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReference;
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * Tests {@link CommonAttributeTypes}
+ */
+public class CommonAttributeTypesTest extends GWTTestCase {
+  public void testIdReference() {
+    IdReference idReference = new IdReference("test1");
+    assertEquals("test1", idReference.getAriaValue());
+  }
+  
+  public void testIdReferenceList() {
+    IdReferenceList idReferenceList = new IdReferenceList("test1", "test2");
+    assertEquals("test1 test2", idReferenceList.getAriaValue());
+  }
+  
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.aria.Aria";
+  }
+}
diff --git a/user/test/com/google/gwt/aria/client/RoleTest.java b/user/test/com/google/gwt/aria/client/RoleTest.java
new file mode 100644
index 0000000..4892a8c
--- /dev/null
+++ b/user/test/com/google/gwt/aria/client/RoleTest.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.aria.client;
+
+import com.google.gwt.aria.client.CommonAttributeTypes.IdReferenceList;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectToken;
+import com.google.gwt.aria.client.PropertyTokenTypes.DropeffectTokenList;
+import com.google.gwt.dom.client.Document;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * Tests {@link Role} ARIA classes 
+ */
+public class RoleTest extends GWTTestCase {
+  private Element div;
+  private RegionRole regionRole;
+  
+  public void testSetGetRemoveRole() {
+    assertEquals("", regionRole.get(div));
+    regionRole.set(div);
+    assertEquals(regionRole.getName(), regionRole.get(div));
+    regionRole.remove(div);
+    assertEquals("", regionRole.get(div));
+  }
+  
+  public void testSetGetRemoveProperty() {
+    IdReferenceList idRefs = new IdReferenceList("test1");
+    assertEquals("", regionRole.getAriaLabelledbyProperty(div));
+    regionRole.setAriaLabelledbyProperty(div, idRefs);
+    assertEquals("test1", regionRole.getAriaLabelledbyProperty(div));
+    regionRole.removeAriaLabelledbyProperty(div);
+    assertEquals("", regionRole.getAriaLabelledbyProperty(div));
+  }
+  
+  public void testSetGetRemoveNmtokensProperty() {
+    ButtonRole buttonRole = Roles.getButtonRole();
+    assertEquals("", buttonRole.getAriaDropeffectProperty(div));
+    regionRole.setAriaDropeffectProperty(div, new DropeffectTokenList(DropeffectToken.COPY, 
+        DropeffectToken.MOVE));
+    assertEquals("copy move", regionRole.getAriaDropeffectProperty(div));
+    regionRole.removeAriaDropeffectProperty(div);
+    assertEquals("", regionRole.getAriaDropeffectProperty(div));
+  }
+  
+  public void testSetGetRemoveState() {
+    assertEquals("", regionRole.getAriaInvalidState(div));
+    regionRole.setAriaInvalidState(div, StateTokenTypes.InvalidToken.GRAMMAR);
+    assertEquals(StateTokenTypes.InvalidToken.GRAMMAR.getAriaValue(), 
+        regionRole.getAriaInvalidState(div));
+    regionRole.removeAriaInvalidState(div);
+    assertEquals("", regionRole.getAriaInvalidState(div));
+  }
+  
+  public void testSetGetRemoveExtraAttributes() {
+    assertEquals("", regionRole.getTabindexExtraAttribute(div));
+    regionRole.setTabindexExtraAttribute(div, 1);
+    assertEquals("1", regionRole.getTabindexExtraAttribute(div));
+    regionRole.removeTabindexExtraAttribute(div);
+    assertEquals("", regionRole.getTabindexExtraAttribute(div));
+  }
+  
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.aria.Aria";
+  }
+  
+  @Override
+  protected void gwtSetUp() throws Exception {
+    super.gwtSetUp();
+    div = Document.get().createDivElement();
+    div.setAttribute("id", "test1");
+    Document.get().getBody().appendChild(div);
+    regionRole = Roles.getRegionRole();
+  }
+  
+  @Override
+  protected void gwtTearDown() throws Exception {
+    super.gwtTearDown();
+    div.removeFromParent();
+  }
+}
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 11b6758..0f8891c 100644
--- a/user/test/com/google/gwt/user/cellview/client/SimplePagerTest.java
+++ b/user/test/com/google/gwt/user/cellview/client/SimplePagerTest.java
@@ -15,6 +15,14 @@
  */
 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;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.NodeList;
+import com.google.gwt.user.cellview.client.SimplePager.ImageButtonsConstants;
 import com.google.gwt.view.client.HasRows;
 import com.google.gwt.view.client.MockHasData;
 
@@ -22,10 +30,35 @@
  * Tests for {@link SimplePager}.
  */
 public class SimplePagerTest extends AbstractPagerTest {
+  private ImageButtonsConstants imageButtonConstants; 
+  
+  @Override
+  protected void gwtSetUp() throws Exception {
+    super.gwtSetUp();
+    imageButtonConstants = GWT.create(ImageButtonsConstants.class);
+  }
 
+  public void testAriaAttributesAdded_firstLoad() {
+    SimplePager pager = createPager();
+    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));
+      String label = imgElem.getAttribute(Property.LABEL.getName());
+      assertNotNull(label);
+      if (label.equals(imageButtonConstants.firstPage()) 
+          || label.equals(imageButtonConstants.prevPage()) 
+          || label.equals(imageButtonConstants.nextPage())) {
+        assertEquals("true", imgElem.getAttribute(State.DISABLED.getName()));  
+      } else {
+        assertEquals("", imgElem.getAttribute(State.DISABLED.getName()));
+      }
+    }
+  }
+  
   public void testNextButtonsDisabled() {
     SimplePager pager = createPager();
-
+    
     // Buttons are disabled by default.
     assertTrue(pager.isPreviousButtonDisabled());
     assertTrue(pager.isNextButtonDisabled());