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());
