Cutting at r11274 for 2.5 RC2 - the history for RC1 is in svn/tags/2.5.0-rc1



git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/2.5@11292 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/HtmlWriter.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/HtmlWriter.java
new file mode 100644
index 0000000..43913c3
--- /dev/null
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/HtmlWriter.java
@@ -0,0 +1,114 @@
+// Copyright 2012 Google Inc. All Rights Reserved.
+
+package com.google.gwt.dev.codeserver;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Writes HTML to a stream.
+ *
+ * @author skybrian@google.com (Brian Slesinsky)
+ */
+class HtmlWriter {
+  private static final Set<String> ALLOWED_TAGS =
+      Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(
+          "html", "head", "title", "style", "body", "pre", "span")));
+  private static final Set<String> ALLOWED_ATTS =
+      Collections.unmodifiableSet(new HashSet<String>(Arrays.asList("class=")));
+
+  private final Writer out;
+
+  HtmlWriter(Writer out) {
+    this.out = out;
+  }
+
+  HtmlWriter startTag(String tag) throws IOException {
+    checkTag(tag);
+    out.write('<');
+    out.write(tag);
+    out.write('>');
+    return this;
+  }
+
+  HtmlWriter startTag(String tag, String att, String value) throws IOException {
+    checkTag(tag);
+    out.write('<');
+    out.write(tag);
+    writeAtt(att, value);
+    out.write('>');
+    return this;
+  }
+
+  HtmlWriter endTag(String tag) throws IOException {
+    checkTag(tag);
+    out.write("</");
+    out.write(tag);
+    out.write('>');
+    return this;
+  }
+
+  /**
+   * Writes plain text (escaped).
+   */
+  HtmlWriter text(String plainText) throws IOException {
+    for (char c : plainText.toCharArray()) {
+      text(c);
+    }
+    return this;
+  }
+
+  /**
+   * Writes plain text (escaped).
+   */
+  void text(char c) throws IOException {
+    switch(c) {
+      case '<':
+        out.write("&lt;");
+        break;
+      case '>':
+        out.write("&gt;");
+        break;
+      case '&':
+        out.write("&amp;");
+        break;
+      case '"':
+        out.write("&quot;");
+        break;
+      default:
+        out.write(c);
+    }
+  }
+
+  /**
+   * Writes a newline.
+   */
+  void nl() throws IOException {
+    out.append('\n');
+  }
+
+  private void writeAtt(String att, String value) throws IOException {
+    checkAtt(att);
+    out.write(' ');
+    out.write(att);
+    out.write('"');
+    text(value);
+    out.write('"');
+  }
+
+  private void checkTag(String tag) {
+    if (!ALLOWED_TAGS.contains(tag)) {
+      throw new IllegalArgumentException("unknown tag: " + tag);
+    }
+  }
+
+  private void checkAtt(String att) {
+    if (!ALLOWED_ATTS.contains(att)) {
+      throw new IllegalArgumentException("unknown att: " + att);
+    }
+  }
+}
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
index b731bb6..2d46607 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
@@ -21,7 +21,9 @@
 import com.google.gwt.dev.json.JsonArray;
 import com.google.gwt.dev.json.JsonObject;
 
+import java.io.BufferedInputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStream;
@@ -110,13 +112,30 @@
   }
 
   /**
-   * Finds a source file (or other resource) in this module's source path.
-   * @param resourceName the relative path to a resource in the module's classpath.
-   * @return a stream for reading the resource, or null if not found.
+   * Finds a source file (or other resource) that's either in this module's source path, or
+   * is a generated file.
+   * @param path location of the file relative to its directory in the classpath, or (if
+   *   it starts with "gen/"), a generated file.
+   * @return bytes in the file, or null if there's no such source file.
    */
-  InputStream openSourceFile(String resourceName) throws IOException {
-    URL resource = recompiler.getResourceLoader().getResource(resourceName);
-    return resource == null ? null : resource.openStream();
+  InputStream openSourceFile(String path) throws IOException {
+
+    if (path.startsWith("gen/")) {
+      // generated file?
+      String rest = path.substring("gen/".length());
+      File fileInGenDir = new File(getGenDir(), rest);
+      if (!fileInGenDir.isFile()) {
+        return null;
+      }
+      return new BufferedInputStream(new FileInputStream(fileInGenDir));
+    } else {
+      // regular source file?
+      URL resource = recompiler.getResourceLoader().getResource(path);
+      if (resource == null) {
+        return null;
+      }
+      return resource.openStream();
+    }
   }
 
   /**
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java
new file mode 100644
index 0000000..3076afa
--- /dev/null
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.dev.codeserver;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.dev.json.JsonObject;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.net.URL;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Static utility methods for sending web pages.
+ *
+ * @author skybrian@google.com (Brian Slesinsky)
+ */
+class PageUtil {
+
+  /**
+   * Sends a page represented as a string.
+   */
+  static void sendString(String mimeType, String page, HttpServletResponse response)
+      throws IOException {
+    response.setStatus(HttpServletResponse.SC_OK);
+    response.setContentType(mimeType);
+    response.getWriter().append(page);
+  }
+
+  /**
+   * Sends an HTML page with some JSON code prepended to it.
+   *
+   * @param variableName  the name of the variable to set on the "window" object.
+   * @param json  the data to embed in the script.
+   * @param resourceName  the name of the HTML file to send (in the current directory)
+   * @param response  where to send the page
+   * @param logger  where to log errors (if any)
+   */
+  static void sendJsonAndHtml(String variableName, JsonObject json, String resourceName,
+      HttpServletResponse response, TreeLogger logger)
+      throws IOException {
+    URL resource = WebServer.class.getResource(resourceName);
+    if (resource == null) {
+      response.sendError(HttpServletResponse.SC_NOT_FOUND);
+      logger.log(TreeLogger.ERROR, "resource not found: " + resourceName);
+      return;
+    }
+    response.setStatus(HttpServletResponse.SC_OK);
+    response.setContentType("text/html");
+
+    ServletOutputStream outBytes = response.getOutputStream();
+    Writer out = new OutputStreamWriter(outBytes, "UTF-8");
+
+    out.append("<script>\n");
+    out.append("window." + variableName + " = ");
+    json.write(out);
+    out.append(";\n");
+    out.append("</script>\n");
+    out.flush();
+
+    copyStream(resource.openStream(), outBytes);
+  }
+
+  static void sendJsonAndJavaScript(String variableName, JsonObject json, String resourceName,
+      HttpServletResponse response, TreeLogger logger)
+      throws IOException {
+    URL resource = WebServer.class.getResource(resourceName);
+    if (resource == null) {
+      response.sendError(HttpServletResponse.SC_NOT_FOUND);
+      logger.log(TreeLogger.ERROR, "resource not found: " + resourceName);
+      return;
+    }
+    response.setStatus(HttpServletResponse.SC_OK);
+    response.setContentType("application/javascript");
+
+    ServletOutputStream outBytes = response.getOutputStream();
+    Writer out = new OutputStreamWriter(outBytes, "UTF-8");
+
+    out.append("window." + variableName + " = ");
+    json.write(out);
+    out.append(";\n");
+    out.flush();
+
+    copyStream(resource.openStream(), outBytes);
+  }
+
+  static void sendFile(String mimeType, File file, HttpServletResponse response)
+      throws IOException {
+    BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
+    sendStream(mimeType, in, response);
+  }
+
+  /**
+   * Sends a page. Closes pageBytes when done.
+   */
+  static void sendStream(String mimeType, InputStream pageBytes, HttpServletResponse response)
+      throws IOException {
+    response.setStatus(HttpServletResponse.SC_OK);
+    response.setContentType(mimeType);
+    copyStream(pageBytes, response.getOutputStream());
+  }
+
+  /**
+   * Copies in to out and closes in when done.
+   */
+  private static void copyStream(InputStream in, OutputStream out) throws IOException {
+    try {
+      byte[] buffer = new byte[8 * 1024];
+      while (true) {
+        int bytesRead = in.read(buffer);
+        if (bytesRead == -1) {
+          return;
+        }
+        out.write(buffer, 0, bytesRead);
+      }
+    } finally {
+      in.close();
+    }
+  }
+}
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/SourceHandler.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/SourceHandler.java
index 53d9629..e24755a 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/SourceHandler.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/SourceHandler.java
@@ -18,15 +18,10 @@
 
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.dev.json.JsonArray;
-import com.google.gwt.dev.json.JsonException;
 import com.google.gwt.dev.json.JsonObject;
-import com.google.gwt.dev.util.Util;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.StringReader;
-import java.io.StringWriter;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -65,19 +60,35 @@
   void handle(String target, HttpServletRequest request, HttpServletResponse response)
       throws IOException {
     String moduleName = getModuleNameFromRequest(target);
-    assert moduleName != null;
-    if (target.equals(SOURCEMAP_PATH + moduleName + "/gwtSourceMap.json")) {
-        sendSourceMap(moduleName, request, response);
-        return;
+    if (moduleName == null) {
+      throw new RuntimeException("invalid request (shouldn't happen): " + target);
     }
 
-    if (target.endsWith(".java")) {
-      sendSourceFile(target, moduleName, response);
+    String rootDir = SOURCEMAP_PATH + moduleName + "/";
+    if (!target.startsWith(rootDir)) {
+      response.sendError(HttpServletResponse.SC_NOT_FOUND);
+      logger.log(TreeLogger.WARN, "returned not found for request: " + target);
       return;
     }
 
-    response.sendError(HttpServletResponse.SC_NOT_FOUND);
-    logger.log(TreeLogger.WARN, "returned not found for request: " + target);
+    String rest = target.substring(rootDir.length());
+
+    if (rest.isEmpty()) {
+      sendDirectoryListPage(moduleName, response);
+
+    } else if (rest.endsWith("/")) {
+      sendFileListPage(moduleName, rest, response);
+
+    } else if (rest.equals("gwtSourceMap.json")) {
+      sendSourceMap(moduleName, request, response);
+
+    } else if (rest.endsWith(".java")) {
+      sendSourceFile(moduleName, rest, response);
+
+    } else {
+      response.sendError(HttpServletResponse.SC_NOT_FOUND);
+      logger.log(TreeLogger.WARN, "returned not found for request: " + target);
+    }
   }
 
   private String getModuleNameFromRequest(String target) {
@@ -96,79 +107,67 @@
       HttpServletResponse response) throws IOException {
 
     ModuleState moduleState = modules.get(moduleName);
-    String sourceMapJson = Util.readFileAsString(moduleState.findSourceMap());
+    SourceMap map = SourceMap.load(moduleState.findSourceMap());
 
     // hack: rewrite the source map so that each filename is a URL
     String serverPrefix = String.format("http://%s:%d/sourcemaps/%s/", request.getServerName(),
         request.getServerPort(), moduleName);
-    sourceMapJson = addPrefixToSourceMapFilenames(serverPrefix, sourceMapJson);
+    map.addPrefixToEachSourceFile(serverPrefix);
 
-    WebServer.sendPage("application/json", sourceMapJson, response);
+    PageUtil.sendString("application/json", map.serialize(), response);
     logger.log(TreeLogger.WARN, "sent source map for module: " + moduleName);
   }
 
-  private void sendSourceFile(String target, String moduleName, HttpServletResponse response)
+  private void sendDirectoryListPage(String moduleName, HttpServletResponse response)
       throws IOException {
-    String path = removePrefix(target, "/sourcemaps/" + moduleName + "/");
+
     ModuleState moduleState = modules.get(moduleName);
-    // generated file?
-    if (path.startsWith("gen/")) {
-      File fileInGenDir = new File(moduleState.getGenDir(), removePrefix(path, "gen/"));
-      if (!fileInGenDir.isFile()) {
-        sendNotFound(response, target);
-        return;
-      }
-      WebServer.sendPage("text/plain", fileInGenDir, response);
-      return;
-    }
+    SourceMap map = SourceMap.load(moduleState.findSourceMap());
 
-    // regular source file?
-    InputStream pageBytes = moduleState.openSourceFile(path);
+    JsonObject config = new JsonObject();
+    config.put("moduleName", moduleName);
+    JsonArray directories = new JsonArray();
+    for (String name : map.getSourceDirectories()) {
+      JsonObject dir = new JsonObject();
+      dir.put("name", name);
+      dir.put("link", name + "/");
+      directories.add(dir);
+    }
+    config.put("directories", directories);
+    PageUtil.sendJsonAndHtml("config", config, "directorylist.html", response, logger);
+  }
+
+  private void sendFileListPage(String moduleName, String rest, HttpServletResponse response)
+      throws IOException {
+
+    ModuleState moduleState = modules.get(moduleName);
+    SourceMap map = SourceMap.load(moduleState.findSourceMap());
+
+    JsonObject config = new JsonObject();
+    config.put("moduleName", moduleName);
+    config.put("directory", rest);
+    JsonArray files = new JsonArray();
+    for (String name : map.getSourceFilesInDirectory(rest)) {
+      JsonObject file = new JsonObject();
+      file.put("name", name);
+      file.put("link", name);
+      files.add(file);
+    }
+    config.put("files", files);
+    PageUtil.sendJsonAndHtml("config", config, "filelist.html", response, logger);
+  }
+
+  private void sendSourceFile(String moduleName, String rest, HttpServletResponse response)
+      throws IOException {
+    ModuleState moduleState = modules.get(moduleName);
+    InputStream pageBytes = moduleState.openSourceFile(rest);
+
     if (pageBytes == null) {
-      sendNotFound(response, target);
+      response.sendError(HttpServletResponse.SC_NOT_FOUND);
+      logger.log(TreeLogger.WARN, "unknown source file: " + rest);
       return;
     }
 
-    WebServer.sendPage("text/plain", pageBytes, response);
-  }
-
-  /**
-   * Adds the given prefix to each filename in a source map.
-   * @return the JSON of the modified source map
-   */
-  private String addPrefixToSourceMapFilenames(String serverPrefix, String sourceMapJson) {
-
-    JsonObject sourceMap = null;
-    try {
-      sourceMap = JsonObject.parse(new StringReader(sourceMapJson));
-    } catch (JsonException e) {
-      throw new RuntimeException("can't parse sourcemap as json", e);
-    } catch (IOException e) {
-      throw new RuntimeException("can't parse sourcemap as json", e);
-    }
-    JsonArray sources = (JsonArray) sourceMap.get("sources");
-    JsonArray newSources = new JsonArray();
-    for (int i = 0; i < sources.getLength(); i++) {
-      String filename = sources.get(i).asString().getString();
-      newSources.add(serverPrefix + filename);
-    }
-    sourceMap.put("sources", newSources);
-    StringWriter buffer = new StringWriter();
-    try {
-      sourceMap.write(buffer);
-    } catch (IOException e) {
-      throw new RuntimeException("can't convert sourcemap to json");
-    }
-    return buffer.toString();
-  }
-
-  private void sendNotFound(HttpServletResponse response, String target) throws IOException {
-    response.sendError(HttpServletResponse.SC_NOT_FOUND);
-    logger.log(TreeLogger.WARN, "unknown source file: " + target);
-  }
-
-  private String removePrefix(String s, String prefix) {
-    assert s.startsWith(prefix);
-    return s.substring(prefix.length());
+    PageUtil.sendStream("text/plain", pageBytes, response);
   }
 }
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/SourceMap.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/SourceMap.java
new file mode 100644
index 0000000..dd584b8
--- /dev/null
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/SourceMap.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.dev.codeserver;
+
+import com.google.gwt.dev.json.JsonArray;
+import com.google.gwt.dev.json.JsonException;
+import com.google.gwt.dev.json.JsonObject;
+import com.google.gwt.dev.util.Util;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * In-memory representation of a SourceMap.
+ *
+ * @author skybrian@google.com (Brian Slesinsky)
+ */
+class SourceMap {
+  private final JsonObject json;
+
+  /** @see #load */
+  private SourceMap(JsonObject json) {
+    this.json = json;
+  }
+
+  static SourceMap load(File file) {
+    String sourceMapJson = Util.readFileAsString(file);
+
+    JsonObject json;
+    try {
+      json = JsonObject.parse(new StringReader(sourceMapJson));
+    } catch (JsonException e) {
+      throw new RuntimeException("can't parse sourcemap as json", e);
+    } catch (IOException e) {
+      throw new RuntimeException("can't parse sourcemap as json", e);
+    }
+
+    return new SourceMap(json);
+  }
+
+  /**
+   * Adds the given prefix to each source filename in the source map.
+   */
+  void addPrefixToEachSourceFile(String serverPrefix) {
+    JsonArray sources = (JsonArray) json.get("sources");
+    JsonArray newSources = new JsonArray();
+    for (int i = 0; i < sources.getLength(); i++) {
+      String filename = sources.get(i).asString().getString();
+      newSources.add(serverPrefix + filename);
+    }
+    json.put("sources", newSources);
+  }
+
+  /**
+   * Returns a sorted list of all the directories containing at least one filename
+   * in the source map.
+   */
+  List<String> getSourceDirectories() {
+    JsonArray sources = (JsonArray) json.get("sources");
+    Set<String> directories = new HashSet<String>();
+    for (int i = 0; i < sources.getLength(); i++) {
+      String filename = sources.get(i).asString().getString();
+      directories.add(new File(filename).getParent());
+    }
+
+    List<String> result = new ArrayList<String>();
+    result.addAll(directories);
+    Collections.sort(result);
+    return result;
+  }
+
+  /**
+   * Returns a sorted list of all filenames in the given directory.
+   */
+  public List<String> getSourceFilesInDirectory(String parent) {
+    if (!parent.endsWith("/")) {
+      throw new IllegalArgumentException("unexpected: " + parent);
+    }
+
+    JsonArray sources = (JsonArray) json.get("sources");
+
+    List<String> result = new ArrayList<String>();
+    for (int i = 0; i < sources.getLength(); i++) {
+      File candidate = new File(sources.get(i).asString().getString());
+      if (parent.equals(candidate.getParent() + "/")) {
+        result.add(candidate.getName());
+      }
+    }
+
+    return result;
+  }
+
+  String serialize() {
+    StringWriter buffer = new StringWriter();
+    try {
+      json.write(buffer);
+    } catch (IOException e) {
+      throw new RuntimeException("can't convert sourcemap to json");
+    }
+    return buffer.toString();
+  }
+}
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
index 5f85a54..7250bcd 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
@@ -26,26 +26,17 @@
 import com.google.gwt.thirdparty.org.mortbay.jetty.handler.AbstractHandler;
 import com.google.gwt.thirdparty.org.mortbay.jetty.nio.SelectChannelConnector;
 
-import java.io.BufferedInputStream;
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileReader;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
-import java.io.Writer;
-import java.net.InetAddress;
-import java.net.URL;
 import java.net.URLConnection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -73,6 +64,9 @@
   private static final Pattern SAFE_MODULE_PATH =
       Pattern.compile("/(" + SAFE_DIRECTORY + ")/$");
 
+  static final Pattern SAFE_DIRECTORY_PATH =
+      Pattern.compile("/(" + SAFE_DIRECTORY + "/)+$");
+
   /* visible for testing */
   static final Pattern SAFE_FILE_PATH =
       Pattern.compile("/(" + SAFE_DIRECTORY + "/)+" + SAFE_FILENAME + "$");
@@ -154,14 +148,16 @@
     if (target.equals("/")) {
       setHandled(request);
       JsonObject config = makeConfig();
-      sendJsonAndHtmlPage("config", config, "frontpage.html", response);
+      PageUtil.sendJsonAndHtml("config", config, "frontpage.html", response, logger);
       return;
     }
 
     if (target.equals("/dev_mode_on.js")) {
       setHandled(request);
       JsonObject config = makeConfig();
-      sendJsonAndJavaScriptPage("__gwt_codeserver_config", config, "dev_mode_on.js", response);
+      PageUtil
+          .sendJsonAndJavaScript("__gwt_codeserver_config", config, "dev_mode_on.js", response,
+              logger);
       return;
     }
 
@@ -210,6 +206,13 @@
       return;
     }
 
+    matcher = SAFE_DIRECTORY_PATH.matcher(target);
+    if (matcher.matches() && handler.isSourceMapRequest(target)) {
+      setHandled(request);
+      handler.handle(target, request, response);
+      return;
+    }
+
     matcher = SAFE_FILE_PATH.matcher(target);
     if (matcher.matches()) {
       setHandled(request);
@@ -217,31 +220,44 @@
         handler.handle(target, request, response);
         return;
       }
-      sendOutputFile(target, response);
+      sendOutputFile(target, request, response);
       return;
     }
 
     logger.log(TreeLogger.WARN, "ignored get request: " + target);
   }
 
-  private void sendOutputFile(String target, HttpServletResponse response) throws IOException {
+  private void sendOutputFile(String target, HttpServletRequest request,
+      HttpServletResponse response) throws IOException {
+
     int secondSlash = target.indexOf('/', 1);
     String moduleName = target.substring(1, secondSlash);
+    ModuleState moduleState = modules.get(moduleName);
 
-    File file = modules.get(moduleName).getOutputFile(target);
+    File file = moduleState.getOutputFile(target);
     if (!file.isFile()) {
-      response.sendError(HttpServletResponse.SC_NOT_FOUND);
-      logger.log(TreeLogger.WARN, "not found: " + file.toString());
-      return;
+      // perhaps it's compressed
+      file = moduleState.getOutputFile(target + ".gz");
+      if (!file.isFile()) {
+        response.sendError(HttpServletResponse.SC_NOT_FOUND);
+        logger.log(TreeLogger.WARN, "not found: " + file.toString());
+        return;
+      }
+      if (!request.getHeader("Accept-Encoding").contains("gzip")) {
+        response.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
+        logger.log(TreeLogger.WARN, "client doesn't accept gzip; bailing");
+        return;
+      }
+      response.addHeader("Content-Encoding", "gzip");
     }
 
-    String mimeType = guessMimeType(file.getName());
+    String mimeType = guessMimeType(target);
     if (target.endsWith(".cache.js")) {
       response.addHeader("X-SourceMap", SourceHandler.SOURCEMAP_PATH + moduleName +
           "/gwtSourceMap.json");
     }
     response.addHeader("Access-Control-Allow-Origin", "*");
-    sendPage(mimeType, file, response);
+    PageUtil.sendFile(mimeType, file, response);
   }
 
   private void sendModulePage(String moduleName, HttpServletResponse response) throws IOException {
@@ -251,7 +267,9 @@
       logger.log(TreeLogger.WARN, "module not found: " + moduleName);
       return;
     }
-    sendJsonAndHtmlPage("config", module.getTemplateVariables(), "modulepage.html", response);
+    PageUtil
+        .sendJsonAndHtml("config", module.getTemplateVariables(), "modulepage.html", response,
+            logger);
   }
 
   private JsonObject makeConfig() {
@@ -284,105 +302,61 @@
   }
 
   /**
-   * Sends an HTML page with some JSON code prepended to it.
-   *
-   * @param variableName the name of the variable to set on the "window" object.
-   * @param json         the data to embed in the script.
-   * @param resourceName the name of the HTML file to send (in the current directory)
-   * @param response     where to send the page
-   */
-  private void sendJsonAndHtmlPage(String variableName, JsonObject json, String resourceName,
-      HttpServletResponse response)
-      throws IOException {
-    URL resource = WebServer.class.getResource(resourceName);
-    if (resource == null) {
-      response.sendError(HttpServletResponse.SC_NOT_FOUND);
-      logger.log(TreeLogger.ERROR, "resource not found: " + resourceName);
-      return;
-    }
-    response.setStatus(HttpServletResponse.SC_OK);
-    response.setContentType("text/html");
-
-    ServletOutputStream outBytes = response.getOutputStream();
-    Writer out = new OutputStreamWriter(outBytes, "UTF-8");
-
-    out.append("<script>\n");
-    out.append("window." + variableName + " = ");
-    json.write(out);
-    out.append(";\n");
-    out.append("</script>\n");
-    out.flush();
-
-    copyStream(resource.openStream(), outBytes);
-  }
-
-  private void sendJsonAndJavaScriptPage(String variableName, JsonObject json, String resourceName,
-      HttpServletResponse response)
-      throws IOException {
-    URL resource = WebServer.class.getResource(resourceName);
-    if (resource == null) {
-      response.sendError(HttpServletResponse.SC_NOT_FOUND);
-      logger.log(TreeLogger.ERROR, "resource not found: " + resourceName);
-      return;
-    }
-    response.setStatus(HttpServletResponse.SC_OK);
-    response.setContentType("application/javascript");
-
-    ServletOutputStream outBytes = response.getOutputStream();
-    Writer out = new OutputStreamWriter(outBytes, "UTF-8");
-
-    out.append("window." + variableName + " = ");
-    json.write(out);
-    out.append(";\n");
-    out.flush();
-
-    copyStream(resource.openStream(), outBytes);
-  }
-
-  static void sendPage(String mimeType, File file, HttpServletResponse response)
-      throws IOException {
-    BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
-    sendPage(mimeType, in, response);
-  }
-
-  /**
-   * Sends a page. Closes pageBytes when done.
-   */
-  static void sendPage(String mimeType, InputStream pageBytes, HttpServletResponse response)
-      throws IOException {
-    response.setStatus(HttpServletResponse.SC_OK);
-    response.setContentType(mimeType);
-    copyStream(pageBytes, response.getOutputStream());
-  }
-
-  private static String guessMimeType(String filename) {
-    return URLConnection.guessContentTypeFromName(filename);
-  }
-
-  /**
-   * Sends a page represented as a string.
-   */
-  static void sendPage(String mimeType, String page, HttpServletResponse response)
-      throws IOException {
-    response.setStatus(HttpServletResponse.SC_OK);
-    response.setContentType(mimeType);
-    response.getWriter().append(page);
-  }
-
-  /**
    * Sends the log file as html with errors highlighted in red.
    */
   private void sendLogPage(String moduleName, File file, HttpServletResponse response)
        throws IOException {
+    BufferedReader reader = new BufferedReader(new FileReader(file));
+
     response.setStatus(HttpServletResponse.SC_OK);
     response.setContentType("text/html");
     response.setHeader("Content-Style-Type", "text/css");
-    Writer out = response.getWriter();
-    out.write("<html><head><title>" + moduleName + " compile log</title></head>\n<body>\n<pre>\n");
 
-    BufferedReader reader = new BufferedReader(new FileReader(file));
+    HtmlWriter out = new HtmlWriter(response.getWriter());
+    out.startTag("html").nl();
+    out.startTag("head").nl();
+    out.startTag("title").text(moduleName + " compile log").endTag("title").nl();
+    out.startTag("style").nl();
+    out.text(".error { color: red; font-weight: bold; }").nl();
+    out.endTag("style").nl();
+    out.endTag("head").nl();
+    out.startTag("body").nl();
     sendLogAsHtml(reader, out);
-    out.write("</pre></body></html>\n");
+    out.endTag("body").nl();
+    out.endTag("html").nl();
+  }
+
+  private static final Pattern ERROR_PATTERN = Pattern.compile("\\[ERROR\\]");
+
+  /**
+   * Copies in to out line by line, escaping each line for html characters and highlighting
+   * error lines. Closes <code>in</code> when done.
+   */
+  private static void sendLogAsHtml(BufferedReader in, HtmlWriter out) throws IOException {
+    try {
+      out.startTag("pre").nl();
+      String line = in.readLine();
+      while (line != null) {
+        Matcher m = ERROR_PATTERN.matcher(line);
+        boolean error = m.find();
+        if (error) {
+          out.startTag("span", "class=", "error");
+        }
+        out.text(line);
+        if (error) {
+          out.endTag("span");
+        }
+        out.nl(); // the readLine doesn't include the newline.
+        line = in.readLine();
+      }
+      out.endTag("pre").nl();
+    } finally {
+      in.close();
+    }
+  }
+
+  private static String guessMimeType(String filename) {
+    return URLConnection.guessContentTypeFromName(filename);
   }
 
   /**
@@ -405,80 +379,4 @@
         HttpConnection.getCurrentConnection().getRequest();
     baseRequest.setHandled(true);
   }
-
-  /**
-   * Copies in to out and closes in when done.
-   */
-  private static void copyStream(InputStream in, OutputStream out) throws IOException {
-    try {
-      byte[] buffer = new byte[8 * 1024];
-      while (true) {
-        int bytesRead = in.read(buffer);
-        if (bytesRead == -1) {
-          return;
-        }
-        out.write(buffer, 0, bytesRead);
-      }
-    } finally {
-      in.close();
-    }
-  }
-
-  private static final Pattern ERROR_PATTERN = Pattern.compile("\\[ERROR\\]");
-
-  private static final String ERROR_STYLE_START = "<span style='color: red; font-weight: bold;'>";
-  private static final String ERROR_STYLE_END = "</span>";
-
-  /**
-   * Copies in to out line by line, escaping each line for html characters and highlighting
-   * error lines. Closes <code>in</code> when done.
-   */
-  private static void sendLogAsHtml(BufferedReader in, Writer out) throws IOException {
-    try {
-      String line = in.readLine();
-      while (line != null) {
-        line = escapeHtmlCharacters(line);
-        Matcher m = ERROR_PATTERN.matcher(line);
-        boolean error = m.find();
-        if (error) {
-          out.write(ERROR_STYLE_START);
-        }
-        out.write(line);
-        if (error) {
-          out.write(ERROR_STYLE_END);
-        }
-        out.write('\n'); // the readLine doesn't include the newline.
-        line = in.readLine();
-      }
-    } finally {
-      in.close();
-    }
-  }
-
-  /**
-   * Converts any special html characters to escape sequences.
-   */
-  private static String escapeHtmlCharacters(String line) {
-    StringBuilder sb = new StringBuilder(line.length());
-    for (char c : line.toCharArray()) {
-     escapeAndAppendCharacter(c, sb);
-    }
-    return sb.toString();
-  }
-
-  private static void escapeAndAppendCharacter(char c, StringBuilder sb) {
-    switch(c) {
-      case '<':
-        sb.append("&lt;");
-        break;
-      case '>':
-        sb.append("&gt;");
-        break;
-      case '&':
-        sb.append("&amp;");
-        break;
-      default:
-        sb.append(c);
-    }
-  }
 }
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html
new file mode 100644
index 0000000..b7427a1
--- /dev/null
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html
@@ -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   -->
+<!-- may obtain a copy of the License at                                    -->
+<!--                                                                        -->
+<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
+<!--                                                                        -->
+<!-- Unless required by applicable law or agreed to in 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.                                         -->
+
+<html>
+<head>
+  <title>Loading...</title>
+
+  <script>
+    function updatePage(config) {
+      var title = config.moduleName + " Source (GWT Code Server)";
+      document.getElementsByTagName("title")[0].textContent = title;
+      document.getElementById("title").textContent = title;
+
+      document.getElementById("logLink").setAttribute("href", "../log/" + config.moduleName);
+      updateFileList(config, document.getElementById("files"));
+    }
+
+    function updateFileList(config, resultElement) {
+      for (var i = 0; i < config.directories.length; i++) {
+        var dir = config.directories[i];
+
+        var anchor = document.createElement("a");
+        anchor.setAttribute("href", dir.link);
+        anchor.textContent = dir.name;
+
+        var listItem = document.createElement("li");
+        listItem.appendChild(anchor);
+        resultElement.appendChild(listItem);
+      }
+    }
+  </script>
+
+</head>
+<body onload="updatePage(config)">
+<h1 id="title">Loading...</h1>
+
+<p><a id="logLink">Messages</a> from the last time this module was compiled.</p>
+
+<h2>Source Directories</h2>
+<p>(From the last successful compile.)</p>
+<ul id="files">
+</ul>
+
+</body>
+</html>
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html
new file mode 100644
index 0000000..511f39b
--- /dev/null
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html
@@ -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   -->
+<!-- may obtain a copy of the License at                                    -->
+<!--                                                                        -->
+<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
+<!--                                                                        -->
+<!-- Unless required by applicable law or agreed to in 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.                                         -->
+
+<html>
+<head>
+  <title>Loading...</title>
+
+  <script>
+    function updatePage(config) {
+      var title = config.moduleName + " Source (GWT Code Server)";
+      document.getElementsByTagName("title")[0].textContent = title;
+      document.getElementById("title").textContent = title;
+
+      document.getElementById("logLink")
+              .setAttribute("href", "/log/" + config.moduleName);
+      document.getElementById("topLink")
+              .setAttribute("href", "/sourcemaps/" + config.moduleName + "/");
+      document.getElementById("subhead")
+              .appendChild(document.createTextNode(" in " + config.directory));
+      updateFileList(config, document.getElementById("files"));
+    }
+
+    function updateFileList(config, resultElement) {
+      for (var i = 0; i < config.files.length; i++) {
+        var file = config.files[i];
+
+        var anchor = document.createElement("a");
+        anchor.setAttribute("href", file.link);
+        anchor.textContent = file.name;
+
+        var listItem = document.createElement("li");
+        listItem.appendChild(anchor);
+        resultElement.appendChild(listItem);
+      }
+    }
+  </script>
+
+</head>
+<body onload="updatePage(config)">
+<h1 id="title">Loading...</h1>
+
+<p><a id="logLink">Messages</a> from the last time this module was compiled.</p>
+<p><a id="topLink">Source Directories</a></p>
+
+<h2 id="subhead">Files</h2>
+<p>(From the last successful compile.)</p>
+<ul id="files">
+</ul>
+
+</body>
+</html>
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html
index ac7a937..239d44e 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html
@@ -21,7 +21,10 @@
       document.getElementsByTagName("title")[0].textContent = title;
       document.getElementById("title").textContent = title;
 
-      document.getElementById("logLink").setAttribute("href", "../log/" + config.moduleName);
+      document.getElementById("logLink")
+              .setAttribute("href", "../log/" + config.moduleName);
+      document.getElementById("srcLink")
+              .setAttribute("href", "../sourcemaps/" + config.moduleName + "/");
       updateFileList(config, document.getElementById("files"));
     }
 
@@ -45,6 +48,7 @@
 <h1 id="title">Loading...</h1>
 
 <p><a id="logLink">Messages</a> from the last time this module was compiled.</p>
+<p><a id="srcLink">Source</a> from the last time this module was compiled.</p>
 
 <h2>Output Files</h2>
 <p>(From the last successful compile.)</p>
diff --git a/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java b/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java
index 8044729..7ab0c83 100644
--- a/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java
+++ b/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java
@@ -261,4 +261,4 @@
   public void setValidateOnly(boolean validateOnly) {
     this.validateOnly = validateOnly;
   }
-}
+}
\ No newline at end of file
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java b/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java
index 228b2a9..7781753 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java
@@ -51,6 +51,7 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Manages a centralized cache for compiled units.
@@ -203,23 +204,36 @@
 
       ArrayList<CompilationUnit> resultUnits = new ArrayList<CompilationUnit>();
       do {
+        final TreeLogger branch = logger.branch(TreeLogger.TRACE, "Compiling...");
         // Compile anything that needs to be compiled.
         buildQueue = new LinkedBlockingQueue<CompilationUnitBuilder>();
         final ArrayList<CompilationUnit> newlyBuiltUnits = new ArrayList<CompilationUnit>();
         final CompilationUnitBuilder sentinel = CompilationUnitBuilder.create((GeneratedUnit) null);
         final Throwable[] workerException = new Throwable[1];
+        final ProgressLogger progressLogger =
+            new ProgressLogger(branch, TreeLogger.TRACE, builders.size(), 10);
         Thread buildThread = new Thread() {
           @Override
           public void run() {
+            int processedCompilationUnitBuilders = 0;
             try {
               do {
                 CompilationUnitBuilder builder = buildQueue.take();
+                if (!progressLogger.isTimerStarted()) {
+                  // Set start time here, after first job has arrived, since it can take a little
+                  // while for the first job to arrive, and this helps with the accuracy of the
+                  // estimated times.
+                  progressLogger.startTimer();
+                }
                 if (builder == sentinel) {
                   return;
                 }
                 // Expensive, must serialize GWT AST types to bytes.
                 CompilationUnit unit = builder.build();
                 newlyBuiltUnits.add(unit);
+
+                processedCompilationUnitBuilders++;
+                progressLogger.updateProgress(processedCompilationUnitBuilders);
               } while (true);
             } catch (Throwable e) {
               workerException[0] = e;
@@ -229,6 +243,7 @@
         buildThread.setName("CompilationUnitBuilder");
         buildThread.start();
         Event jdtCompilerEvent = SpeedTracerLogger.start(eventType);
+        long compilationStartNanos = System.nanoTime();
         try {
           compiler.doCompile(builders);
         } finally {
@@ -237,6 +252,11 @@
         buildQueue.add(sentinel);
         try {
           buildThread.join();
+          long compilationNanos = System.nanoTime() - compilationStartNanos;
+          // Convert nanos to seconds.
+          double compilationSeconds = compilationNanos / (double) TimeUnit.SECONDS.toNanos(1);
+          branch.log(TreeLogger.TRACE,
+              String.format("Compilation completed in %.02f seconds", compilationSeconds));
           if (workerException[0] != null) {
             throw workerException[0];
           }
diff --git a/dev/core/src/com/google/gwt/dev/javac/ProgressLogger.java b/dev/core/src/com/google/gwt/dev/javac/ProgressLogger.java
new file mode 100644
index 0000000..16829aa
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/javac/ProgressLogger.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.javac;
+
+import com.google.gwt.core.ext.TreeLogger;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Logs progress of an operation, attempting to calculate an estimated time remaining (ETR) for
+ * the entire operation for each log entry, assuming that progress is approximately linear.
+ */
+class ProgressLogger {
+
+  /**
+   * An interface for retrieving nanosecond times, useable ONLY for deltas.
+   */
+  interface NanoSource {
+
+    /**
+     * Returns a number of nanoseconds. Subtracting the results of two invocations of this method
+     * yields the approximate number of nanoseconds between the invocations.
+     */
+    long getNanos();
+  }
+
+  // Constant for dividing nanosecond time intervals by to get second time intervals. It is a double
+  // in order to allow fractional seconds.
+  private static final long NANOSECONDS_IN_SECOND = TimeUnit.SECONDS.toNanos(1);
+  // The minimum amount of progress that must be made before an ETR is calculated (where 1.0 is
+  // 100%). If this is too low, then early, inaccurate estimates will be shown.
+  private static final double ETR_ACCURACY_THRESHOLD = 0.05;
+  // The number of seconds before which no log is shown. This reduces log spam for things with
+  // fast progress.
+  private static final int LOG_BLACKOUT_PERIOD = 5;
+  // The number of nanoseconds before which no log is shown.
+  private static final long LOG_BLACKOUT_PERIOD_NANOS = LOG_BLACKOUT_PERIOD * NANOSECONDS_IN_SECOND;
+
+  private final TreeLogger logger;
+  private final TreeLogger.Type logLevel;
+  private final int maxProgressUnits;
+  private final int percentageIncrement;
+  private final NanoSource nanoSource;
+
+  private long startNanos = 0;
+  private boolean timerStarted = false;
+  private long nextPercentage = 0;
+
+  /**
+   * Creates a ProgressLogger that logs messages with log level {@code logLevel} to {@code logger}.
+   * It will log only every {@code percentageIncrement} percent of progress, where progress is
+   * measured from 0 to {@code maxProgressUnits}. Gets nano time offsets for ETR calculations from
+   * {@link System#nanoTime()}.
+   */
+  ProgressLogger(TreeLogger logger, TreeLogger.Type logLevel, int maxProgressUnits,
+      int percentageIncrement) {
+    this.logger = logger;
+    this.logLevel = logLevel;
+    this.maxProgressUnits = maxProgressUnits;
+    this.percentageIncrement = percentageIncrement;
+    this.nanoSource = new NanoSource() {
+      @Override
+      public long getNanos() {
+        return System.nanoTime();
+      }
+    };
+  }
+
+  /**
+   * Returns true if {@link #startTimer()} has been called, and false otherwise.
+   */
+  boolean isTimerStarted() {
+    return timerStarted;
+  }
+
+  /**
+   * Sets the start time against which ETR calculations are made.
+   */
+  void startTimer() {
+    startNanos = nanoSource.getNanos();
+    timerStarted = true;
+  }
+
+  /**
+   * Notifies the ProgressLogger that progress has reached {@code progressUnits}. This may cause
+   * (depending on the ProgressLogger's settings) the emission of a log message in the form
+   * "[PERCENT]% complete (ETR: [ESTIMATED TIME REMAINING] seconds)" in most cases, or
+   * "[PERCENT]% complete (ETR: ?)" if not enough progress has been made to make a good estimate of
+   * remaining time.
+   *
+   * Successive calls to this method should provide monotonically increasing values of
+   * {@code progressUnits}. It does not support backwards progress.
+   */
+  void updateProgress(int progressUnits) {
+    // Only do the percentage calculation if the result would be logged.
+    if (!logger.isLoggable(logLevel)) {
+      return;
+    }
+
+    if (!timerStarted) {
+      throw new IllegalStateException("#updateProgress() called before #startTimer().");
+    }
+
+    double progress = progressUnits / (double) maxProgressUnits;
+    double currentPercentage = 100 * progress;
+    long elapsedNanos = nanoSource.getNanos() - startNanos;
+
+    // Display the percent complete if progress has reached the
+    // next percentage increment, or if progress is 100%.
+    if (currentPercentage < nextPercentage && progressUnits != maxProgressUnits) {
+      return;
+    }
+
+    // Don't log anything if < LOG_BLACKOUT_PERIOD_NANOS nanoseconds have elapsed.
+    if (elapsedNanos < LOG_BLACKOUT_PERIOD_NANOS) {
+      return;
+    }
+
+    // Show the largest integer multiple of the percentage increment that is less than the
+    // actual percentage.
+    long displayedPercentage =
+        percentageIncrement * Math.round(Math.floor(currentPercentage / percentageIncrement));
+    // If progress is 100%, just show 100%.
+    if (progressUnits == maxProgressUnits) {
+      displayedPercentage = 100;
+    }
+    
+    // Only attempt to estimate a time remaining if we have a reasonable amount of data to go
+    // on. Otherwise the estimates are wildly misleading.
+    if (progress >= ETR_ACCURACY_THRESHOLD) {
+      // Do linear extrapolation to estimate the amount of time remaining.
+      double estimatedTotalNanos = elapsedNanos / progress;
+      double estimatedNanosRemaining = estimatedTotalNanos - elapsedNanos;
+      // Convert nanos to seconds.
+      double estimatedSecondsRemaining = estimatedNanosRemaining / (double) NANOSECONDS_IN_SECOND;
+
+      logger.log(logLevel, String.format("%d%% complete (ETR: %d seconds)",
+          displayedPercentage, Math.round(estimatedSecondsRemaining)));
+    } else {
+      // Not enough information to estimate time remaining.
+      logger.log(logLevel, String.format("%d%% complete (ETR: ?)", displayedPercentage));
+    }
+    nextPercentage += percentageIncrement;
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index 231d823..042e145 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -67,8 +67,8 @@
 import com.google.gwt.dev.jjs.impl.AstDumper;
 import com.google.gwt.dev.jjs.impl.CastNormalizer;
 import com.google.gwt.dev.jjs.impl.CatchBlockNormalizer;
-import com.google.gwt.dev.jjs.impl.CodeSplitter.MultipleDependencyGraphRecorder;
 import com.google.gwt.dev.jjs.impl.CodeSplitter;
+import com.google.gwt.dev.jjs.impl.CodeSplitter.MultipleDependencyGraphRecorder;
 import com.google.gwt.dev.jjs.impl.CodeSplitter2;
 import com.google.gwt.dev.jjs.impl.ControlFlowAnalyzer;
 import com.google.gwt.dev.jjs.impl.DeadCodeElimination;
@@ -103,7 +103,9 @@
 import com.google.gwt.dev.jjs.impl.UnifyAst;
 import com.google.gwt.dev.jjs.impl.VerifySymbolMap;
 import com.google.gwt.dev.jjs.impl.gflow.DataflowOptimizer;
+import com.google.gwt.dev.js.BaselineCoverageGatherer;
 import com.google.gwt.dev.js.ClosureJsRunner;
+import com.google.gwt.dev.js.CoverageInstrumentor;
 import com.google.gwt.dev.js.EvalFunctionsAtTopScope;
 import com.google.gwt.dev.js.JsBreakUpLargeVarStatements;
 import com.google.gwt.dev.js.JsCoerceIntShift;
@@ -147,6 +149,7 @@
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
 import com.google.gwt.soyc.SoycDashboard;
 import com.google.gwt.soyc.io.ArtifactsOutputDirectory;
+import com.google.gwt.thirdparty.guava.common.collect.Multimap;
 
 import org.xml.sax.SAXException;
 
@@ -290,6 +293,15 @@
 
       ResolveRebinds.exec(jprogram, permutation.getOrderedRebindAnswers());
 
+      // Traverse the AST to figure out which lines are instrumentable for
+      // coverage. This has to happen before optimizations because functions might
+      // be optimized out; we want those marked as "not executed", not "not
+      // instrumentable".
+      Multimap<String, Integer> instrumentableLines = null;
+      if (System.getProperty("gwt.coverage") != null) {
+        instrumentableLines = BaselineCoverageGatherer.exec(jprogram);
+      }
+
       // (4) Optimize the normalized Java AST for each permutation.
       int optimizationLevel = options.getOptimizationLevel();
       if (optimizationLevel == OptionOptimize.OPTIMIZE_LEVEL_DRAFT) {
@@ -327,6 +339,14 @@
       // (8) Normalize the JS AST.
       // Fix invalid constructs created during JS AST gen.
       JsNormalizer.exec(jsProgram);
+
+      /*
+       * If coverage is enabled, instrument the AST to record location info.
+       */
+      if (instrumentableLines != null) {
+        CoverageInstrumentor.exec(jsProgram, instrumentableLines);
+      }
+
       // Resolve all unresolved JsNameRefs.
       JsSymbolResolver.exec(jsProgram);
       // Move all function definitions to a top-level scope, to reduce weirdness
@@ -1271,7 +1291,9 @@
           // variable names, some of the are property. At least this
           // this give us a safe approximation. Ideally we need
           // the code removal passes to remove stuff in the scope objects.
-          nameUsed.add(x.getName().getIdent());
+          if (x.isResolved()) {
+            nameUsed.add(x.getName().getIdent());
+          }
         }
         
         @Override
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
index 9cb3da6..ad4542f 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
@@ -111,6 +111,9 @@
       new HashMap<String, JPrimitiveType>();
 
   static {
+    if (System.getProperty("gwt.coverage") != null) {
+      IMMORTAL_CODEGEN_TYPES_SET.add("com.google.gwt.lang.CoverageUtil");
+    }
     CODEGEN_TYPES_SET.addAll(IMMORTAL_CODEGEN_TYPES_SET);
     INDEX_TYPES_SET.addAll(CODEGEN_TYPES_SET);
 
@@ -700,6 +703,10 @@
     return field;
   }
 
+  public Collection<JField> getIndexedFields() {
+    return Collections.unmodifiableCollection(indexedFields.values());
+  }
+
   public JMethod getIndexedMethod(String string) {
     JMethod method = indexedMethods.get(string);
     if (method == null) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index b7a8a26..1616123 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -893,6 +893,11 @@
       JsExpression rhs = (JsExpression) pop();
       JsName name = names.get(x);
 
+      if (program.getIndexedFields().contains(x)) {
+        indexedFields =
+            Maps.put(indexedFields, x.getEnclosingType().getShortName() + "." + x.getName(), name);
+      }
+
       if (x.isStatic()) {
         // setup a var for the static
         JsVar var = new JsVar(x.getSourceInfo(), name);
@@ -2342,6 +2347,8 @@
 
   private Map<String, JsFunction> indexedFunctions = Maps.create();
 
+  private Map<String, JsName> indexedFields = Maps.create();
+
   /**
    * Contains JsNames for all interface methods. A special scope is needed so
    * that independent classes will obfuscate their interface implementation
@@ -2626,6 +2633,7 @@
       }
     }
 
+    jsProgram.setIndexedFields(indexedFields);
     jsProgram.setIndexedFunctions(indexedFunctions);
 
     // TODO(spoon): Instead of gathering the information here, get it via
diff --git a/dev/core/src/com/google/gwt/dev/js/BaselineCoverageGatherer.java b/dev/core/src/com/google/gwt/dev/js/BaselineCoverageGatherer.java
new file mode 100644
index 0000000..fd44cd1
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/js/BaselineCoverageGatherer.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.js;
+
+import com.google.gwt.dev.jjs.InternalCompilerException;
+import com.google.gwt.dev.jjs.SourceInfo;
+import com.google.gwt.dev.jjs.ast.Context;
+import com.google.gwt.dev.jjs.ast.JClassLiteral;
+import com.google.gwt.dev.jjs.ast.JDeclarationStatement;
+import com.google.gwt.dev.jjs.ast.JExpression;
+import com.google.gwt.dev.jjs.ast.JField;
+import com.google.gwt.dev.jjs.ast.JMethodCall;
+import com.google.gwt.dev.jjs.ast.JProgram;
+import com.google.gwt.dev.jjs.ast.JThisRef;
+import com.google.gwt.dev.jjs.ast.JValueLiteral;
+import com.google.gwt.dev.jjs.ast.JVisitor;
+import com.google.gwt.dev.jjs.ast.js.JsniMethodBody;
+import com.google.gwt.dev.js.ast.JsContext;
+import com.google.gwt.dev.js.ast.JsExpression;
+import com.google.gwt.thirdparty.guava.common.base.Charsets;
+import com.google.gwt.thirdparty.guava.common.collect.HashMultimap;
+import com.google.gwt.thirdparty.guava.common.collect.ImmutableSet;
+import com.google.gwt.thirdparty.guava.common.collect.Multimap;
+import com.google.gwt.thirdparty.guava.common.collect.Sets;
+import com.google.gwt.thirdparty.guava.common.io.Files;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Set;
+
+/**
+ * Build up a collection of all instrumentable lines, useful for generating
+ * coverage reports.
+ */
+public class BaselineCoverageGatherer {
+  public static Multimap<String, Integer> exec(JProgram jProgram) {
+    return new BaselineCoverageGatherer(jProgram, getCoveredSourceFiles()).execImpl();
+  }
+
+  private static Set<String> getCoveredSourceFiles() {
+    String filename = System.getProperty("gwt.coverage");
+    if (filename.indexOf(',') != -1) {
+      return ImmutableSet.copyOf(filename.split(","));
+    }
+    File instrumentationFile = new File(filename);
+    try {
+      return Sets.newHashSet(Files.readLines(instrumentationFile, Charsets.UTF_8));
+    } catch (IOException e) {
+      throw new InternalCompilerException("Could not open " + filename, e);
+    }
+  }
+
+  private Multimap<String, Integer> instrumentableLines = HashMultimap.create();
+  private Set<String> instrumentedFiles;
+  private JProgram jProgram;
+
+  private BaselineCoverageGatherer(JProgram jProgram, Set<String> instrumentedFiles) {
+    this.jProgram = jProgram;
+    this.instrumentedFiles = instrumentedFiles;
+  }
+
+  private void cover(SourceInfo info) {
+    if (instrumentedFiles.contains(info.getFileName())) {
+      instrumentableLines.put(info.getFileName(), info.getStartLine());
+    }
+  }
+
+  private Multimap<String, Integer> execImpl() {
+    /**
+     * Figure out which lines are executable. This is mostly straightforward
+     * except that we have to avoid some synthetic nodes introduced earlier,
+     * otherwise e.g. class declarations will be visited.
+     */
+    new JVisitor() {
+      @Override public void endVisit(JMethodCall x, Context ctx) {
+        // this is a bit of a hack. The compiler inserts no-arg super calls, but
+        // there isn't really a way to detect that they're synthetic, and the
+        // strategy below of comparing source info with that of the enclosing type
+        // doesn't work because the enclosing type is set to be that of the superclass.
+        if (x.getTarget().isSynthetic() || x.toSource().equals("super()")) {
+          return;
+        }
+        endVisit((JExpression) x, ctx);
+      }
+
+      @Override public void endVisit(JThisRef x, Context ctx) {
+        if (x.getSourceInfo().equals(x.getClassType().getSourceInfo())) {
+          return;
+        }
+        endVisit((JExpression) x, ctx);
+      }
+
+      @Override public void endVisit(JClassLiteral x, Context ctx) {
+        if (x.getSourceInfo().equals(x.getRefType().getSourceInfo())) {
+          return;
+        }
+        endVisit((JExpression) x, ctx);
+      }
+
+      @Override public void endVisit(JExpression x, Context ctx) {
+        cover(x.getSourceInfo());
+      }
+
+      @Override public void endVisit(JsniMethodBody x, Context ctx) {
+        new CoverageVisitor(instrumentedFiles) {
+          @Override public void endVisit(JsExpression x, JsContext ctx) {
+            cover(x.getSourceInfo());
+          }
+        }.accept(x.getFunc());
+      }
+
+      // don't instrument fields whose initializers are literals, because (1) CoverageVisitor
+      // doesn't visit literals because it can introduce syntax errors in some cases, and (2) it's
+      // consistent with other coverage tools, e.g. Emma.
+      @Override public boolean visit(JDeclarationStatement x, Context ctx) {
+        return !(x.getInitializer() instanceof JValueLiteral &&
+            x.getVariableRef().getTarget() instanceof JField);
+      }
+
+      // don't instrument method call arguments; we can get weird coverage results when a call is
+      // spread over several lines
+      @Override public boolean visit(JMethodCall x, Context ctx) {
+        return false;
+      }
+    }.accept(jProgram);
+    return instrumentableLines;
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/js/CoverageInstrumentor.java b/dev/core/src/com/google/gwt/dev/js/CoverageInstrumentor.java
new file mode 100644
index 0000000..8ab3ea0
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/js/CoverageInstrumentor.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.js;
+
+import com.google.gwt.dev.jjs.SourceInfo;
+import com.google.gwt.dev.js.ast.JsBinaryOperation;
+import com.google.gwt.dev.js.ast.JsBinaryOperator;
+import com.google.gwt.dev.js.ast.JsContext;
+import com.google.gwt.dev.js.ast.JsExpression;
+import com.google.gwt.dev.js.ast.JsFunction;
+import com.google.gwt.dev.js.ast.JsInvocation;
+import com.google.gwt.dev.js.ast.JsModVisitor;
+import com.google.gwt.dev.js.ast.JsNameRef;
+import com.google.gwt.dev.js.ast.JsNumberLiteral;
+import com.google.gwt.dev.js.ast.JsObjectLiteral;
+import com.google.gwt.dev.js.ast.JsProgram;
+import com.google.gwt.dev.js.ast.JsPropertyInitializer;
+import com.google.gwt.dev.js.ast.JsStringLiteral;
+import com.google.gwt.thirdparty.guava.common.annotations.VisibleForTesting;
+import com.google.gwt.thirdparty.guava.common.collect.Multimap;
+
+import java.util.List;
+
+/**
+ * Instruments the generated JavaScript to record code coverage information
+ * about the original Java source.
+ *
+ * We maintain a global coverage object, whose keys are Java source filenames
+ * and whose values are objects mapping line numbers to 1 (executed) or 0 (not
+ * executed).
+ */
+public class CoverageInstrumentor {
+  /**
+   * This class does the actual instrumentation. It replaces
+   * {@code expr} with {@code (CoverageUtil.cover(file, line), expr)}.
+   */
+  private class Instrumentor extends CoverageVisitor {
+    public Instrumentor() {
+      super(instrumentableLines.keySet());
+    }
+
+    @Override
+    public void endVisit(JsExpression x, JsContext ctx) {
+      SourceInfo info = x.getSourceInfo();
+      if (!instrumentableLines.containsEntry(info.getFileName(), info.getStartLine())) {
+        return;
+      }
+      JsInvocation update = new JsInvocation(info);
+      update.setQualifier(jsProgram.getIndexedFunction("CoverageUtil.cover")
+          .getName().makeRef(info));
+      update.getArguments().add(new JsStringLiteral(info, info.getFileName()));
+      update.getArguments().add(new JsNumberLiteral(info, info.getStartLine()));
+      ctx.replaceMe(new JsBinaryOperation(info, JsBinaryOperator.COMMA, update, x));
+    }
+  }
+
+  public static void exec(JsProgram jsProgram, Multimap<String, Integer> instrumentableLines) {
+    new CoverageInstrumentor(jsProgram, instrumentableLines).execImpl();
+  }
+
+  /**
+   * Creates the baseline coverage object, with an entry mapping to 0 for every
+   * instrumented line.
+   */
+  @VisibleForTesting 
+  static JsObjectLiteral baselineCoverage(SourceInfo info,
+      Multimap<String, Integer> instrumentableLines) {
+    JsObjectLiteral baseline = new JsObjectLiteral(info);
+    List<JsPropertyInitializer> properties = baseline.getPropertyInitializers();
+    for (String filename : instrumentableLines.keySet()) {
+      JsPropertyInitializer pair = new JsPropertyInitializer(info);
+      pair.setLabelExpr(new JsStringLiteral(info, filename));
+      JsObjectLiteral lines = new JsObjectLiteral(info);
+      List<JsPropertyInitializer> coverage = lines.getPropertyInitializers();
+      for (int line : instrumentableLines.get(filename)) {
+        coverage.add(new JsPropertyInitializer(info,
+            new JsNumberLiteral(info, line), new JsNumberLiteral(info, 0)));
+      }
+      pair.setValueExpr(lines);
+      properties.add(pair);
+    }
+    return baseline;
+  }
+
+  private Multimap<String, Integer> instrumentableLines;
+  private JsProgram jsProgram;
+
+  private CoverageInstrumentor(JsProgram jsProgram, Multimap<String, Integer> instrumentableLines) {
+    this.instrumentableLines = instrumentableLines;
+    this.jsProgram = jsProgram;
+  }
+
+  private void addBeforeUnloadListener(SourceInfo info) {
+    JsNameRef onbeforeunload = new JsNameRef(info, "onbeforeunload");
+    onbeforeunload.setQualifier(new JsNameRef(info, "window"));
+    JsNameRef handler =
+        jsProgram.getIndexedFunction("CoverageUtil.onBeforeUnload").getName().makeRef(info);
+    JsBinaryOperation assignment = new JsBinaryOperation(info, JsBinaryOperator.ASG,
+        onbeforeunload, handler);
+    jsProgram.getGlobalBlock().getStatements().add(assignment.makeStmt());
+  }
+
+  private void execImpl() {
+    SourceInfo info = jsProgram.createSourceInfoSynthetic(getClass());
+    addBeforeUnloadListener(info);
+    initializeBaselineCoverage(info);
+    new JsModVisitor() {
+      @Override
+      public void endVisit(JsFunction x, JsContext ctx) {
+        new Instrumentor().accept(x.getBody());
+      }
+    }.accept(jsProgram);
+  }
+
+  private void initializeBaselineCoverage(SourceInfo info) {
+    JsNameRef coverageObject = jsProgram.getIndexedField("CoverageUtil.coverage").makeRef(info);
+    JsBinaryOperation init = new JsBinaryOperation(info, JsBinaryOperator.ASG, coverageObject,
+        baselineCoverage(info, instrumentableLines));
+    jsProgram.getGlobalBlock().getStatements().add(init.makeStmt());
+  }
+}
\ No newline at end of file
diff --git a/dev/core/src/com/google/gwt/dev/js/CoverageVisitor.java b/dev/core/src/com/google/gwt/dev/js/CoverageVisitor.java
new file mode 100644
index 0000000..29d0bbb
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/js/CoverageVisitor.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.js;
+
+import com.google.gwt.dev.js.ast.JsArrayAccess;
+import com.google.gwt.dev.js.ast.JsBinaryOperation;
+import com.google.gwt.dev.js.ast.JsContext;
+import com.google.gwt.dev.js.ast.JsExpression;
+import com.google.gwt.dev.js.ast.JsFor;
+import com.google.gwt.dev.js.ast.JsInvocation;
+import com.google.gwt.dev.js.ast.JsModVisitor;
+import com.google.gwt.dev.js.ast.JsNameRef;
+import com.google.gwt.dev.js.ast.JsNew;
+import com.google.gwt.dev.js.ast.JsNode;
+import com.google.gwt.dev.js.ast.JsPostfixOperation;
+import com.google.gwt.dev.js.ast.JsPrefixOperation;
+import com.google.gwt.dev.js.ast.JsUnaryOperator;
+import com.google.gwt.dev.js.ast.JsWhile;
+import com.google.gwt.thirdparty.guava.common.collect.Sets;
+
+import java.util.Set;
+
+/**
+ * A visitor that visits every location in the AST where instrumentation is
+ * desirable.
+ */
+public abstract class CoverageVisitor extends JsModVisitor {
+  private int lastLine = -1;
+  private String lastFile = "";
+  private Set<String> instrumentedFiles;
+
+  /**
+   * Nodes in this set are used in a context that expects a reference, not
+   * just an arbitrary expression. For example, <code>delete</code> takes a
+   * reference. These are tracked because it wouldn't be safe to rewrite
+   * <code>delete foo.bar</code> to <code>delete (line='123',foo).bar</code>.
+   */
+  private final Set<JsNode> nodesInRefContext = Sets.newHashSet();
+
+  public CoverageVisitor(Set<String> instrumentedFiles) {
+    this.instrumentedFiles = instrumentedFiles;
+  }
+
+  @Override public void endVisit(JsArrayAccess x, JsContext ctx) {
+    visitExpression(x, ctx);
+  }
+
+  @Override public void endVisit(JsBinaryOperation x, JsContext ctx) {
+    visitExpression(x, ctx);
+  }
+
+  @Override public void endVisit(JsInvocation x, JsContext ctx) {
+    nodesInRefContext.remove(x.getQualifier());
+    visitExpression(x, ctx);
+  }
+
+  @Override public void endVisit(JsNameRef x, JsContext ctx) {
+    visitExpression(x, ctx);
+  }
+
+  @Override public void endVisit(JsNew x, JsContext ctx) {
+    visitExpression(x, ctx);
+  }
+
+  @Override public void endVisit(JsPostfixOperation x, JsContext ctx) {
+    visitExpression(x, ctx);
+  }
+
+  @Override public void endVisit(JsPrefixOperation x, JsContext ctx) {
+    visitExpression(x, ctx);
+    nodesInRefContext.remove(x.getArg());
+  }
+
+  /**
+   * This is essentially a hacked-up version of JsFor.traverse to account for
+   * flow control differing from visitation order. It resets lastFile and
+   * lastLine before the condition and increment expressions in the for loop
+   * so that location data will be recorded correctly.
+   */
+  @Override public boolean visit(JsFor x, JsContext ctx) {
+    if (x.getInitExpr() != null) {
+      x.setInitExpr(accept(x.getInitExpr()));
+    } else if (x.getInitVars() != null) {
+      x.setInitVars(accept(x.getInitVars()));
+    }
+
+    if (x.getCondition() != null) {
+      resetPosition();
+      x.setCondition(accept(x.getCondition()));
+    }
+
+    if (x.getIncrExpr() != null) {
+      resetPosition();
+      x.setIncrExpr(accept(x.getIncrExpr()));
+    }
+    accept(x.getBody());
+    return false;
+  }
+
+  @Override public boolean visit(JsInvocation x, JsContext ctx) {
+    nodesInRefContext.add(x.getQualifier());
+    return true;
+  }
+
+  @Override public boolean visit(JsPrefixOperation x, JsContext ctx) {
+    if (x.getOperator() == JsUnaryOperator.DELETE
+        || x.getOperator() == JsUnaryOperator.TYPEOF) {
+      nodesInRefContext.add(x.getArg());
+    }
+    return true;
+  }
+
+  /**
+   * Similar to JsFor, this resets the current location information before
+   * evaluating the condition.
+   */
+  @Override public boolean visit(JsWhile x, JsContext ctx) {
+    resetPosition();
+    x.setCondition(accept(x.getCondition()));
+    accept(x.getBody());
+    return false;
+  }
+
+  protected abstract void endVisit(JsExpression x, JsContext ctx);
+
+  private void resetPosition() {
+    lastFile = "";
+    lastLine = -1;
+  }
+
+  private void visitExpression(JsExpression x, JsContext ctx) {
+    if (ctx.isLvalue()) {
+      // Assignments to comma expressions aren't legal
+      return;
+    } else if (nodesInRefContext.contains(x)) {
+      // Don't modify references into non-references
+      return;
+    } else if (!instrumentedFiles.contains(x.getSourceInfo().getFileName())) {
+      return;
+    } else if (x.getSourceInfo().getStartLine() == lastLine
+        && (x.getSourceInfo().getFileName().equals(lastFile))) {
+      return;
+    }
+    lastLine = x.getSourceInfo().getStartLine();
+    lastFile = x.getSourceInfo().getFileName();
+    endVisit(x, ctx);
+  }
+}
\ No newline at end of file
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java b/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java
index a1805bb..2301168 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java
@@ -30,6 +30,8 @@
 
   private JsProgramFragment[] fragments;
 
+  private final Map<String, JsName> indexedFields = new HashMap<String, JsName>();
+
   private final Map<String, JsFunction> indexedFunctions = new HashMap<String, JsFunction>();
 
   private final JsScope objectScope;
@@ -90,6 +92,10 @@
     return getFragmentBlock(0);
   }
 
+  public JsName getIndexedField(String name) {
+    return indexedFields.get(name);
+  }
+
   public JsFunction getIndexedFunction(String name) {
     return indexedFunctions.get(name);
   }
@@ -117,6 +123,11 @@
     }
   }
 
+  public void setIndexedFields(Map<String, JsName> indexedFields) {
+    this.indexedFields.clear();
+    this.indexedFields.putAll(indexedFields);
+  }
+
   public void setIndexedFunctions(Map<String, JsFunction> indexedFunctions) {
     this.indexedFunctions.clear();
     this.indexedFunctions.putAll(indexedFunctions);
diff --git a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
index b68db44..dd6d468 100644
--- a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
+++ b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
@@ -1241,14 +1241,6 @@
       return javaScriptHostBytes;
     }
 
-    if (classRewriter != null && classRewriter.isJsoIntf(className)) {
-      // Generate a synthetic JSO interface class.
-      byte[] newBytes = classRewriter.writeJsoIntf(className);
-      if (CLASS_DUMP) {
-        classDump(className, newBytes);
-      }
-      return newBytes;
-    }
 
     // A JSO impl class needs the class bytes for the original class.
     String lookupClassName = canonicalizeClassName(className);
@@ -1256,6 +1248,16 @@
     CompiledClass compiledClass = compilationState.getClassFileMap().get(
         lookupClassName);
 
+    if (classRewriter != null && classRewriter.isJsoIntf(className)) {
+      // Generate a synthetic JSO interface class.
+      byte[] newBytes = classRewriter.writeJsoIntf(className, compiledClass != null ?
+        compiledClass.getBytes() : null);
+      if (CLASS_DUMP) {
+        classDump(className, newBytes);
+      }
+      return newBytes;
+    }
+
     CompilationUnit unit = (compiledClass == null)
         ? getUnitForClassName(lookupClassName) : compiledClass.getUnit();
     if (emmaAvailable) {
diff --git a/dev/core/src/com/google/gwt/dev/shell/rewrite/HostedModeClassRewriter.java b/dev/core/src/com/google/gwt/dev/shell/rewrite/HostedModeClassRewriter.java
index cfbbd42..f254904 100644
--- a/dev/core/src/com/google/gwt/dev/shell/rewrite/HostedModeClassRewriter.java
+++ b/dev/core/src/com/google/gwt/dev/shell/rewrite/HostedModeClassRewriter.java
@@ -16,10 +16,12 @@
 package com.google.gwt.dev.shell.rewrite;
 
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.dev.asm.ClassAdapter;
 import com.google.gwt.dev.asm.ClassReader;
 import com.google.gwt.dev.asm.ClassVisitor;
 import com.google.gwt.dev.asm.ClassWriter;
 import com.google.gwt.dev.asm.Opcodes;
+import com.google.gwt.dev.asm.commons.EmptyVisitor;
 import com.google.gwt.dev.asm.commons.Method;
 import com.google.gwt.dev.shell.JsValueGlue;
 import com.google.gwt.dev.util.log.speedtracer.DevModeEventType;
@@ -231,7 +233,6 @@
 
     // v = new CheckClassAdapter(v);
     // v = new TraceClassVisitor(v, new PrintWriter(System.out));
-
     v = new UseMirroredClasses(v, className);
     
     v = new RewriteSingleJsoImplDispatches(v, typeOracle, jsoData);
@@ -253,7 +254,7 @@
     return writer.toByteArray();
   }
 
-  public byte[] writeJsoIntf(String className) {
+  public byte[] writeJsoIntf(final String className, byte classBytes[]) {
     String desc = toDescriptor(className);
     assert (jsoIntfDescs.contains(desc));
     assert (jsoSuperDescs.containsKey(desc));
@@ -263,7 +264,7 @@
 
     // The ASM model is to chain a bunch of visitors together.
     ClassWriter writer = new ClassWriter(0);
-    ClassVisitor v = writer;
+    final ClassVisitor v = writer;
 
     // v = new CheckClassAdapter(v);
     // v = new TraceClassVisitor(v, new PrintWriter(System.out));
@@ -277,6 +278,24 @@
     }
     v.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC | Opcodes.ACC_INTERFACE, desc,
         null, "java/lang/Object", interfaces);
+    if (classBytes != null) {
+      // Java7 enforces innerclass/outerclass consistency. In order to fix this, copy from original
+      ClassAdapter cv = new ClassAdapter(new EmptyVisitor()) {
+        @Override
+        public void visitInnerClass(String name, String outerName, String innerName,
+            int access) {
+          // copy inner class table from original JSO to synthetic interface
+          v.visitInnerClass(name, outerName, innerName, access);
+        }
+
+        @Override
+        public void visitOuterClass(String owner, String name, String desc) {
+          // copy outer class table from original JSO to synthetic interface
+          v.visitOuterClass(owner, name, desc);
+        }
+      };
+      new ClassReader(classBytes).accept(cv, 0);
+    }
     v.visitEnd();
     return writer.toByteArray();
   }
diff --git a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/CoverageUtil.java b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/CoverageUtil.java
new file mode 100644
index 0000000..811256d
--- /dev/null
+++ b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/CoverageUtil.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.lang;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+/**
+ * Utilities used for code coverage, to be injected into the JavaScript AST.
+ */
+public class CoverageUtil {
+  /**
+   * An object whose keys are Java filenames and whose values are objects mapping
+   * line numbers to 1 (executed) or 0 (not executed).
+   */
+  private static JavaScriptObject coverage = JavaScriptObject.createObject();
+
+  /**
+   * Updates the coverage object, marking the given filename-line number pair as executed.
+   */
+  public static native void cover(String filename, String lineNumber) /*-{
+    @com.google.gwt.lang.CoverageUtil::coverage[filename][lineNumber] = 1;
+  }-*/;
+
+  /**
+   * Reads existing coverage data from localStorage, merges it with data collected on this page,
+   * and flushes it back to localStorage. This function is used as an onbeforeunload handler.
+   */
+  public static native void onBeforeUnload() /*-{
+    var merge_coverage = function(x, y) {
+      var merge = function(x, y, merger) {
+        for (var key in y)
+          if (x.hasOwnProperty(key))
+            x[key] = merger(x[key], y[key]);
+          else
+            x[key] = y[key];
+          return x;
+      };
+
+      merge(x, y, function(u, v) {
+        return merge(u, v, Math.max);
+      });
+    };
+
+    var $coverage = @com.google.gwt.lang.CoverageUtil::coverage;
+    var coverage = JSON.parse(localStorage.getItem('gwt_coverage'));
+    if (coverage !== null)
+      merge_coverage($coverage, coverage);
+    localStorage.setItem('gwt_coverage', JSON.stringify($coverage));
+  }-*/;
+}
diff --git a/dev/core/test/com/google/gwt/dev/js/CoverageInstrumentorTest.java b/dev/core/test/com/google/gwt/dev/js/CoverageInstrumentorTest.java
new file mode 100644
index 0000000..d1ba72a
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/js/CoverageInstrumentorTest.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.dev.js;
+
+import com.google.gwt.dev.jjs.SourceInfo;
+import com.google.gwt.dev.js.ast.JsBlock;
+import com.google.gwt.dev.js.ast.JsContext;
+import com.google.gwt.dev.js.ast.JsExprStmt;
+import com.google.gwt.dev.js.ast.JsExpression;
+import com.google.gwt.dev.js.ast.JsFunction;
+import com.google.gwt.dev.js.ast.JsName;
+import com.google.gwt.dev.js.ast.JsObjectLiteral;
+import com.google.gwt.dev.js.ast.JsProgram;
+import com.google.gwt.dev.js.ast.JsStatement;
+import com.google.gwt.thirdparty.guava.common.base.Splitter;
+import com.google.gwt.thirdparty.guava.common.collect.HashMultimap;
+import com.google.gwt.thirdparty.guava.common.collect.LinkedHashMultimap;
+import com.google.gwt.thirdparty.guava.common.collect.Maps;
+import com.google.gwt.thirdparty.guava.common.collect.Multimap;
+
+import junit.framework.TestCase;
+
+import java.io.StringReader;
+import java.util.Map;
+
+/**
+ * Tests for CoverageInstrumentor.
+ */
+public class CoverageInstrumentorTest extends TestCase {
+  private JsProgram program;
+  private JsBlock functionBody;
+
+  @Override
+  public void setUp() {
+    program = new JsProgram();
+    SourceInfo info = program.createSourceInfo(1, "Test.java");
+    program.setIndexedFields(fields("CoverageUtil.coverage"));
+    program.setIndexedFunctions(functions("CoverageUtil.cover", "CoverageUtil.onBeforeUnload"));
+    JsBlock globalBlock = program.getGlobalBlock();
+    JsFunction function = new JsFunction(info, program.getScope());
+    functionBody = new JsBlock(info);
+    function.setBody(functionBody);
+    globalBlock.getStatements().add(new JsExprStmt(info, function));
+  }
+
+  private Map<String, JsName> fields(String... names) {
+    Map<String, JsName> fields = Maps.newHashMap();
+    for (String name : names) {
+      JsName n = program.getScope().declareName(name, name);
+      fields.put(name, n);
+    }
+    return fields;
+  }
+
+  private Map<String, JsFunction> functions(String... names) {
+    Map<String, JsFunction> funcs = Maps.newHashMap();
+    for (String name : names) {
+      JsFunction f = new JsFunction(program.getSourceInfo(), program.getScope());
+      f.setName(program.getScope().declareName(name));
+      funcs.put(name, f);
+    }
+    return funcs;
+  }
+
+  private String instrument(String code) throws Exception {
+    functionBody.getStatements().clear();
+    CoverageInstrumentor.exec(program, parse(code));
+    return functionBody.toSource().trim().replaceAll("\\s+", " ");
+  }
+
+  private Multimap<String, Integer> parse(String code) throws Exception {
+    Iterable<String> lines = Splitter.on('\n').split(code);
+    Multimap<String, Integer> instrumentableLines = HashMultimap.create();
+    int i = 0;
+    for (String line : lines) {
+      instrumentableLines.put("Test.java", ++i);
+    }
+    JsParser.parseInto(functionBody.getSourceInfo(), program.getScope(), 
+        functionBody, new StringReader(code));
+    i = 0;
+    for (JsStatement statement : functionBody.getStatements()) {
+      final SourceInfo info = program.createSourceInfo(++i, "Test.java");
+      statement.setSourceInfo(info);
+      new CoverageVisitor(instrumentableLines.keySet()) {
+        @Override public void endVisit(JsExpression x, JsContext ctx) {
+          x.setSourceInfo(info);
+        }
+      }.accept(statement);
+    }
+    return instrumentableLines;
+  }
+
+  public void testBaselineCoverage() throws Exception {
+    Multimap<String, Integer> instrumentableLines = LinkedHashMultimap.create();
+    for (int i = 1; i < 6; i++) {
+      instrumentableLines.put("A.java", i);
+      instrumentableLines.put("B.java", i);
+    }
+
+    JsObjectLiteral baseline = CoverageInstrumentor.baselineCoverage(program.getSourceInfo(),
+        instrumentableLines);
+    assertEquals("{'A.java':{1:0, 2:0, 3:0, 4:0, 5:0}, 'B.java':{1:0, 2:0, 3:0, 4:0, 5:0}}",
+        baseline.toSource().trim().replaceAll("\\s+", " "));
+  }
+
+  public void testSimpleInstrumentation() throws Exception {
+    assertEquals("{ CoverageUtil.cover('Test.java', 1) , f(); }", instrument("f()"));
+    assertEquals(
+        "{ CoverageUtil.cover('Test.java', 1) , f(); CoverageUtil.cover('Test.java', 2) , g(); }",
+        instrument("f() \n g()"));
+  }
+
+  public void testPreserveLiterals() throws Exception {
+    assertEquals("{ 'x'; }", instrument("'x'"));
+  }
+}
\ No newline at end of file
diff --git a/plugins/MissingPlugin/war/MissingPlugin.html b/plugins/MissingPlugin/war/MissingPlugin.html
index 46ccb3e..eb709ae 100644
--- a/plugins/MissingPlugin/war/MissingPlugin.html
+++ b/plugins/MissingPlugin/war/MissingPlugin.html
@@ -35,7 +35,7 @@
 
           "firefox-old" :
           {
-            "caption" : "Sorry, the GWT Developer Plugin only supports Firefox 3.0 - 10.0 at present",
+            "caption" : "Sorry, the GWT Developer Plugin only supports Firefox 3.0 - 15.0 at present",
             "url" : "http://www.getfirefox.com",
             "supported" : false
           },
@@ -171,17 +171,15 @@
       } else if (ua.indexOf("opera") != -1) {
         id = 'opera';
       } else if (ua.indexOf("gecko") != -1) {
-      if (ua.indexOf("rv:1.9") != -1 ||
-          ua.indexOf("rv:2.0") != -1 ||
-          ua.indexOf("rv:5.0") != -1 ||
-          ua.indexOf("rv:6.0") != -1 ||
-          ua.indexOf("rv:7.0") != -1 ||
-          ua.indexOf("rv:8.0") != -1 ||
-          ua.indexOf("rv:9.0") != -1 ||
-          ua.indexOf("rv:10.0") != -1) {
-          id = 'firefox';
-        } else {
-          id = 'firefox-old';
+        // Note: Gecko version != Firefox version before 5.0.
+        // See: https://developer.mozilla.org/en-US/docs/Gecko_user_agent_string_reference
+        var gecko_versions = ["1.9", "2.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0"];
+        id = 'firefox-old';
+        for (var i = 0; i < gecko_versions.length; i++) {
+          if (ua.indexOf("rv:" + gecko_versions[i]) != -1) {
+            id = 'firefox';
+            break;
+          }
         }
       }
       downloadInfo.inferredDownloadId = id;
@@ -193,7 +191,7 @@
   <noscript>
     <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
       The Google Web Toolkit Developer Plugin does not appear to be installed.
-      However, you also don't seem to have a browser that is willing to run JavaScript.
+      Also, you also don't seem to have a browser that is willing to run JavaScript.
       Please enable JavaScript or switch to a browser that supports JavaScript and try again.
     </div>
   </noscript>
diff --git a/plugins/common/AllowedConnections.cpp b/plugins/common/AllowedConnections.cpp
index c04698b..ffe6441 100644
--- a/plugins/common/AllowedConnections.cpp
+++ b/plugins/common/AllowedConnections.cpp
@@ -80,8 +80,15 @@
   paramStart += 12;
 
   int colon = url.find(':', paramStart);
-  int variableEnd = url.find('&', paramStart);
+  // After navigation, the URL parameter could be encoded.
+  // ex: gwt.codesvr=127.0.0.1:9997 -> gwt.codesvr=127.0.0.1%3A9997.
+  int colonEncoded = url.find("%3A", paramStart);
+  if (colonEncoded != std::string::npos
+      && (colon == std::string::npos || colonEncoded < colon)) {
+    colon = colonEncoded;
+  }
 
+  int variableEnd = url.find('&', paramStart);
   if ( variableEnd == std::string::npos || colon < variableEnd) {
     variableEnd = colon; //could be std::string::npos!
   }
diff --git a/plugins/config.mk b/plugins/config.mk
index 43e7fe0..1e9e244 100644
--- a/plugins/config.mk
+++ b/plugins/config.mk
@@ -88,7 +88,7 @@
 endif
 ifeq ($(shell uname),Darwin)
 OS=mac
-BASECFLAGS= $(DEBUGCFLAGS) -O2 -fPIC $(INC) -D__mac -mmacosx-version-min=10.5
+BASECFLAGS= $(DEBUGCFLAGS) -O2 -fPIC $(INC) -D__mac -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk
 ARCHCFLAGS=-arch $(MARCH)
 ALLARCHCFLAGS=-arch i386 -arch ppc -arch x86_64
 AR=libtool
diff --git a/plugins/xpcom/FFSessionHandler.cpp b/plugins/xpcom/FFSessionHandler.cpp
index c8c9743..37eb57b 100755
--- a/plugins/xpcom/FFSessionHandler.cpp
+++ b/plugins/xpcom/FFSessionHandler.cpp
@@ -167,7 +167,12 @@
     int objId = ids[i];
     dbg << objId << " ";
     jsval toRemove;
-    if (JS_GetElement(ctx, jsObjectsById, objId, &toRemove) && JSVAL_IS_OBJECT(toRemove)) {
+    if (JS_GetElement(ctx, jsObjectsById, objId, &toRemove) && 
+#ifdef JSVAL_IS_OBJECT
+       JSVAL_IS_OBJECT(toRemove)) {
+#else
+       !JSVAL_IS_PRIMITIVE(toRemove)) { 
+#endif
       jsIdsByObject.erase(identityFromObject(JSVAL_TO_OBJECT(toRemove)));
       JS_DeleteElement(ctx, jsObjectsById, objId);
     } else {
@@ -455,7 +460,11 @@
 #endif //GECKO_VERSION
   } else if (JSVAL_IS_DOUBLE(value)) {
     retVal.setDouble(JSVAL_TO_DOUBLE(value));
+#ifdef JSVAL_IS_OBJECT
   } else if (JSVAL_IS_OBJECT(value)) {
+#else
+  } else if (!JSVAL_IS_PRIMITIVE(value)) {
+#endif
     JSObject* obj = JSVAL_TO_OBJECT(value);
     if (JavaObject::isJavaObject(ctx, obj)) {
       retVal.setJavaObject(JavaObject::getObjectId(ctx, obj));
@@ -555,7 +564,11 @@
         if (!JS_GetElement(ctx, jsObjectsById, jsId, &retVal)) {
           Debug::log(Debug::Error) << "Error getting jsObject with id " << jsId << Debug::flush;
         }
+#ifdef JSVAL_IS_OBJECT
         if (!JSVAL_IS_OBJECT(retVal)) {
+#else
+        if (JSVAL_IS_PRIMITIVE(retVal)) {
+#endif
           Debug::log(Debug::Error) << "Missing jsObject with id " << jsId << Debug::flush;
         }
       }
@@ -625,7 +638,11 @@
   jsval rval;
   void* returnValue = obj;
   if (JS_GetProperty(ctx, obj, "wrappedJSObject", &rval)
+#ifdef JSVAL_IS_OBJECT
       && JSVAL_IS_OBJECT(rval)) {
+#else
+      && !JSVAL_IS_PRIMITIVE(rval)) {
+#endif
     returnValue = JSVAL_TO_OBJECT(rval);
     Debug::log(Debug::Info) << "identityFromObject mapped " << obj << " to "
         << returnValue << Debug::flush;
diff --git a/plugins/xpcom/JavaObject.cpp b/plugins/xpcom/JavaObject.cpp
index 9498c97..e54aa48 100644
--- a/plugins/xpcom/JavaObject.cpp
+++ b/plugins/xpcom/JavaObject.cpp
@@ -31,8 +31,13 @@
 
   JS_PropertyStub, /* add property */
   JS_PropertyStub, /* delete property */
+#if GECKO_VERSION < 15000
   JavaObject::getProperty, /* get property */
   JavaObject::setProperty, /* set property */
+#else
+  JavaObject::getPropertyWrapper,
+  JavaObject::setPropertyWrapper,
+#endif //GECHO_VERSION
 
   reinterpret_cast<JSEnumerateOp>(JavaObject::enumerate), /* enumerate */
   JS_ResolveStub, /* resolve */
@@ -139,6 +144,13 @@
   return obj;
 }
 
+#if GECKO_VERSION >= 15000
+JSBool JavaObject::getPropertyWrapper(JSContext* ctx, JSHandleObject obj,
+    JSHandleId id, jsval *vp) {
+  return JavaObject::getProperty(ctx, obj.value(), id.value(), vp);
+}
+#endif
+
 JSBool JavaObject::getProperty(JSContext* ctx, JSObject* obj, jsid id,
     jsval* rval) {
   Debug::log(Debug::Spam) << "JavaObject::getProperty obj=" << obj << Debug::flush;
@@ -190,6 +202,13 @@
   return JS_TRUE;
 }
 
+#if GECKO_VERSION >= 15000
+JSBool JavaObject::setPropertyWrapper(JSContext* ctx, JSHandleObject obj,
+    JSHandleId id, JSBool strict, jsval *vp) {
+  return setProperty(ctx, obj.value(), id.value(), strict, vp);
+}
+#endif
+
 #if GECKO_VERSION < 2000
 JSBool JavaObject::setProperty(JSContext* ctx, JSObject* obj, jsid id,
     jsval* vp) {
@@ -301,6 +320,21 @@
   return JS_TRUE;
 }
 
+#if GECKO_VERSION >= 14000
+void JavaObject::finalize(JSFreeOp* fop, JSObject* obj) {
+  // In general use of JS_GetPrivate is not safe but it is OK in the finalizer
+  // according to:
+  // https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_GetPrivate
+  // We will not be using getSession for that reason.
+  SessionData * data = static_cast<SessionData*>(JS_GetPrivate(obj));
+  if (data) {
+    jsval val = JS_GetReservedSlot(obj, 0);
+    int objectId = JSVAL_TO_INT(val);
+    data->freeJavaObject(objectId);
+    MOZ_JS_SetPrivate(/** Post-FF13 requires no ctx anyways*/ NULL, obj, NULL);
+  }
+}
+#else
 void JavaObject::finalize(JSContext* ctx, JSObject* obj) {
   Debug::log(Debug::Spam) << "JavaObject::finalize obj=" << obj
       << " objId=" << JavaObject::getObjectId(ctx, obj) << Debug::flush;
@@ -311,6 +345,7 @@
     MOZ_JS_SetPrivate(ctx, obj, NULL);
   }
 }
+#endif
 
 JSBool JavaObject::toString(JSContext* ctx, JSObject* obj, uintN argc,
     jsval* argv, jsval* rval) {
@@ -343,7 +378,12 @@
     jsval* rval) {
   // Get the JavaObject called as a function
   JSObject* obj = JSVAL_TO_OBJECT(argv[-2]);
-  if (argc < 2 || !JSVAL_IS_INT(argv[0]) || !JSVAL_IS_OBJECT(argv[1])) {
+  if (argc < 2 || !JSVAL_IS_INT(argv[0]) ||
+#ifdef JSVAL_IS_OBJECT
+  !JSVAL_IS_OBJECT(argv[1])) {
+#else
+    (JSVAL_IS_PRIMITIVE(argv[1]) && !JSVAL_IS_NULL(argv[1]))) {
+#endif
     Debug::log(Debug::Error) << "JavaObject::call incorrect arguments" << Debug::flush;
     return JS_FALSE;
   }
diff --git a/plugins/xpcom/JavaObject.h b/plugins/xpcom/JavaObject.h
index ea32ee7..c2fcf00 100755
--- a/plugins/xpcom/JavaObject.h
+++ b/plugins/xpcom/JavaObject.h
@@ -51,7 +51,11 @@
   static JSBool resolve(JSContext* ctx, JSObject* obj, jsval id);
   static JSBool convert(JSContext* cx, JSObject* obj, JSType type, jsval* vp);
   static JSBool enumerate(JSContext* ctx, JSObject* obj, JSIterateOp op, jsval* statep, jsid* idp);
+#if GECKO_VERSION >= 14000
+  static void finalize(JSFreeOp* fop, JSObject* obj);
+#else
   static void finalize(JSContext* ctx, JSObject* obj);
+#endif //GECKO_VERSION
   static JSBool toString(JSContext* ctx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
   static JSBool call(JSContext* ctx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
 
@@ -59,6 +63,11 @@
   static JSBool toString20(JSContext* ctx, uintN argc, jsval* vp);
   static JSBool call20(JSContext* ctx, uintN argc, jsval* vp);
 #endif //GECKO_VERSION
+#if GECKO_VERSION >= 15000
+  static JSBool getPropertyWrapper(JSContext* ctx, JSHandleObject obj, JSHandleId id, jsval *vp);
+  static JSBool setPropertyWrapper(JSContext* ctx, JSHandleObject obj, JSHandleId id,
+      JSBool strict, jsval *vp);
+#endif
 
 private:
   static SessionData* getSessionData(JSContext* ctx, JSObject* obj);
diff --git a/plugins/xpcom/Makefile b/plugins/xpcom/Makefile
index 8acafeb..7d7f755 100644
--- a/plugins/xpcom/Makefile
+++ b/plugins/xpcom/Makefile
@@ -24,7 +24,7 @@
 DEFAULT_FIREFOX_LIBS ?= /Applications/Firefox.app/Contents/MacOS
 RUN_PATH_FLAG = -executable_path
 DLL_SUFFIX = .dylib
-DLLFLAGS += -bundle $(ALLARCHCFLAGS) -mmacosx-version-min=10.5
+DLLFLAGS += -bundle $(ALLARCHCFLAGS) -mmacosx-version-min=10.5  -isysroot /Developer/SDKs/MacOSX10.5.sdk
 CFLAGS += $(ALLARCHCFLAGS)
 CXXFLAGS += $(ALLARCHCFLAGS)
 TARGET_PLATFORM = Darwin-gcc3
@@ -49,7 +49,7 @@
 export FLAG32BIT
 
 ifeq ($(BROWSER),)
-$(warning Defaulting to FF3 build [set with BROWSER=ff3, ff3+, ff35, ff36, ff40, ff50, ff60, ff70, ff80, ff90, ff100, f110, ff120, ff130])
+$(warning Defaulting to FF3 build [set with BROWSER=ff3, ff3+, ff35, ff36, ff40, ff50, ff60, ff70, ff80, ff90, ff100, f110, ff120, ff130, ff140, ff150])
 BROWSER=ff3
 endif
 
@@ -166,7 +166,17 @@
 GECKO_VERSION   = 13.0.0
 CFLAGS += -DGECKO_VERSION=13000
 else
-$(error Unrecognized BROWSER of $(BROWSER) - options are ff3, ff3+, ff35, ff36, ff40, ff50, ff60, ff70, ff80, ff90, ff100, ff110, ff120, ff130)
+ifeq ($(BROWSER),ff140)
+GECKO_VERSION   = 14.0.0
+CFLAGS += -DGECKO_VERSION=14000
+else
+ifeq ($(BROWSER),ff150)
+GECKO_VERSION   = 15.0.0
+CFLAGS += -DGECKO_VERSION=15000
+else
+$(error Unrecognized BROWSER of $(BROWSER) - options are ff3, ff3+, ff35, ff36, ff40, ff50, ff60, ff70, ff80, ff90, ff100, ff110, ff120, ff130, ff140, ff150)
+endif
+endif
 endif
 endif
 endif
@@ -201,7 +211,8 @@
 #FF_TYPELIB        = build/IOOPHM.xpt
 #FF_HEADER         = $(OBJ_OUTDIR)/IOOPHM.h
 FF_TYPELIB        = prebuilt/extension/components/IOOPHM.xpt
-FF_HEADER         = prebuilt/$(BROWSER)/include/IOOPHM.h
+FF_HEADERDIR      = prebuilt/$(BROWSER)/include
+FF_HEADER         = $(FF_HEADERDIR)/IOOPHM.h
 INSTALL_RDF       = $(EXTENSION_OUTDIR)/install.rdf
 
 SDK_PATH          = $(PLUGIN_SDKS)/gecko-sdks
@@ -268,6 +279,8 @@
 	$(MAKE) lib BROWSER=ff110 ARCH=x86
 	$(MAKE) lib BROWSER=ff120 ARCH=x86
 	$(MAKE) lib BROWSER=ff130 ARCH=x86
+	$(MAKE) lib BROWSER=ff140 ARCH=x86
+	$(MAKE) lib BROWSER=ff150 ARCH=x86
 	$(MAKE) lib BROWSER=ff3 ARCH=x86_64
 	$(MAKE) lib BROWSER=ff3+ ARCH=x86_64
 	$(MAKE) lib BROWSER=ff35 ARCH=x86_64
@@ -282,6 +295,8 @@
 	$(MAKE) lib BROWSER=ff110 ARCH=x86_64
 	$(MAKE) lib BROWSER=ff120 ARCH=x86_64
 	$(MAKE) lib BROWSER=ff130 ARCH=x86_64
+	$(MAKE) lib BROWSER=ff140 ARCH=x86_64
+	$(MAKE) lib BROWSER=ff150 ARCH=x86_64
 
 macplatforms:
 	$(MAKE) lib BROWSER=ff3
@@ -297,6 +312,7 @@
 	$(MAKE) lib BROWSER=ff110
 	$(MAKE) lib BROWSER=ff120
 	$(MAKE) lib BROWSER=ff130
+	$(MAKE) lib BROWSER=ff140
 
 SRCS =	\
 		ExternalWrapper.cpp \
@@ -323,7 +339,10 @@
 $(FF_TYPELIB): IOOPHM.idl
 	[ ! -x $(XPIDL) -o \( -e $(FF_TYPELIB) -a ! -w $(FF_TYPELIB) \) ] || $(XPIDL_TYPELIBS) $(XPIDL_FLAGS) -o $@ $<
 
-$(FF_HEADER): IOOPHM.idl $(OBJ_OUTDIR)
+$(FF_HEADERDIR):
+	@mkdir -p $@
+
+$(FF_HEADER): IOOPHM.idl $(OBJ_OUTDIR) $(FF_HEADERDIR)
 	[ ! -x $(XPIDL) -o \( -e $(FF_HEADER) -a ! -w $(FF_HEADER) \) ] || $(XPIDL_HEADER) $(XPIDL_FLAGS) -o $@ $<
 
 $(FF_DLL): $(FF_OBJS) $(COMMON)
diff --git a/plugins/xpcom/VisualStudio/ff130-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff130-xpcom.vcproj
new file mode 100755
index 0000000..4f3ac18
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff130-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="ff130-xpcom"
+	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+	RootNamespace="ff130-xpcom"
+	Keyword="Win32Proj"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug130"
+			IntermediateDirectory="Debug130"
+			ConfigurationType="2"
+			UseOfMFC="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff130\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include&quot;"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=13000"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				TreatWChar_tAsBuiltInType="true"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+				ShowProgress="2"
+				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff130\xpGwtDevPlugin.dll"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\lib&quot;"
+				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+				SubSystem="2"
+				RandomizedBaseAddress="2"
+				DataExecutionPrevention="0"
+				ImportLibrary="$(IntDir)\$(TargetName).lib"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release130"
+			IntermediateDirectory="Release130"
+			ConfigurationType="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				EnableIntrinsicFunctions="true"
+				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff130\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect&quot;"
+				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=13000;$(NOINHERIT)"
+				ExceptionHandling="1"
+				RuntimeLibrary="0"
+				TreatWChar_tAsBuiltInType="true"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="false"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+				ShowProgress="2"
+				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff130\xpGwtDevPlugin.dll"
+				LinkIncremental="0"
+				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\lib&quot;"
+				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				RandomizedBaseAddress="2"
+				DataExecutionPrevention="0"
+				ImportLibrary="$(IntDir)\$(TargetName).lib"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath="..\ExternalWrapper.h"
+				>
+			</File>
+			<File
+				RelativePath="..\FFSessionHandler.h"
+				>
+			</File>
+			<File
+				RelativePath="..\prebuilt\ff130\include\IOOPHM.h"
+				>
+			</File>
+			<File
+				RelativePath="..\JavaObject.h"
+				>
+			</File>
+			<File
+				RelativePath="..\JSRunner.h"
+				>
+			</File>
+			<File
+				RelativePath="..\mozincludes.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Preferences.h"
+				>
+			</File>
+			<File
+				RelativePath="..\RootedObject.h"
+				>
+			</File>
+			<File
+				RelativePath="..\SessionData.h"
+				>
+			</File>
+			<File
+				RelativePath="..\XpcomDebug.h"
+				>
+			</File>
+			<Filter
+				Name="common"
+				>
+				<File
+					RelativePath="..\..\common\AllowedConnections.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\BrowserChannel.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ByteOrder.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\CheckVersionsMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ChooseTransportMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Debug.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\DebugLevel.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FatalErrorMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FreeValueMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\HashMap.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\HostChannel.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeSpecialMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadJsniMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadModuleMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Message.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Platform.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ProtocolVersionMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\QuitMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ReturnMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ServerMethods.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\SessionHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Socket.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\SwitchTransportMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Value.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="gecko"
+				>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\js-config.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsapi.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsautocfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jscompat.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsconfig.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\jscpucfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\jsinttypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jslong.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\jsosdep.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsotypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsproto.tbl"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jspubtd.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jstypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsCOMPtr.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nscore.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nscore.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsCycleCollector.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsDebug.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsError.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\widget\nsEvent.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsICategoryManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIClassInfo.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIClassInfoImpl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIComponentManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsID.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIEnumerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIException.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIExceptionService.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIFactory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIGenericFactory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsIHttpProtocolHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIInterfaceInfo.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsIJSContextStack.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIMemory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIModule.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\caps\nsIPrincipal.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIProgrammingLanguage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsIProtocolHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsIProxiedProtocolHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\dom\nsIScriptGlobalObject.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\dom\nsIScriptObjectPrincipal.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\caps\nsISecurityCheckedComponent.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISerializable.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIServiceManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISimpleEnumerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISimpleEnumerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupports.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISupports.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISupportsBase.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupportsBase.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupportsImpl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupportsUtils.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISupportsUtils.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIURI.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIVariant.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsIXPConnect.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsMemory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsNetCID.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsrootidl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsrootidl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsServiceManagerUtils.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsStringAPI.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsTraceRefcnt.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsXPCOM.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsXPCOMCID.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsXPCOMStrings.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\pratom.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prcpucfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prinrval.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prlock.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prlog.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prlong.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\obsolete\protypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prthread.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prtime.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prtypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\xpccomponents.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\xpcexception.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\xpcjsid.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\xpt_arena.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\xpt_struct.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\xptinfo.h"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+			<File
+				RelativePath="..\xpGwtDevPlugin.rc"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath="..\ExternalWrapper.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\FFSessionHandler.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\JavaObject.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\JSRunner.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\ModuleOOPHM.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						GeneratePreprocessedFile="0"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="..\Preferences.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\XpcomDebug.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\xpGwtDevPlugin.def"
+				>
+			</File>
+			<Filter
+				Name="common"
+				>
+				<File
+					RelativePath="..\..\common\AllowedConnections.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\CheckVersionsMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ChooseTransportMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Debug.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FatalErrorMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FreeValueMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\HostChannel.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadJsniMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadModuleMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ReturnMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ServerMethods.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Socket.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\SwitchTransportMessage.cpp"
+					>
+				</File>
+			</Filter>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff140-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff140-xpcom.vcproj
new file mode 100755
index 0000000..ee3d7f9
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff140-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="ff140-xpcom"
+	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+	RootNamespace="ff140-xpcom"
+	Keyword="Win32Proj"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug140"
+			IntermediateDirectory="Debug140"
+			ConfigurationType="2"
+			UseOfMFC="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff140\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include&quot;"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=14000"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				TreatWChar_tAsBuiltInType="true"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+				ShowProgress="2"
+				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff140\xpGwtDevPlugin.dll"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\lib&quot;"
+				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+				SubSystem="2"
+				RandomizedBaseAddress="2"
+				DataExecutionPrevention="0"
+				ImportLibrary="$(IntDir)\$(TargetName).lib"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release140"
+			IntermediateDirectory="Release140"
+			ConfigurationType="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				EnableIntrinsicFunctions="true"
+				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff140\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect&quot;"
+				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=14000;$(NOINHERIT)"
+				ExceptionHandling="1"
+				RuntimeLibrary="0"
+				TreatWChar_tAsBuiltInType="true"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="false"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+				ShowProgress="2"
+				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff140\xpGwtDevPlugin.dll"
+				LinkIncremental="0"
+				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\lib&quot;"
+				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				RandomizedBaseAddress="2"
+				DataExecutionPrevention="0"
+				ImportLibrary="$(IntDir)\$(TargetName).lib"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath="..\ExternalWrapper.h"
+				>
+			</File>
+			<File
+				RelativePath="..\FFSessionHandler.h"
+				>
+			</File>
+			<File
+				RelativePath="..\prebuilt\ff140\include\IOOPHM.h"
+				>
+			</File>
+			<File
+				RelativePath="..\JavaObject.h"
+				>
+			</File>
+			<File
+				RelativePath="..\JSRunner.h"
+				>
+			</File>
+			<File
+				RelativePath="..\mozincludes.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Preferences.h"
+				>
+			</File>
+			<File
+				RelativePath="..\RootedObject.h"
+				>
+			</File>
+			<File
+				RelativePath="..\SessionData.h"
+				>
+			</File>
+			<File
+				RelativePath="..\XpcomDebug.h"
+				>
+			</File>
+			<Filter
+				Name="common"
+				>
+				<File
+					RelativePath="..\..\common\AllowedConnections.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\BrowserChannel.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ByteOrder.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\CheckVersionsMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ChooseTransportMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Debug.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\DebugLevel.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FatalErrorMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FreeValueMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\HashMap.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\HostChannel.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeSpecialMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadJsniMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadModuleMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Message.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Platform.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ProtocolVersionMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\QuitMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ReturnMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ServerMethods.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\SessionHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Socket.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\SwitchTransportMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Value.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="gecko"
+				>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\js-config.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsapi.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsautocfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jscompat.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsconfig.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\jscpucfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\jsinttypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jslong.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\jsosdep.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsotypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsproto.tbl"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jspubtd.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jstypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsCOMPtr.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nscore.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nscore.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsCycleCollector.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsDebug.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsError.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\widget\nsEvent.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsICategoryManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIClassInfo.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIClassInfoImpl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIComponentManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsID.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIEnumerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIException.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIExceptionService.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIFactory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIGenericFactory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsIHttpProtocolHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIInterfaceInfo.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsIJSContextStack.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIMemory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIModule.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\caps\nsIPrincipal.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIProgrammingLanguage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsIProtocolHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsIProxiedProtocolHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\dom\nsIScriptGlobalObject.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\dom\nsIScriptObjectPrincipal.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\caps\nsISecurityCheckedComponent.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISerializable.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIServiceManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISimpleEnumerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISimpleEnumerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupports.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISupports.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISupportsBase.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupportsBase.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupportsImpl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupportsUtils.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISupportsUtils.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIURI.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIVariant.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsIXPConnect.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsMemory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsNetCID.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsrootidl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsrootidl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsServiceManagerUtils.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsStringAPI.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsTraceRefcnt.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsXPCOM.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsXPCOMCID.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsXPCOMStrings.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\pratom.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prcpucfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prinrval.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prlock.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prlog.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prlong.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\obsolete\protypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prthread.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prtime.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prtypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\xpccomponents.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\xpcexception.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\xpcjsid.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\xpt_arena.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\xpt_struct.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\xptinfo.h"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+			<File
+				RelativePath="..\xpGwtDevPlugin.rc"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath="..\ExternalWrapper.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\FFSessionHandler.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\JavaObject.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\JSRunner.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\ModuleOOPHM.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						GeneratePreprocessedFile="0"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="..\Preferences.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\XpcomDebug.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\xpGwtDevPlugin.def"
+				>
+			</File>
+			<Filter
+				Name="common"
+				>
+				<File
+					RelativePath="..\..\common\AllowedConnections.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\CheckVersionsMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ChooseTransportMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Debug.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FatalErrorMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FreeValueMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\HostChannel.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadJsniMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadModuleMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ReturnMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ServerMethods.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Socket.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\SwitchTransportMessage.cpp"
+					>
+				</File>
+			</Filter>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff150-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff150-xpcom.vcproj
new file mode 100755
index 0000000..ebcf539
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff150-xpcom.vcproj
@@ -0,0 +1,846 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="ff150-xpcom"
+	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
+	RootNamespace="ff150-xpcom"
+	Keyword="Win32Proj"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug150"
+			IntermediateDirectory="Debug150"
+			ConfigurationType="2"
+			UseOfMFC="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff150\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include&quot;"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=15000"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				TreatWChar_tAsBuiltInType="true"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
+				ShowProgress="2"
+				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff150\xpGwtDevPlugin.dll"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\lib&quot;"
+				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+				SubSystem="2"
+				RandomizedBaseAddress="2"
+				DataExecutionPrevention="0"
+				ImportLibrary="$(IntDir)\$(TargetName).lib"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release150"
+			IntermediateDirectory="Release150"
+			ConfigurationType="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				EnableIntrinsicFunctions="true"
+				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff150\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect&quot;"
+				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=15000;$(NOINHERIT)"
+				ExceptionHandling="1"
+				RuntimeLibrary="0"
+				TreatWChar_tAsBuiltInType="true"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="false"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib msvcrt.lib"
+				ShowProgress="2"
+				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff150\xpGwtDevPlugin.dll"
+				LinkIncremental="0"
+				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\lib&quot;"
+				IgnoreDefaultLibraryNames=""
+				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				RandomizedBaseAddress="2"
+				DataExecutionPrevention="0"
+				ImportLibrary="$(IntDir)\$(TargetName).lib"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath="..\ExternalWrapper.h"
+				>
+			</File>
+			<File
+				RelativePath="..\FFSessionHandler.h"
+				>
+			</File>
+			<File
+				RelativePath="..\prebuilt\ff150\include\IOOPHM.h"
+				>
+			</File>
+			<File
+				RelativePath="..\JavaObject.h"
+				>
+			</File>
+			<File
+				RelativePath="..\JSRunner.h"
+				>
+			</File>
+			<File
+				RelativePath="..\mozincludes.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Preferences.h"
+				>
+			</File>
+			<File
+				RelativePath="..\RootedObject.h"
+				>
+			</File>
+			<File
+				RelativePath="..\SessionData.h"
+				>
+			</File>
+			<File
+				RelativePath="..\XpcomDebug.h"
+				>
+			</File>
+			<Filter
+				Name="common"
+				>
+				<File
+					RelativePath="..\..\common\AllowedConnections.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\BrowserChannel.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ByteOrder.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\CheckVersionsMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ChooseTransportMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Debug.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\DebugLevel.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FatalErrorMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FreeValueMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\HashMap.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\HostChannel.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeSpecialMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadJsniMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadModuleMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Message.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Platform.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ProtocolVersionMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\QuitMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ReturnMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ServerMethods.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\SessionHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Socket.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\SwitchTransportMessage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Value.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="gecko"
+				>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\js-config.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsapi.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsautocfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jscompat.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsconfig.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\jscpucfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\jscpucfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\jsinttypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jslong.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\jsosdep.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsotypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsproto.tbl"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jspubtd.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jstypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\mozilla-config.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsCOMPtr.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nscore.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nscore.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsCycleCollector.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsDebug.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsError.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\widget\nsEvent.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsICategoryManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIClassInfo.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIClassInfoImpl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIComponentManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsID.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIEnumerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIException.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIExceptionService.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIFactory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIGenericFactory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsIHttpProtocolHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIInterfaceInfo.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIInterfaceInfoManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsIJSContextStack.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIMemory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIModule.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\caps\nsIPrincipal.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIProgrammingLanguage.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsIProtocolHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsIProxiedProtocolHandler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsIScriptableInterfaces.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\dom\nsIScriptGlobalObject.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\dom\nsIScriptObjectPrincipal.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\caps\nsISecurityCheckedComponent.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISerializable.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIServiceManager.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISimpleEnumerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISimpleEnumerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISupports.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupports.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISupportsBase.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupportsBase.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupportsImpl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISupportsUtils.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupportsUtils.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIURI.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIVariant.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsIXPConnect.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsMemory.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsNetCID.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsrootidl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsrootidl.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsServiceManagerUtils.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsStringAPI.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsTraceRefcnt.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsXPCOM.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsXPCOMCID.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsXPCOMStrings.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\pratom.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prcpucfg.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prinrval.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prlock.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prlog.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prlong.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\obsolete\protypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prthread.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prtime.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prtypes.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\xpccomponents.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\xpcexception.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\xpcjsid.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\xpcom-config.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\xpt_arena.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\xpt_struct.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\xptinfo.h"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+			<File
+				RelativePath="..\xpGwtDevPlugin.rc"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath="..\ExternalWrapper.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\FFSessionHandler.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\JavaObject.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\JSRunner.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\ModuleOOPHM.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						GeneratePreprocessedFile="0"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="..\Preferences.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\XpcomDebug.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\xpGwtDevPlugin.def"
+				>
+			</File>
+			<Filter
+				Name="common"
+				>
+				<File
+					RelativePath="..\..\common\AllowedConnections.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\CheckVersionsMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ChooseTransportMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Debug.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FatalErrorMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\FreeValueMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\HostChannel.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadJsniMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\LoadModuleMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ReturnMessage.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\ServerMethods.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\Socket.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\common\SwitchTransportMessage.cpp"
+					>
+				</File>
+			</Filter>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/plugins/xpcom/XpcomDebug.cpp b/plugins/xpcom/XpcomDebug.cpp
index cb18b29..eddc15b 100644
--- a/plugins/xpcom/XpcomDebug.cpp
+++ b/plugins/xpcom/XpcomDebug.cpp
@@ -40,7 +40,11 @@
     strncpy(buf, "undef", sizeof(buf));
   } else if (JSVAL_IS_NULL(v)) {
     strncpy(buf, "null", sizeof(buf));
+#ifdef JSVAL_IS_OBJECT
   } else if (JSVAL_IS_OBJECT(v)) {
+#else
+  } else if (!JSVAL_IS_PRIMITIVE(v)) {
+#endif
     JSObject* obj = JSVAL_TO_OBJECT(v);
     if (JavaObject::isJavaObject(ctx, obj)) {
       int oid = JavaObject::getObjectId(ctx, obj);
diff --git a/plugins/xpcom/install-template.rdf b/plugins/xpcom/install-template.rdf
index ba123b0..66191a3 100644
--- a/plugins/xpcom/install-template.rdf
+++ b/plugins/xpcom/install-template.rdf
@@ -12,7 +12,7 @@
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>3.0</em:minVersion>
-        <em:maxVersion>13.0.*</em:maxVersion>
+        <em:maxVersion>15.0.*</em:maxVersion>
       </Description>
 
     <!-- TODO: This seems to break Firefox 3.6. With this on, FF gets into a
diff --git a/plugins/xpcom/prebuilt/extension/chrome.manifest b/plugins/xpcom/prebuilt/extension/chrome.manifest
index ed2da66..71cf50f 100644
--- a/plugins/xpcom/prebuilt/extension/chrome.manifest
+++ b/plugins/xpcom/prebuilt/extension/chrome.manifest
@@ -73,5 +73,20 @@
 binary-component lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib ABI=Darwin_x86-gcc3 appversion<=13.0.*
 binary-component lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=13.0.*
 
+# Firefox 14
+binary-component lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so ABI=Linux_x86_64-gcc3 appversion<=14.0.*
+binary-component lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so ABI=Linux_x86-gcc3 appversion<=14.0.*
+binary-component lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib ABI=Darwin_x86_64-gcc3 appversion<=14.0.*
+binary-component lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib ABI=Darwin_x86-gcc3 appversion<=14.0.*
+binary-component lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=14.0.*
+
+# Firefox 15
+binary-component lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so ABI=Linux_x86_64-gcc3 appversion<=15.0.*
+binary-component lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so ABI=Linux_x86-gcc3 appversion<=15.0.*
+binary-component lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=15.0.*
+binary-component lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib ABI=Darwin_x86_64-gcc3 appversion<=15.0.*
+binary-component lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib ABI=Darwin_x86-gcc3 appversion<=15.0.*
+
+
 interfaces components/IOOPHM.xpt
 contract @gwt.google.com/ExternalWrapper;1 {028DD88B-6D65-401D-AAFD-17E497D15D09}
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib
new file mode 100755
index 0000000..7d621cc
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib
new file mode 100755
index 0000000..7548240
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so
new file mode 100755
index 0000000..ea9ebdb
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so
new file mode 100755
index 0000000..af04a8e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so
new file mode 100755
index 0000000..48ab7ee
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so
new file mode 100755
index 0000000..8f5a64a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..5b55c0b
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..5a0ed7f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll
new file mode 100755
index 0000000..63684a0
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/ff140/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff140/include/IOOPHM.h
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff140/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface:    IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+  {0x90cef17b, 0xc3fe, 0x4251, \
+    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public: 
+
+  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+  /* boolean init (in nsIDOMWindow window); */
+  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
+
+  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
+
+};
+
+  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
+  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM); 
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+  NS_DECL_ISUPPORTS
+  NS_DECL_IOOPHM
+
+  _MYCLASS_();
+
+private:
+  ~_MYCLASS_();
+
+protected:
+  /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+  /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+  /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
+{
+    return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
+{
+    return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff150/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff150/include/IOOPHM.h
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff150/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
+ */
+
+#ifndef __gen_IOOPHM_h__
+#define __gen_IOOPHM_h__
+
+
+#ifndef __gen_nsISupports_h__
+#include "nsISupports.h"
+#endif
+
+/* For IDL files that don't want to include root IDL files. */
+#ifndef NS_NO_VTABLE
+#define NS_NO_VTABLE
+#endif
+class nsIDOMWindow; /* forward declaration */
+
+
+/* starting interface:    IOOPHM */
+#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
+
+#define IOOPHM_IID \
+  {0x90cef17b, 0xc3fe, 0x4251, \
+    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
+
+class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
+ public: 
+
+  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
+
+  /* boolean init (in nsIDOMWindow window); */
+  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
+
+  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
+
+};
+
+  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_IOOPHM \
+  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
+  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM); 
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object. */
+#define NS_FORWARD_IOOPHM(_to) \
+  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
+  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
+
+/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
+#define NS_FORWARD_SAFE_IOOPHM(_to) \
+  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
+  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
+
+#if 0
+/* Use the code below as a template for the implementation class for this interface. */
+
+/* Header file */
+class _MYCLASS_ : public IOOPHM
+{
+public:
+  NS_DECL_ISUPPORTS
+  NS_DECL_IOOPHM
+
+  _MYCLASS_();
+
+private:
+  ~_MYCLASS_();
+
+protected:
+  /* additional members */
+};
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
+
+_MYCLASS_::_MYCLASS_()
+{
+  /* member initializers and constructor code */
+}
+
+_MYCLASS_::~_MYCLASS_()
+{
+  /* destructor code */
+}
+
+/* boolean init (in nsIDOMWindow window); */
+NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
+{
+    return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
+NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
+{
+    return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* End of implementation class template. */
+#endif
+
+
+#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi b/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi
index 38ef8d5..d83406a 100644
--- a/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi
+++ b/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi
Binary files differ
diff --git a/plugins/xpcom/prebuilt/update.rdf b/plugins/xpcom/prebuilt/update.rdf
index b849181..47a3c64 100644
--- a/plugins/xpcom/prebuilt/update.rdf
+++ b/plugins/xpcom/prebuilt/update.rdf
@@ -14,7 +14,7 @@
               <Description>
                 <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
                 <em:minVersion>3.0</em:minVersion>
-                <em:maxVersion>13.0.*</em:maxVersion>
+                <em:maxVersion>15.0.*</em:maxVersion>
                 <em:updateLink>https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin.xpi</em:updateLink>
                 <em:updateInfoURL>https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin-info.xhtml?locale=%APP_LOCALE%</em:updateInfoURL>
 
diff --git a/requestfactory/build.xml b/requestfactory/build.xml
index 9769aa0..9215bfe 100755
--- a/requestfactory/build.xml
+++ b/requestfactory/build.xml
@@ -122,6 +122,8 @@
       <arg value="com.google.web.bindery.requestfactory.shared.BoxesAndPrimitivesTest.Factory" />
       <arg value="com.google.web.bindery.requestfactory.shared.ComplexKeysTest.Factory" />
       <arg value="com.google.web.bindery.requestfactory.shared.LocatorTest.Factory" />
+      <arg value="com.google.web.bindery.requestfactory.shared.MultipleFactoriesTest.Factory1" />
+      <arg value="com.google.web.bindery.requestfactory.shared.MultipleFactoriesTest.Factory2" />
       <arg value="com.google.web.bindery.requestfactory.shared.ServiceInheritanceTest$Factory" />
       <arg value="com.google.web.bindery.requestfactory.shared.SimpleRequestFactory" />
     </java>
diff --git a/samples/dynatablerf/README-MAVEN.txt b/samples/dynatablerf/README-MAVEN.txt
index 58d4570..3f95038 100644
--- a/samples/dynatablerf/README-MAVEN.txt
+++ b/samples/dynatablerf/README-MAVEN.txt
@@ -1,6 +1,6 @@
 -- Option A: Import your project into Eclipse (recommended) --
 
-Configure Eclipse following the instructions at 
+Configure Eclipse following the instructions at
 http://code.google.com/p/google-web-toolkit/wiki/WorkingWithMaven#Using_Maven_with_Google_Plugin_for_Eclipse
 
 In Eclipse, go to the File menu and choose:
@@ -13,6 +13,11 @@
 
 You can now browse the project in Eclipse.
 
+Now, you need to enable m2Eclipse's annotation processing functionality.
+Under project properties, select Maven > Annotation Processing > Enable Project-Specific Settings,
+and choose the "Automatically configure JDT APT". Click "Finish", and then right-click on the project,
+and select click Maven > Update project.
+
 To launch your web app in GWT development mode
 
   Go to the Run menu item and select Run -> Run as -> Web Application.
@@ -36,7 +41,7 @@
   Still in the Java Build Path dialog, click the Order and Export tab
 
   Move gwt-dev and gwt-user above Maven Dependencies
-  
+
 GWT developers can also use tools/scripts/maven_script.sh to push their
 own GWT jars into their local maven repo.
 
diff --git a/samples/dynatablerf/pom.xml b/samples/dynatablerf/pom.xml
index 4d476d7..da65697 100644
--- a/samples/dynatablerf/pom.xml
+++ b/samples/dynatablerf/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project
    xmlns="http://maven.apache.org/POM/4.0.0"
-   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
   <modelVersion>4.0.0</modelVersion>
@@ -51,15 +51,6 @@
       <version>${gwtVersion}</version>
     </dependency>
 
-    <!-- Generate the decoder needed by RequestFactory Server -->
-    <!-- Doesn't yet work in eclipse. See maven-processor-plugin below.
-    <dependency>
-      <groupId>com.google.web.bindery</groupId>
-      <artifactId>requestfactory-apt</artifactId>
-      <version>${gwtVersion}</version>
-    </dependency>
--->
-
     <!-- RequestFactory will use JSR 303 javax.validation if you let it -->
     <dependency>
       <groupId>javax.validation</groupId>
@@ -96,33 +87,23 @@
       <version>1.6.1</version>
     </dependency>
   </dependencies>
-  
+
   <build>
     <!-- Generate compiled stuff in the folder used for development mode -->
     <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
-    
+
     <plugins>
-      <!-- requestfactory-apt runs an annotation processor (APT) to
-           instrument its service interfaces so that
-           RequestFactoryServer can decode client requests. Normally
-           you would just have a dependency on requestfactory-apt
-           with <scope>provided</scope>, but that won't work in
-           eclipse due to m2e bug
-           https://bugs.eclipse.org/bugs/show_bug.cgi?id=335036 -->
+
       <plugin>
-        <groupId>org.bsc.maven</groupId>
-        <artifactId>maven-processor-plugin</artifactId>
-        <version>2.0.5</version>
-        <executions>
-          <execution>
-            <id>process</id>
-            <goals>
-              <goal>process</goal>
-            </goals>
-            <phase>generate-sources</phase>
-          </execution>
-        </executions>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.4</version>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+        </configuration>
         <dependencies>
+          <!-- Need to run the RF Validation tool. This works on both the command-line
+               and in Eclipse, provided that m2e-apt is installed. -->
           <dependency>
             <groupId>com.google.web.bindery</groupId>
             <artifactId>requestfactory-apt</artifactId>
@@ -131,33 +112,11 @@
         </dependencies>
       </plugin>
 
-      <!-- Google Plugin for Eclipse (GPE) won't see the source
-           generated above by requestfactory-apt unless it is exposed
-           as an additional source dir-->
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <version>1.7</version>
-        <executions>
-          <execution>
-            <id>add-source</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>add-source</goal>
-            </goals>
-            <configuration>
-              <sources>
-                <source>${project.build.directory}/generated-sources/apt</source>
-              </sources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
       <!-- GWT Maven Plugin-->
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>gwt-maven-plugin</artifactId>
+        <!-- TODO: Update version to 2.5.0 once gwt-maven-plugin 2.5.0 final is released (post-GWT 2.5.0) -->
         <version>2.3.0-1</version>
         <dependencies>
           <dependency>
@@ -170,13 +129,8 @@
             <artifactId>gwt-dev</artifactId>
             <version>${gwtVersion}</version>
           </dependency>
-          <dependency>
-            <groupId>com.google.gwt</groupId>
-            <artifactId>gwt-servlet</artifactId>
-            <version>${gwtVersion}</version>
-          </dependency>
         </dependencies>
-        <!-- JS is only needed in the package phase, this speeds up testing --> 
+        <!-- JS is only needed in the package phase, this speeds up testing -->
         <executions>
           <execution>
             <phase>prepare-package</phase>
@@ -186,8 +140,8 @@
           </execution>
         </executions>
 
-        <!-- Plugin configuration. There are many available options, 
-             see gwt-maven-plugin documentation at codehaus.org --> 
+        <!-- Plugin configuration. There are many available options,
+             see gwt-maven-plugin documentation at codehaus.org -->
         <configuration>
           <!-- URL that should be automatically opened in the GWT shell (gwt:run). -->
           <runTarget>DynaTableRf.html</runTarget>
@@ -222,55 +176,7 @@
           </execution>
         </executions>
       </plugin>
-
-      <!-- Mark the project for Google Plugin for Eclipse (GPE) -->
-      <plugin>
-        <artifactId>maven-eclipse-plugin</artifactId>
-        <version>2.8</version>
-        <configuration>
-          <downloadSources>true</downloadSources>
-          <downloadJavadocs>false</downloadJavadocs>
-          <wtpversion>2.0</wtpversion>
-          <additionalBuildcommands>
-            <buildCommand>
-              <name>com.google.gwt.eclipse.core.gwtProjectValidator</name>
-            </buildCommand>
-          </additionalBuildcommands>
-          <additionalProjectnatures>
-            <projectnature>com.google.gwt.eclipse.core.gwtNature</projectnature>
-          </additionalProjectnatures>
-        </configuration>
-      </plugin>
     </plugins>
 
-    <!-- Required by m2e for import into eclipse. No effect on command line builds  -->
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.eclipse.m2e</groupId>
-          <artifactId>lifecycle-mapping</artifactId>
-          <version>1.0.0</version>
-          <configuration>
-            <lifecycleMappingMetadata>
-              <pluginExecutions>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>org.bsc.maven</groupId>
-                    <artifactId>maven-processor-plugin</artifactId>
-                    <versionRange>[2.0.5,)</versionRange>
-                    <goals>
-                      <goal>process</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <execute />
-                  </action>
-                </pluginExecution>
-              </pluginExecutions>
-            </lifecycleMappingMetadata>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
   </build>
 </project>
diff --git a/samples/mobilewebapp/README-MAVEN.txt b/samples/mobilewebapp/README-MAVEN.txt
index 2924ebd..eadca76 100644
--- a/samples/mobilewebapp/README-MAVEN.txt
+++ b/samples/mobilewebapp/README-MAVEN.txt
@@ -1,6 +1,6 @@
 -- Option A: Import your project into Eclipse (recommended) --
 
-Configure Eclipse following the instructions at 
+Configure Eclipse following the instructions at
 http://code.google.com/p/google-web-toolkit/wiki/WorkingWithMaven#Using_Maven_with_Google_Plugin_for_Eclipse
 
 In Eclipse, go to the File menu and choose:
@@ -13,6 +13,11 @@
 
 You can now browse the project in Eclipse.
 
+Now, you need to enable m2Eclipse's annotation processing functionality.
+Under project properties, select Maven > Annotation Processing > Enable Project-Specific Settings,
+and choose the "Automatically configure JDT APT". Click "Finish", and then right-click on the project,
+and select click Maven > Update project.
+
 To launch your web app in GWT development mode (see note below if you
 have gae.home set in settings.xml):
 
@@ -37,7 +42,7 @@
   Still in the Java Build Path dialog, click the Order and Export tab
 
   Move gwt-dev and gwt-user above Maven Dependencies
-  
+
 GWT developers can also use tools/scripts/maven_script.sh to push their
 own GWT jars into their local maven repo.
 
diff --git a/samples/mobilewebapp/pom.xml b/samples/mobilewebapp/pom.xml
index 5306d62..7d6f379 100644
--- a/samples/mobilewebapp/pom.xml
+++ b/samples/mobilewebapp/pom.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
   <modelVersion>4.0.0</modelVersion>
@@ -18,7 +18,7 @@
     <maven.compiler.target>1.6</maven.compiler.target>
 
     <!-- GAE properties -->
-    <gae.version>1.5.3</gae.version>
+    <gae.version>1.7.1</gae.version>
     <gae.home>${user.home}/.m2/repository/com/google/appengine/appengine-java-sdk/${gae.version}/appengine-java-sdk-${gae.version}</gae.home>
     <gae.application.version>1</gae.application.version>
 
@@ -64,15 +64,6 @@
       <version>${gwtVersion}</version>
     </dependency>
 
-    <!-- Generate the decoder needed by RequestFactory Server -->
-    <!-- Doesn't yet work in eclipse. See maven-processor-plugin below.
-    <dependency>
-      <groupId>com.google.web.bindery</groupId>
-      <artifactId>requestfactory-apt</artifactId>
-      <version>${gwtVersion}</version>
-    </dependency>
--->
-
     <!-- RequestFactory will use JSR 303 javax.validation if you let it -->
     <dependency>
       <groupId>org.hibernate</groupId>
@@ -174,27 +165,17 @@
     <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
 
     <plugins>
-      <!-- requestfactory-apt runs an annotation processor (APT) to
-           instrument its service interfaces so that
-           RequestFactoryServer can decode client requests. Normally
-           you would just have a dependency on requestfactory-apt
-           with <scope>provided</scope>, but that won't work in
-           eclipse due to m2e bug
-           https://bugs.eclipse.org/bugs/show_bug.cgi?id=335036 -->
+
       <plugin>
-        <groupId>org.bsc.maven</groupId>
-        <artifactId>maven-processor-plugin</artifactId>
-        <version>2.0.5</version>
-        <executions>
-          <execution>
-            <id>process</id>
-            <goals>
-              <goal>process</goal>
-            </goals>
-            <phase>generate-sources</phase>
-          </execution>
-        </executions>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.4</version>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+        </configuration>
         <dependencies>
+          <!-- Need to run the RF Validation tool. This works on both the command-line
+               and in Eclipse, provided that m2e-apt is installed. -->
           <dependency>
             <groupId>com.google.web.bindery</groupId>
             <artifactId>requestfactory-apt</artifactId>
@@ -203,33 +184,11 @@
         </dependencies>
       </plugin>
 
-      <!-- Google Plugin for Eclipse (GPE) won't see the source
-           generated above by requestfactory-apt unless it is exposed
-           as an additional source dir-->
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <version>1.7</version>
-        <executions>
-          <execution>
-            <id>add-source</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>add-source</goal>
-            </goals>
-            <configuration>
-              <sources>
-                <source>${project.build.directory}/generated-sources/apt</source>
-              </sources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-
       <!-- GWT Maven Plugin-->
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>gwt-maven-plugin</artifactId>
+        <!-- TODO: Update version to 2.5.0 once gwt-maven-plugin 2.5.0 final is released (post-GWT 2.5.0) -->
         <version>2.3.0-1</version>
         <dependencies>
           <dependency>
@@ -242,11 +201,6 @@
             <artifactId>gwt-dev</artifactId>
             <version>${gwtVersion}</version>
           </dependency>
-          <dependency>
-            <groupId>com.google.gwt</groupId>
-            <artifactId>gwt-servlet</artifactId>
-            <version>${gwtVersion}</version>
-          </dependency>
         </dependencies>
         <!-- JS is only needed in the package phase, this speeds up testing -->
         <executions>
@@ -335,26 +289,6 @@
           </execution>
         </executions>
       </plugin>
-
-      <!-- Mark the project for Google Plugin for Eclipse (GPE) -->
-      <plugin>
-        <artifactId>maven-eclipse-plugin</artifactId>
-        <version>2.8</version>
-        <configuration>
-          <downloadSources>true</downloadSources>
-          <downloadJavadocs>false</downloadJavadocs>
-          <wtpversion>2.0</wtpversion>
-          <additionalBuildcommands>
-            <buildCommand>
-              <name>com.google.gwt.eclipse.core.gwtProjectValidator</name>
-            </buildCommand>
-          </additionalBuildcommands>
-          <additionalProjectnatures>
-            <projectnature>com.google.gwt.eclipse.core.gwtNature</projectnature>
-            <projectnature>com.google.appengine.eclipse.core.gaeNature</projectnature>
-          </additionalProjectnatures>
-        </configuration>
-      </plugin>
     </plugins>
 
     <!-- Required by m2e for import into eclipse. No effect on command line builds  -->
@@ -380,20 +314,6 @@
                     <execute />
                   </action>
                 </pluginExecution>
-
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>org.bsc.maven</groupId>
-                    <artifactId>maven-processor-plugin</artifactId>
-                    <versionRange>[2.0.5,)</versionRange>
-                    <goals>
-                      <goal>process</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <execute />
-                  </action>
-                </pluginExecution>
               </pluginExecutions>
             </lifecycleMappingMetadata>
           </configuration>
diff --git a/samples/validation/src/main/java/com/google/gwt/sample/validation/Validation.gwt.xml b/samples/validation/src/main/java/com/google/gwt/sample/validation/Validation.gwt.xml
index 09b6e83..04a1068 100644
--- a/samples/validation/src/main/java/com/google/gwt/sample/validation/Validation.gwt.xml
+++ b/samples/validation/src/main/java/com/google/gwt/sample/validation/Validation.gwt.xml
@@ -14,7 +14,7 @@
 
 <module rename-to='validation'>
 
-  <inherits name='com.google.gwt.rpc.RPC' />
+  <inherits name='com.google.gwt.user.RemoteService' />
   <inherits name='com.google.gwt.user.User' />
   <inherits name='com.google.gwt.user.theme.standard.Standard' />
   <inherits name='org.hibernate.validator.HibernateValidator' />
diff --git a/samples/validation/src/main/java/com/google/gwt/sample/validation/client/GreetingService.java b/samples/validation/src/main/java/com/google/gwt/sample/validation/client/GreetingService.java
index 9ed0787..2f7d3ab 100644
--- a/samples/validation/src/main/java/com/google/gwt/sample/validation/client/GreetingService.java
+++ b/samples/validation/src/main/java/com/google/gwt/sample/validation/client/GreetingService.java
@@ -15,18 +15,27 @@
  */
 package com.google.gwt.sample.validation.client;
 
-import com.google.gwt.rpc.client.RpcService;
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.sample.validation.shared.Person;
+import com.google.gwt.user.client.rpc.RemoteService;
 import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
 
+import org.hibernate.validator.engine.ValidationSupport;
+
 import javax.validation.ConstraintViolationException;
 
 /**
  * The client side stub for the RPC service.
  */
 @RemoteServiceRelativePath("greet")
-public interface GreetingService extends RpcService {
+public interface GreetingService extends RemoteService {
   SafeHtml greetServer(Person name) throws IllegalArgumentException,
       ConstraintViolationException;
+  
+  /**
+   * Force hibernate validator imple1metations to be available for
+   * serialization.
+   */
+  ValidationSupport dummy();
+
 }
diff --git a/samples/validation/src/main/java/com/google/gwt/sample/validation/client/GreetingServiceAsync.java b/samples/validation/src/main/java/com/google/gwt/sample/validation/client/GreetingServiceAsync.java
index 1309e56..ae27175 100644
--- a/samples/validation/src/main/java/com/google/gwt/sample/validation/client/GreetingServiceAsync.java
+++ b/samples/validation/src/main/java/com/google/gwt/sample/validation/client/GreetingServiceAsync.java
@@ -19,6 +19,8 @@
 import com.google.gwt.sample.validation.shared.Person;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
+import org.hibernate.validator.engine.ValidationSupport;
+
 import javax.validation.ConstraintViolationException;
 
 /**
@@ -27,4 +29,6 @@
 public interface GreetingServiceAsync {
   void greetServer(Person person, AsyncCallback<SafeHtml> callback)
       throws IllegalArgumentException, ConstraintViolationException;
+
+  void dummy(AsyncCallback<ValidationSupport> callback);
 }
diff --git a/samples/validation/src/main/java/com/google/gwt/sample/validation/server/GreetingServiceImpl.java b/samples/validation/src/main/java/com/google/gwt/sample/validation/server/GreetingServiceImpl.java
index f8712c7..e91fe27 100644
--- a/samples/validation/src/main/java/com/google/gwt/sample/validation/server/GreetingServiceImpl.java
+++ b/samples/validation/src/main/java/com/google/gwt/sample/validation/server/GreetingServiceImpl.java
@@ -15,13 +15,15 @@
  */
 package com.google.gwt.sample.validation.server;
 
-import com.google.gwt.rpc.server.RpcServlet;
+import com.google.gwt.user.server.rpc.RemoteServiceServlet;
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.sample.validation.client.GreetingService;
 import com.google.gwt.sample.validation.shared.Person;
 import com.google.gwt.sample.validation.shared.ServerGroup;
 
+import org.hibernate.validator.engine.ValidationSupport;
+
 import java.util.HashSet;
 import java.util.Set;
 
@@ -35,7 +37,7 @@
  * The server side implementation of the RPC service.
  */
 @SuppressWarnings("serial")
-public class GreetingServiceImpl extends RpcServlet implements
+public class GreetingServiceImpl extends RemoteServiceServlet implements
     GreetingService {
 
   private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
@@ -67,4 +69,9 @@
     .toSafeHtml();
     return safeHtml;
   }
+
+  @Override
+  public ValidationSupport dummy() {
+    return null;
+  }
 }
\ No newline at end of file
diff --git a/samples/validation/src/main/resources/com/google/gwt/sample/validation/super/com/google/gwt/sample/validation/shared/ServerValidator.java b/samples/validation/src/main/resources/com/google/gwt/sample/validation/super/com/google/gwt/sample/validation/shared/ServerValidator.java
deleted file mode 100644
index c633d58..0000000
--- a/samples/validation/src/main/resources/com/google/gwt/sample/validation/super/com/google/gwt/sample/validation/shared/ServerValidator.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.sample.validation.shared;
-
-import com.google.gwt.validation.client.constraints.NotGwtCompatibleValidator;
-
-/**
- * Always invalid.
- * <p>
- * Server validator is overriden so it compiles, but it is always invalid.
- */
-public class ServerValidator extends
-   NotGwtCompatibleValidator<ServerConstraint, Person> {
-}
\ No newline at end of file
diff --git a/user/build.xml b/user/build.xml
index 21f9801..3290ba5 100755
--- a/user/build.xml
+++ b/user/build.xml
@@ -559,6 +559,23 @@
     </gwt.junit>
   </target>
 
+  <target name="test.coverage.htmlunit"
+      depends="compile, compile.tests"
+      description="Run tests for coverage support">
+      <fileset id="test.coverage.htmlunit.tests" dir="${javac.junit.out}"
+          includes="com/google/gwt/dev/js/client/CoverageTest.class"
+          excludes="" />
+      <gwt.junit test.name="test.coverage.htmlunit"
+        test.args="${test.args} -draftCompile -out www -prod -runStyle HtmlUnit:FF3.6"
+        test.jvmargs="${test.jvmargs} -Dgwt.coverage=com/google/gwt/dev/js/client/CoverageTestModule.java,"
+        test.out="${junit.out}/coverage-htmlunit"
+        test.cases="test.coverage.htmlunit.tests" >
+      <extraclasspaths>
+        <path refid="test.extraclasspath" />
+      </extraclasspaths>
+    </gwt.junit>
+  </target>
+
   <target name="test"
       depends="compile, compile.tests"
       description="Run all tests for this project.">
@@ -593,6 +610,7 @@
       <antcall target="test.draft.htmlunit"/>
       <antcall target="test.nometa.htmlunit"/>
       <antcall target="test.nongwt"/>
+      <antcall target="test.coverage.htmlunit"/>
     </parallel>
     </limit>
   </target>
@@ -614,6 +632,7 @@
       <antcall target="test.web.htmlunit"/>
       <antcall target="test.draft.htmlunit"/>
       <antcall target="test.nometa.htmlunit"/>
+      <antcall target="test.coverage.htmlunit"/>
     </parallel>
     </limit>
   </target>
diff --git a/user/src/com/google/gwt/activity/Activity.gwt.xml b/user/src/com/google/gwt/activity/Activity.gwt.xml
index dbdd296..2f5a44e 100644
--- a/user/src/com/google/gwt/activity/Activity.gwt.xml
+++ b/user/src/com/google/gwt/activity/Activity.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 0.0.999//EN" "http://google-web-toolkit.googlecode.com/svn/tags/0.0.999/distro-source/core/src/gwt-module.dtd">
 <module>
   <inherits name='com.google.gwt.place.Place'/>
 
diff --git a/user/src/com/google/gwt/aria/client/AlertRole.java b/user/src/com/google/gwt/aria/client/AlertRole.java
index 574a8fe..f053fa1 100644
--- a/user/src/com/google/gwt/aria/client/AlertRole.java
+++ b/user/src/com/google/gwt/aria/client/AlertRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#alert">alert</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/AlertRoleImpl.java b/user/src/com/google/gwt/aria/client/AlertRoleImpl.java
index b9b00cb..528ffb2 100644
--- a/user/src/com/google/gwt/aria/client/AlertRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/AlertRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 88c31d9..ab73e29 100644
--- a/user/src/com/google/gwt/aria/client/AlertdialogRole.java
+++ b/user/src/com/google/gwt/aria/client/AlertdialogRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#alertdialog">alertdialog</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/AlertdialogRoleImpl.java b/user/src/com/google/gwt/aria/client/AlertdialogRoleImpl.java
index fdec37a..14f7e51 100644
--- a/user/src/com/google/gwt/aria/client/AlertdialogRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/AlertdialogRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 541319b..e6e4276 100644
--- a/user/src/com/google/gwt/aria/client/ApplicationRole.java
+++ b/user/src/com/google/gwt/aria/client/ApplicationRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#application">application</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/ApplicationRoleImpl.java b/user/src/com/google/gwt/aria/client/ApplicationRoleImpl.java
index 23b4e68..9bd6e71 100644
--- a/user/src/com/google/gwt/aria/client/ApplicationRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ApplicationRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 79fc2fc..ac134a6 100644
--- a/user/src/com/google/gwt/aria/client/ArticleRole.java
+++ b/user/src/com/google/gwt/aria/client/ArticleRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#article">article</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/ArticleRoleImpl.java b/user/src/com/google/gwt/aria/client/ArticleRoleImpl.java
index ec4c6ab..ef57b8d 100644
--- a/user/src/com/google/gwt/aria/client/ArticleRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ArticleRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 70bee11..8899c23 100644
--- a/user/src/com/google/gwt/aria/client/Attribute.java
+++ b/user/src/com/google/gwt/aria/client/Attribute.java
@@ -58,7 +58,7 @@
    * Gets the HTML attribute value for the attribute with name {@code name} for element
    * {@code element}
    *
-   * @param element HTM element
+   * @param element HTML element
    * @return The attribute value for {@code element}
    */
   public String get(Element element) {
@@ -112,17 +112,20 @@
     element.setAttribute(name, defaultValue);
   }
 
+  /**
+   * Gets the string representation of {@code value} to be set as an attribute value
+   * to an HTML element.
+   *
+   * @param value The item to be stringified
+   * @return the stringified representation of {@code value}
+   */
   protected abstract String getSingleValue(T value);
 
   private String getAriaValue(T... value) {
-    if (value.length == 1) {
-      return getSingleValue(value[0]);
-    } else {
-      StringBuffer buf = new StringBuffer();
-      for (T item : value) {
-        buf.append(getSingleValue(item)).append(" ");
-      }
-      return buf.toString().trim();
+    StringBuffer buf = new StringBuffer();
+    for (T item : value) {
+      buf.append(getSingleValue(item)).append(" ");
     }
+    return buf.toString().trim();
   }
 }
diff --git a/user/src/com/google/gwt/aria/client/BannerRole.java b/user/src/com/google/gwt/aria/client/BannerRole.java
index 6b610a8..78930af 100644
--- a/user/src/com/google/gwt/aria/client/BannerRole.java
+++ b/user/src/com/google/gwt/aria/client/BannerRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#banner">banner</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/BannerRoleImpl.java b/user/src/com/google/gwt/aria/client/BannerRoleImpl.java
index b6dfbe0..c1818df 100644
--- a/user/src/com/google/gwt/aria/client/BannerRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/BannerRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index c638ab9..e3d596c 100644
--- a/user/src/com/google/gwt/aria/client/ButtonRole.java
+++ b/user/src/com/google/gwt/aria/client/ButtonRole.java
@@ -27,15 +27,47 @@
  * @see Roles
  */
 public interface ButtonRole extends CommandRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaExpandedState(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-pressed">
+   * aria-pressed</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaPressedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute from the {@code element}.
+   */
   void removeAriaExpandedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-pressed">
+   * aria-pressed</a> attribute from the {@code element}.
+   */
   void removeAriaPressedState(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaExpandedState(Element element, ExpandedValue value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-pressed">
+   * aria-pressed</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaPressedState(Element element, PressedValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java b/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java
index 5901f87..19a1cc0 100644
--- a/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ButtonRoleImpl.java
@@ -28,287 +28,32 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
   public void setAriaPressedState(Element element, PressedValue value) {
     State.PRESSED.set(element, value);
   }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 43b62bd..8d50559 100644
--- a/user/src/com/google/gwt/aria/client/CheckboxRole.java
+++ b/user/src/com/google/gwt/aria/client/CheckboxRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface CheckboxRole extends InputRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-checked">
+   * aria-checked</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaCheckedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-checked">
+   * aria-checked</a> attribute from the {@code element}.
+   */
   void removeAriaCheckedState(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-checked">
+   * aria-checked</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaCheckedState(Element element, CheckedValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java b/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java
index c06cfde..7c85946 100644
--- a/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/CheckboxRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, CheckedValue value) {
     State.CHECKED.set(element, value);
   }
-
-  @Override
-  public void setAriaControlsProperty(Element element, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index b0ffab0..d3600d1 100644
--- a/user/src/com/google/gwt/aria/client/ColumnheaderRole.java
+++ b/user/src/com/google/gwt/aria/client/ColumnheaderRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface ColumnheaderRole extends GridcellRole, SectionheadRole, WidgetRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-sort">
+   * aria-sort</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaSortProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-sort">
+   * aria-sort</a> attribute from the {@code element}.
+   */
   void removeAriaSortProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-sort">
+   * aria-sort</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaSortProperty(Element element, SortValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java b/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java
index abc855f..5c89ca7 100644
--- a/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ColumnheaderRoleImpl.java
@@ -28,96 +28,16 @@
   }
 
   @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);
   }
@@ -133,101 +53,16 @@
   }
 
   @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);
   }
@@ -243,101 +78,16 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... 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, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaRequiredProperty(Element element, boolean value) {
     Property.REQUIRED.set(element, value);
   }
@@ -351,9 +101,4 @@
   public void setAriaSortProperty(Element element, SortValue 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
index 1dae8bb..bfeb1e6 100644
--- a/user/src/com/google/gwt/aria/client/ComboboxRole.java
+++ b/user/src/com/google/gwt/aria/client/ComboboxRole.java
@@ -27,15 +27,47 @@
  * @see Roles
  */
 public interface ComboboxRole extends SelectRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-autocomplete">
+   * aria-autocomplete</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaAutocompleteProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaRequiredProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-autocomplete">
+   * aria-autocomplete</a> attribute from the {@code element}.
+   */
   void removeAriaAutocompleteProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute from the {@code element}.
+   */
   void removeAriaRequiredProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-autocomplete">
+   * aria-autocomplete</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaAutocompleteProperty(Element element, AutocompleteValue value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} to the given {@code 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
index 8e068de..4152085 100644
--- a/user/src/com/google/gwt/aria/client/ComboboxRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ComboboxRoleImpl.java
@@ -33,312 +33,57 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, AutocompleteValue 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 0b19a4f..2cbd126 100644
--- a/user/src/com/google/gwt/aria/client/CommandRole.java
+++ b/user/src/com/google/gwt/aria/client/CommandRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#command">command</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/ComplementaryRole.java b/user/src/com/google/gwt/aria/client/ComplementaryRole.java
index cbde080..6aa693a 100644
--- a/user/src/com/google/gwt/aria/client/ComplementaryRole.java
+++ b/user/src/com/google/gwt/aria/client/ComplementaryRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#complementary">complementary</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/ComplementaryRoleImpl.java b/user/src/com/google/gwt/aria/client/ComplementaryRoleImpl.java
index 45eedd2..40a8e48 100644
--- a/user/src/com/google/gwt/aria/client/ComplementaryRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ComplementaryRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 3b853ab..e60c501 100644
--- a/user/src/com/google/gwt/aria/client/CompositeRole.java
+++ b/user/src/com/google/gwt/aria/client/CompositeRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface CompositeRole extends WidgetRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-activedescendant">
+   * aria-activedescendant</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaActivedescendantProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-activedescendant">
+   * aria-activedescendant</a> attribute from the {@code element}.
+   */
   void removeAriaActivedescendantProperty(Element element);
 
-  void setAriaActivedescendantProperty(Element element, IdReference value);
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-activedescendant">
+   * aria-activedescendant</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaActivedescendantProperty(Element element, Id value);
 }
diff --git a/user/src/com/google/gwt/aria/client/ContentinfoRole.java b/user/src/com/google/gwt/aria/client/ContentinfoRole.java
index bef7d5d..a6ce3e5 100644
--- a/user/src/com/google/gwt/aria/client/ContentinfoRole.java
+++ b/user/src/com/google/gwt/aria/client/ContentinfoRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#contentinfo">contentinfo</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/ContentinfoRoleImpl.java b/user/src/com/google/gwt/aria/client/ContentinfoRoleImpl.java
index a5db746..6e205c9 100644
--- a/user/src/com/google/gwt/aria/client/ContentinfoRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ContentinfoRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 3d5e291..62a30de 100644
--- a/user/src/com/google/gwt/aria/client/DefinitionRole.java
+++ b/user/src/com/google/gwt/aria/client/DefinitionRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#definition">definition</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/DefinitionRoleImpl.java b/user/src/com/google/gwt/aria/client/DefinitionRoleImpl.java
index e919610..e81b224 100644
--- a/user/src/com/google/gwt/aria/client/DefinitionRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/DefinitionRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 6d474b6..1db9491 100644
--- a/user/src/com/google/gwt/aria/client/DialogRole.java
+++ b/user/src/com/google/gwt/aria/client/DialogRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#dialog">dialog</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/DialogRoleImpl.java b/user/src/com/google/gwt/aria/client/DialogRoleImpl.java
index 7b33c00..fd37bda 100644
--- a/user/src/com/google/gwt/aria/client/DialogRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/DialogRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 3bccc30..e0e224c 100644
--- a/user/src/com/google/gwt/aria/client/DirectoryRole.java
+++ b/user/src/com/google/gwt/aria/client/DirectoryRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#directory">directory</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/DirectoryRoleImpl.java b/user/src/com/google/gwt/aria/client/DirectoryRoleImpl.java
index b4ce77b..a9880cb 100644
--- a/user/src/com/google/gwt/aria/client/DirectoryRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/DirectoryRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 3ce1f9c..56fed2e 100644
--- a/user/src/com/google/gwt/aria/client/DocumentRole.java
+++ b/user/src/com/google/gwt/aria/client/DocumentRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface DocumentRole extends StructureRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaExpandedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute from the {@code element}.
+   */
   void removeAriaExpandedState(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaExpandedState(Element element, ExpandedValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java b/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java
index a77c13a..c2ea1b5 100644
--- a/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/DocumentRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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/FormRole.java b/user/src/com/google/gwt/aria/client/FormRole.java
index c1998b2..0bcb084 100644
--- a/user/src/com/google/gwt/aria/client/FormRole.java
+++ b/user/src/com/google/gwt/aria/client/FormRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#form">form</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/FormRoleImpl.java b/user/src/com/google/gwt/aria/client/FormRoleImpl.java
index 04814a6..58aa365 100644
--- a/user/src/com/google/gwt/aria/client/FormRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/FormRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 18c8661..21bb455 100644
--- a/user/src/com/google/gwt/aria/client/GridRole.java
+++ b/user/src/com/google/gwt/aria/client/GridRole.java
@@ -27,21 +27,69 @@
  * @see Roles
  */
 public interface GridRole extends CompositeRole, RegionRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaLevelProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiselectable">
+   * aria-multiselectable</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaMultiselectableProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-readonly">
+   * aria-readonly</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaReadonlyProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute from the {@code element}.
+   */
   void removeAriaLevelProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiselectable">
+   * aria-multiselectable</a> attribute from the {@code element}.
+   */
   void removeAriaMultiselectableProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-readonly">
+   * aria-readonly</a> attribute from the {@code element}.
+   */
   void removeAriaReadonlyProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaLevelProperty(Element element, int value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiselectable">
+   * aria-multiselectable</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaMultiselectableProperty(Element element, boolean value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-readonly">
+   * aria-readonly</a> attribute for the {@code element} to the given {@code 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
index 64e30ab..8d2c7f6 100644
--- a/user/src/com/google/gwt/aria/client/GridRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/GridRoleImpl.java
@@ -33,327 +33,72 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue 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, IdReference... 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, RelevantValue... 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
index b98e8ce..df08d61 100644
--- a/user/src/com/google/gwt/aria/client/GridcellRole.java
+++ b/user/src/com/google/gwt/aria/client/GridcellRole.java
@@ -27,21 +27,69 @@
  * @see Roles
  */
 public interface GridcellRole extends SectionRole, WidgetRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-readonly">
+   * aria-readonly</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaReadonlyProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaRequiredProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaSelectedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-readonly">
+   * aria-readonly</a> attribute from the {@code element}.
+   */
   void removeAriaReadonlyProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute from the {@code element}.
+   */
   void removeAriaRequiredProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute from the {@code element}.
+   */
   void removeAriaSelectedState(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-readonly">
+   * aria-readonly</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaReadonlyProperty(Element element, boolean value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaRequiredProperty(Element element, boolean value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaSelectedState(Element element, SelectedValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java b/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java
index b058502..313a0dc 100644
--- a/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/GridcellRoleImpl.java
@@ -28,96 +28,16 @@
   }
 
   @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);
   }
@@ -128,101 +48,16 @@
   }
 
   @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);
   }
@@ -233,101 +68,16 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... 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, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaRequiredProperty(Element element, boolean value) {
     Property.REQUIRED.set(element, value);
   }
@@ -336,9 +86,4 @@
   public void setAriaSelectedState(Element element, SelectedValue 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
index 9507677..f16aa31 100644
--- a/user/src/com/google/gwt/aria/client/GroupRole.java
+++ b/user/src/com/google/gwt/aria/client/GroupRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface GroupRole extends SectionRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-activedescendant">
+   * aria-activedescendant</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaActivedescendantProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-activedescendant">
+   * aria-activedescendant</a> attribute from the {@code element}.
+   */
   void removeAriaActivedescendantProperty(Element element);
 
-  void setAriaActivedescendantProperty(Element element, IdReference value);
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-activedescendant">
+   * aria-activedescendant</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaActivedescendantProperty(Element element, Id value);
 }
diff --git a/user/src/com/google/gwt/aria/client/GroupRoleImpl.java b/user/src/com/google/gwt/aria/client/GroupRoleImpl.java
index 47864f2..df72646 100644
--- a/user/src/com/google/gwt/aria/client/GroupRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/GroupRoleImpl.java
@@ -33,282 +33,27 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index ecae557..e13238d 100644
--- a/user/src/com/google/gwt/aria/client/HeadingRole.java
+++ b/user/src/com/google/gwt/aria/client/HeadingRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface HeadingRole extends SectionheadRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaLevelProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute from the {@code element}.
+   */
   void removeAriaLevelProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute for the {@code element} to the given {@code value}.
+   */
   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
index fd89243..8ea3aef 100644
--- a/user/src/com/google/gwt/aria/client/HeadingRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/HeadingRoleImpl.java
@@ -28,287 +28,32 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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/Id.java b/user/src/com/google/gwt/aria/client/Id.java
new file mode 100644
index 0000000..3f43adb
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/Id.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.aria.client;
+/////////////////////////////////////////////////////////
+// This is auto-generated code.  Do not manually edit! //
+/////////////////////////////////////////////////////////
+
+import com.google.gwt.dom.client.Element;
+
+/**
+ * Id reference attribute type
+ */
+public class Id implements AriaAttributeType {
+  /**
+   * Creates an Id instance for the {@code element} by getting
+   * the element 'id' attribute.
+   *
+   * @param element A DOM element which should have a
+   *        non empty, unique 'id' attribute set.
+   */
+  public static Id of(Element element) {
+    return new Id(element);
+  }
+
+  /**
+   * Creates an Id instance from the {@code elementId}.
+   *
+   * @param elementId A string identifier that should correspond
+   *        to the 'id' attribute value of a DOM element.
+   */
+  public static Id of(String elementId) {
+    return new Id(elementId);
+  }
+
+  private String id;
+
+  /**
+   * An instance of {@link Id} is created.
+   *
+   * @param element Element with a unique id value set
+   */
+  private Id(Element element) {
+    assert element != null : "Element cannot be null";
+    init(element.getId());
+  }
+
+  private Id(String elementId) {
+    init(elementId);
+  }
+
+  @Override
+  public String getAriaValue() {
+    return id;
+  }
+
+  private void init(String elementId) {
+    assert elementId != null || elementId.equals("") :
+      "Invalid elementId: cannot be null or empty.";
+    this.id = elementId;
+  }
+}
diff --git a/user/src/com/google/gwt/aria/client/IdReference.java b/user/src/com/google/gwt/aria/client/IdReference.java
deleted file mode 100644
index 311c731..0000000
--- a/user/src/com/google/gwt/aria/client/IdReference.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2012 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.google.gwt.aria.client;
-
-/////////////////////////////////////////////////////////
-// This is auto-generated code.  Do not manually edit! //
-/////////////////////////////////////////////////////////
-
-/**
- * Id reference attribute type
- */
-public class IdReference implements AriaAttributeType {
-  public static IdReference of(String value) {
-    return new IdReference(value);
-  }
-
-  private final String id;
-
-  /**
-   * An instance of {@link IdReference} is created.
-   *
-   * @param value String id value
-   */
-  private IdReference(String value) {
-    this.id = value;
-  }
-
-  @Override
-  public String getAriaValue() {
-    return id;
-  }
-}
diff --git a/user/src/com/google/gwt/aria/client/ImgRole.java b/user/src/com/google/gwt/aria/client/ImgRole.java
index 0c5eb86..72b55c8 100644
--- a/user/src/com/google/gwt/aria/client/ImgRole.java
+++ b/user/src/com/google/gwt/aria/client/ImgRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#img">img</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/ImgRoleImpl.java b/user/src/com/google/gwt/aria/client/ImgRoleImpl.java
index b1a2ae7..c48e6a7 100644
--- a/user/src/com/google/gwt/aria/client/ImgRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ImgRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 18941a4..db7dc4a 100644
--- a/user/src/com/google/gwt/aria/client/InputRole.java
+++ b/user/src/com/google/gwt/aria/client/InputRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#input">input</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/LandmarkRole.java b/user/src/com/google/gwt/aria/client/LandmarkRole.java
index 70c1f9c..876a88e 100644
--- a/user/src/com/google/gwt/aria/client/LandmarkRole.java
+++ b/user/src/com/google/gwt/aria/client/LandmarkRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#landmark">landmark</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/LinkRole.java b/user/src/com/google/gwt/aria/client/LinkRole.java
index e5243e3..14bbd62 100644
--- a/user/src/com/google/gwt/aria/client/LinkRole.java
+++ b/user/src/com/google/gwt/aria/client/LinkRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface LinkRole extends CommandRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaExpandedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute from the {@code element}.
+   */
   void removeAriaExpandedState(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaExpandedState(Element element, ExpandedValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/LinkRoleImpl.java b/user/src/com/google/gwt/aria/client/LinkRoleImpl.java
index 92f161d..83d1ce1 100644
--- a/user/src/com/google/gwt/aria/client/LinkRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/LinkRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index ac37031..addf7fb 100644
--- a/user/src/com/google/gwt/aria/client/ListRole.java
+++ b/user/src/com/google/gwt/aria/client/ListRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#list">list</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/ListRoleImpl.java b/user/src/com/google/gwt/aria/client/ListRoleImpl.java
index 05d420d..8860d2b 100644
--- a/user/src/com/google/gwt/aria/client/ListRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ListRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 1bb4932..fd4d8b3 100644
--- a/user/src/com/google/gwt/aria/client/ListboxRole.java
+++ b/user/src/com/google/gwt/aria/client/ListboxRole.java
@@ -27,15 +27,47 @@
  * @see Roles
  */
 public interface ListboxRole extends ListRole, SelectRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiselectable">
+   * aria-multiselectable</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaMultiselectableProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaRequiredProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiselectable">
+   * aria-multiselectable</a> attribute from the {@code element}.
+   */
   void removeAriaMultiselectableProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute from the {@code element}.
+   */
   void removeAriaRequiredProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiselectable">
+   * aria-multiselectable</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaMultiselectableProperty(Element element, boolean value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} to the given {@code 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
index 9856ad0..6583a16 100644
--- a/user/src/com/google/gwt/aria/client/ListboxRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ListboxRoleImpl.java
@@ -33,312 +33,57 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue 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, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 5a6a2e6..476b151 100644
--- a/user/src/com/google/gwt/aria/client/ListitemRole.java
+++ b/user/src/com/google/gwt/aria/client/ListitemRole.java
@@ -27,21 +27,69 @@
  * @see Roles
  */
 public interface ListitemRole extends SectionRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaLevelProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-posinset">
+   * aria-posinset</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaPosinsetProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-setsize">
+   * aria-setsize</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaSetsizeProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute from the {@code element}.
+   */
   void removeAriaLevelProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-posinset">
+   * aria-posinset</a> attribute from the {@code element}.
+   */
   void removeAriaPosinsetProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-setsize">
+   * aria-setsize</a> attribute from the {@code element}.
+   */
   void removeAriaSetsizeProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaLevelProperty(Element element, int value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-posinset">
+   * aria-posinset</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaPosinsetProperty(Element element, int value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-setsize">
+   * aria-setsize</a> attribute for the {@code element} to the given {@code 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
index 07be0c4..c85c759 100644
--- a/user/src/com/google/gwt/aria/client/ListitemRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ListitemRoleImpl.java
@@ -28,317 +28,62 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... 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, RelevantValue... 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
index 4c8c19f..243a7bb 100644
--- a/user/src/com/google/gwt/aria/client/LogRole.java
+++ b/user/src/com/google/gwt/aria/client/LogRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#log">log</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/LogRoleImpl.java b/user/src/com/google/gwt/aria/client/LogRoleImpl.java
index 1901e5e..f6b8c3d 100644
--- a/user/src/com/google/gwt/aria/client/LogRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/LogRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index a54e514..33eee23 100644
--- a/user/src/com/google/gwt/aria/client/MainRole.java
+++ b/user/src/com/google/gwt/aria/client/MainRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#main">main</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/MainRoleImpl.java b/user/src/com/google/gwt/aria/client/MainRoleImpl.java
index e8e5641..381785b 100644
--- a/user/src/com/google/gwt/aria/client/MainRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MainRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index f2bdb6e..75a45b5 100644
--- a/user/src/com/google/gwt/aria/client/MarqueeRole.java
+++ b/user/src/com/google/gwt/aria/client/MarqueeRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#marquee">marquee</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/MarqueeRoleImpl.java b/user/src/com/google/gwt/aria/client/MarqueeRoleImpl.java
index a920949..52dc59b 100644
--- a/user/src/com/google/gwt/aria/client/MarqueeRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MarqueeRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 14216e7..a946376 100644
--- a/user/src/com/google/gwt/aria/client/MathRole.java
+++ b/user/src/com/google/gwt/aria/client/MathRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#math">math</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/MathRoleImpl.java b/user/src/com/google/gwt/aria/client/MathRoleImpl.java
index 20e50d7..d09c6e3 100644
--- a/user/src/com/google/gwt/aria/client/MathRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MathRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 6e81a78..430b402 100644
--- a/user/src/com/google/gwt/aria/client/MenuRole.java
+++ b/user/src/com/google/gwt/aria/client/MenuRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#menu">menu</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/MenuRoleImpl.java b/user/src/com/google/gwt/aria/client/MenuRoleImpl.java
index 033ffc2..12a7d76 100644
--- a/user/src/com/google/gwt/aria/client/MenuRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MenuRoleImpl.java
@@ -33,282 +33,27 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 6236d34..0dac256 100644
--- a/user/src/com/google/gwt/aria/client/MenubarRole.java
+++ b/user/src/com/google/gwt/aria/client/MenubarRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#menubar">menubar</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/MenubarRoleImpl.java b/user/src/com/google/gwt/aria/client/MenubarRoleImpl.java
index cc85d67..c41a270 100644
--- a/user/src/com/google/gwt/aria/client/MenubarRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MenubarRoleImpl.java
@@ -33,282 +33,27 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index a8a2ad8..caf73f7 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemRole.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#menuitem">menuitem</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/MenuitemRoleImpl.java b/user/src/com/google/gwt/aria/client/MenuitemRoleImpl.java
index fc80d10..c908d86 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemRoleImpl.java
@@ -17,8 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-import com.google.gwt.dom.client.Element;
-
 /**
  * <p>Implements {@link MenuitemRole}.</p>
  */
@@ -26,259 +24,4 @@
   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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 53e09cf..88e008a 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemcheckboxRole.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemcheckboxRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#menuitemcheckbox">menuitemcheckbox</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/MenuitemcheckboxRoleImpl.java b/user/src/com/google/gwt/aria/client/MenuitemcheckboxRoleImpl.java
index 7e21b6c..16ef30c 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemcheckboxRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemcheckboxRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, CheckedValue value) {
     State.CHECKED.set(element, value);
   }
-
-  @Override
-  public void setAriaControlsProperty(Element element, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index f905190..2b041c7 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemradioRole.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemradioRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#menuitemradio">menuitemradio</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/MenuitemradioRoleImpl.java b/user/src/com/google/gwt/aria/client/MenuitemradioRoleImpl.java
index 4a8d234..ab50e3a 100644
--- a/user/src/com/google/gwt/aria/client/MenuitemradioRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/MenuitemradioRoleImpl.java
@@ -28,96 +28,16 @@
   }
 
   @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);
   }
@@ -128,101 +48,16 @@
   }
 
   @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);
   }
@@ -233,101 +68,16 @@
   }
 
   @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, CheckedValue value) {
     State.CHECKED.set(element, value);
   }
 
   @Override
-  public void setAriaControlsProperty(Element element, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... 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, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaSelectedState(Element element, SelectedValue value) {
     State.SELECTED.set(element, value);
   }
@@ -336,9 +86,4 @@
   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
index e2859f0..ea70244 100644
--- a/user/src/com/google/gwt/aria/client/NavigationRole.java
+++ b/user/src/com/google/gwt/aria/client/NavigationRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#navigation">navigation</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/NavigationRoleImpl.java b/user/src/com/google/gwt/aria/client/NavigationRoleImpl.java
index 192095e..88bcd54 100644
--- a/user/src/com/google/gwt/aria/client/NavigationRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/NavigationRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 1a85552..56acef3 100644
--- a/user/src/com/google/gwt/aria/client/NoteRole.java
+++ b/user/src/com/google/gwt/aria/client/NoteRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#note">note</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/NoteRoleImpl.java b/user/src/com/google/gwt/aria/client/NoteRoleImpl.java
index c58cdae..26c4391 100644
--- a/user/src/com/google/gwt/aria/client/NoteRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/NoteRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 9ce9be0..7735663 100644
--- a/user/src/com/google/gwt/aria/client/OptionRole.java
+++ b/user/src/com/google/gwt/aria/client/OptionRole.java
@@ -27,27 +27,91 @@
  * @see Roles
  */
 public interface OptionRole extends InputRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-checked">
+   * aria-checked</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaCheckedState(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-posinset">
+   * aria-posinset</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaPosinsetProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaSelectedState(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-setsize">
+   * aria-setsize</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaSetsizeProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-checked">
+   * aria-checked</a> attribute from the {@code element}.
+   */
   void removeAriaCheckedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-posinset">
+   * aria-posinset</a> attribute from the {@code element}.
+   */
   void removeAriaPosinsetProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute from the {@code element}.
+   */
   void removeAriaSelectedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-setsize">
+   * aria-setsize</a> attribute from the {@code element}.
+   */
   void removeAriaSetsizeProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-checked">
+   * aria-checked</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaCheckedState(Element element, CheckedValue value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-posinset">
+   * aria-posinset</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaPosinsetProperty(Element element, int value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaSelectedState(Element element, SelectedValue value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-setsize">
+   * aria-setsize</a> attribute for the {@code element} to the given {@code 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
index c7b32ae..d5f0151 100644
--- a/user/src/com/google/gwt/aria/client/OptionRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/OptionRoleImpl.java
@@ -28,96 +28,16 @@
   }
 
   @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);
   }
@@ -128,101 +48,16 @@
   }
 
   @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);
   }
@@ -233,101 +68,16 @@
   }
 
   @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, CheckedValue value) {
     State.CHECKED.set(element, value);
   }
 
   @Override
-  public void setAriaControlsProperty(Element element, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... 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, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaSelectedState(Element element, SelectedValue value) {
     State.SELECTED.set(element, value);
   }
@@ -336,9 +86,4 @@
   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
index c2b0df4..025801a 100644
--- a/user/src/com/google/gwt/aria/client/PresentationRole.java
+++ b/user/src/com/google/gwt/aria/client/PresentationRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#presentation">presentation</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/PresentationRoleImpl.java b/user/src/com/google/gwt/aria/client/PresentationRoleImpl.java
index 56badbb..7aca2c1 100644
--- a/user/src/com/google/gwt/aria/client/PresentationRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/PresentationRoleImpl.java
@@ -17,8 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-import com.google.gwt.dom.client.Element;
-
 /**
  * <p>Implements {@link PresentationRole}.</p>
  */
@@ -26,259 +24,4 @@
   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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 2c68d6b..57139ce 100644
--- a/user/src/com/google/gwt/aria/client/ProgressbarRole.java
+++ b/user/src/com/google/gwt/aria/client/ProgressbarRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#progressbar">progressbar</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/ProgressbarRoleImpl.java b/user/src/com/google/gwt/aria/client/ProgressbarRoleImpl.java
index 5170fa2..49e9b3a 100644
--- a/user/src/com/google/gwt/aria/client/ProgressbarRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ProgressbarRoleImpl.java
@@ -28,86 +28,6 @@
   }
 
   @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);
   }
@@ -128,91 +48,6 @@
   }
 
   @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);
   }
@@ -233,91 +68,6 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaValuemaxProperty(Element element, Number value) {
     Property.VALUEMAX.set(element, value);
   }
@@ -336,9 +86,4 @@
   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
index 47b5ce2..5da9e17 100644
--- a/user/src/com/google/gwt/aria/client/Property.java
+++ b/user/src/com/google/gwt/aria/client/Property.java
@@ -41,8 +41,8 @@
  * </p>
  */
 public final class Property {
-  public static final Attribute<IdReference> ACTIVEDESCENDANT =
-      new AriaValueAttribute<IdReference>("aria-activedescendant", "");
+  public static final Attribute<Id> ACTIVEDESCENDANT =
+      new AriaValueAttribute<Id>("aria-activedescendant", "");
 
   public static final Attribute<Boolean> ATOMIC =
       new PrimitiveValueAttribute<Boolean>("aria-atomic", "false");
@@ -50,17 +50,17 @@
   public static final Attribute<AutocompleteValue> AUTOCOMPLETE =
       new AriaValueAttribute<AutocompleteValue>("aria-autocomplete", "none");
 
-  public static final Attribute<IdReference> CONTROLS =
-      new AriaValueAttribute<IdReference>("aria-controls", "");
+  public static final Attribute<Id> CONTROLS =
+      new AriaValueAttribute<Id>("aria-controls", "");
 
-  public static final Attribute<IdReference> DESCRIBEDBY =
-      new AriaValueAttribute<IdReference>("aria-describedby", "");
+  public static final Attribute<Id> DESCRIBEDBY =
+      new AriaValueAttribute<Id>("aria-describedby", "");
 
   public static final Attribute<DropeffectValue> DROPEFFECT =
       new AriaValueAttribute<DropeffectValue>("aria-dropeffect", "none");
 
-  public static final Attribute<IdReference> FLOWTO =
-      new AriaValueAttribute<IdReference>("aria-flowto", "");
+  public static final Attribute<Id> FLOWTO =
+      new AriaValueAttribute<Id>("aria-flowto", "");
 
   public static final Attribute<Boolean> HASPOPUP =
       new PrimitiveValueAttribute<Boolean>("aria-haspopup", "false");
@@ -68,8 +68,8 @@
   public static final Attribute<String> LABEL =
       new PrimitiveValueAttribute<String>("aria-label", "");
 
-  public static final Attribute<IdReference> LABELLEDBY =
-      new AriaValueAttribute<IdReference>("aria-labelledby", "");
+  public static final Attribute<Id> LABELLEDBY =
+      new AriaValueAttribute<Id>("aria-labelledby", "");
 
   public static final Attribute<Integer> LEVEL =
       new PrimitiveValueAttribute<Integer>("aria-level", "");
@@ -86,8 +86,8 @@
   public static final Attribute<OrientationValue> ORIENTATION =
       new AriaValueAttribute<OrientationValue>("aria-orientation", "vertical");
 
-  public static final Attribute<IdReference> OWNS =
-      new AriaValueAttribute<IdReference>("aria-owns", "");
+  public static final Attribute<Id> OWNS =
+      new AriaValueAttribute<Id>("aria-owns", "");
 
   public static final Attribute<Integer> POSINSET =
       new PrimitiveValueAttribute<Integer>("aria-posinset", "");
diff --git a/user/src/com/google/gwt/aria/client/RadioRole.java b/user/src/com/google/gwt/aria/client/RadioRole.java
index 7315a6c..3153ef5 100644
--- a/user/src/com/google/gwt/aria/client/RadioRole.java
+++ b/user/src/com/google/gwt/aria/client/RadioRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#radio">radio</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/RadioRoleImpl.java b/user/src/com/google/gwt/aria/client/RadioRoleImpl.java
index 04f0146..103a02c 100644
--- a/user/src/com/google/gwt/aria/client/RadioRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RadioRoleImpl.java
@@ -28,96 +28,16 @@
   }
 
   @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);
   }
@@ -128,101 +48,16 @@
   }
 
   @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);
   }
@@ -233,101 +68,16 @@
   }
 
   @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, CheckedValue value) {
     State.CHECKED.set(element, value);
   }
 
   @Override
-  public void setAriaControlsProperty(Element element, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... 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, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaSelectedState(Element element, SelectedValue value) {
     State.SELECTED.set(element, value);
   }
@@ -336,9 +86,4 @@
   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
index 0f00e49..7a6fd37 100644
--- a/user/src/com/google/gwt/aria/client/RadiogroupRole.java
+++ b/user/src/com/google/gwt/aria/client/RadiogroupRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface RadiogroupRole extends SelectRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaRequiredProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute from the {@code element}.
+   */
   void removeAriaRequiredProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} to the given {@code value}.
+   */
   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
index a235445..f1c4cb5 100644
--- a/user/src/com/google/gwt/aria/client/RadiogroupRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RadiogroupRoleImpl.java
@@ -33,297 +33,42 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 6aad17d..cfcbb3e 100644
--- a/user/src/com/google/gwt/aria/client/RangeRole.java
+++ b/user/src/com/google/gwt/aria/client/RangeRole.java
@@ -27,27 +27,91 @@
  * @see Roles
  */
 public interface RangeRole extends WidgetRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuemax">
+   * aria-valuemax</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaValuemaxProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuemin">
+   * aria-valuemin</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaValueminProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuenow">
+   * aria-valuenow</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaValuenowProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuetext">
+   * aria-valuetext</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaValuetextProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuemax">
+   * aria-valuemax</a> attribute from the {@code element}.
+   */
   void removeAriaValuemaxProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuemin">
+   * aria-valuemin</a> attribute from the {@code element}.
+   */
   void removeAriaValueminProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuenow">
+   * aria-valuenow</a> attribute from the {@code element}.
+   */
   void removeAriaValuenowProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuetext">
+   * aria-valuetext</a> attribute from the {@code element}.
+   */
   void removeAriaValuetextProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuemax">
+   * aria-valuemax</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaValuemaxProperty(Element element, Number value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuemin">
+   * aria-valuemin</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaValueminProperty(Element element, Number value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuenow">
+   * aria-valuenow</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaValuenowProperty(Element element, Number value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-valuetext">
+   * aria-valuetext</a> attribute for the {@code element} to the given {@code 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
index dec20f8..5d522a9 100644
--- a/user/src/com/google/gwt/aria/client/RegionRole.java
+++ b/user/src/com/google/gwt/aria/client/RegionRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#region">region</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/RegionRoleImpl.java b/user/src/com/google/gwt/aria/client/RegionRoleImpl.java
index 12816ab..a2657b2 100644
--- a/user/src/com/google/gwt/aria/client/RegionRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RegionRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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..36bd758
--- /dev/null
+++ b/user/src/com/google/gwt/aria/client/Role.java
@@ -0,0 +1,432 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.aria.client;
+/////////////////////////////////////////////////////////
+// This is auto-generated code.  Do not manually edit! //
+/////////////////////////////////////////////////////////
+
+import com.google.gwt.dom.client.Element;
+
+/**
+ * A generic ARIA Role. This interface defines generic methods for setting, getting, and removing
+ * attributes on DOM Elements so that they can be identified by screen readers. Subtypes
+ * define methods for specific roles.
+ *
+ * <p>The ARIA specification defines a hierarchy of roles, which is mirrored here as
+ * a hierarchy of Java interfaces. Some roles are abstract and define methods that are common to
+ * their children. Only concrete roles (available via methods in {@link Roles}) should be used to
+ * modify HTML elements.</p>
+ *
+ * <p>For more details, see <a href="http://www.w3.org/TR/wai-aria/roles">The Roles Model</a>
+ * in the ARIA specification.</p>
+ */
+public interface Role {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-atomic">
+   * aria-atomic</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaAtomicProperty(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-busy">
+   * aria-busy</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaBusyState(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-controls">
+   * aria-controls</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaControlsProperty(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-describedby">
+   * aria-describedby</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaDescribedbyProperty(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-disabled">
+   * aria-disabled</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaDisabledState(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-dropeffect">
+   * aria-dropeffect</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaDropeffectProperty(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-flowto">
+   * aria-flowto</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaFlowtoProperty(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-grabbed">
+   * aria-grabbed</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaGrabbedState(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-haspopup">
+   * aria-haspopup</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaHaspopupProperty(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-hidden">
+   * aria-hidden</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaHiddenState(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-invalid">
+   * aria-invalid</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaInvalidState(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-labelledby">
+   * aria-labelledby</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaLabelledbyProperty(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-label">
+   * aria-label</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaLabelProperty(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-live">
+   * aria-live</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaLiveProperty(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-owns">
+   * aria-owns</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaOwnsProperty(Element element);
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-relevant">
+   * aria-relevant</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getAriaRelevantProperty(Element element);
+
+  /**
+   * Gets the ARIA 'role' attribute name as defined in the
+   * <a href="http://www.w3.org/TR/wai-aria">WAI-ARIA</a> standard.
+   *
+   * @see <a href="http://www.w3.org/TR/wai-aria/roles">Roles documentation</a>
+   */
+  String getName();
+
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#tabIndex">
+   * tabIndex</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
+  String getTabindexExtraAttribute(Element element);
+
+  /**
+   * Removes the 'role' attribute from the {@code element}.
+   *
+   * @see <a href="http://www.w3.org/TR/wai-aria/roles">Roles documentation</a>
+   */
+  void remove(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-atomic">
+   * aria-atomic</a> attribute from the {@code element}.
+   */
+  void removeAriaAtomicProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-busy">
+   * aria-busy</a> attribute from the {@code element}.
+   */
+  void removeAriaBusyState(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-controls">
+   * aria-controls</a> attribute from the {@code element}.
+   */
+  void removeAriaControlsProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-describedby">
+   * aria-describedby</a> attribute from the {@code element}.
+   */
+  void removeAriaDescribedbyProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-disabled">
+   * aria-disabled</a> attribute from the {@code element}.
+   */
+  void removeAriaDisabledState(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-dropeffect">
+   * aria-dropeffect</a> attribute from the {@code element}.
+   */
+  void removeAriaDropeffectProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-flowto">
+   * aria-flowto</a> attribute from the {@code element}.
+   */
+  void removeAriaFlowtoProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-grabbed">
+   * aria-grabbed</a> attribute from the {@code element}.
+   */
+  void removeAriaGrabbedState(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-haspopup">
+   * aria-haspopup</a> attribute from the {@code element}.
+   */
+  void removeAriaHaspopupProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-hidden">
+   * aria-hidden</a> attribute from the {@code element}.
+   */
+  void removeAriaHiddenState(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-invalid">
+   * aria-invalid</a> attribute from the {@code element}.
+   */
+  void removeAriaInvalidState(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-labelledby">
+   * aria-labelledby</a> attribute from the {@code element}.
+   */
+  void removeAriaLabelledbyProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-label">
+   * aria-label</a> attribute from the {@code element}.
+   */
+  void removeAriaLabelProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-live">
+   * aria-live</a> attribute from the {@code element}.
+   */
+  void removeAriaLiveProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-owns">
+   * aria-owns</a> attribute from the {@code element}.
+   */
+  void removeAriaOwnsProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-relevant">
+   * aria-relevant</a> attribute from the {@code element}.
+   */
+  void removeAriaRelevantProperty(Element element);
+
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#tabIndex">
+   * tabIndex</a> attribute from the {@code element}.
+   */
+  void removeTabindexExtraAttribute(Element element);
+
+  /**
+   * Sets the 'role' attribute of the given {@code element} to the appropriate
+   * value for this role.
+   *
+   * @see <a href="http://www.w3.org/TR/wai-aria/roles">Roles documentation</a>
+   */
+  void set(Element element);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-atomic">
+   * aria-atomic</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaAtomicProperty(Element element, boolean value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-busy">
+   * aria-busy</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaBusyState(Element element, boolean value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-controls">
+   * aria-controls</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaControlsProperty(Element element, Id... value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-describedby">
+   * aria-describedby</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaDescribedbyProperty(Element element, Id... value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-disabled">
+   * aria-disabled</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaDisabledState(Element element, boolean value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-dropeffect">
+   * aria-dropeffect</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaDropeffectProperty(Element element, DropeffectValue... value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-flowto">
+   * aria-flowto</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaFlowtoProperty(Element element, Id... value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-grabbed">
+   * aria-grabbed</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaGrabbedState(Element element, GrabbedValue value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-haspopup">
+   * aria-haspopup</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaHaspopupProperty(Element element, boolean value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-hidden">
+   * aria-hidden</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaHiddenState(Element element, boolean value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-invalid">
+   * aria-invalid</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaInvalidState(Element element, InvalidValue value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-labelledby">
+   * aria-labelledby</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaLabelledbyProperty(Element element, Id... value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-label">
+   * aria-label</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaLabelProperty(Element element, String value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-live">
+   * aria-live</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaLiveProperty(Element element, LiveValue value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-owns">
+   * aria-owns</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaOwnsProperty(Element element, Id... value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-relevant">
+   * aria-relevant</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaRelevantProperty(Element element, RelevantValue... value);
+
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#tabIndex">
+   * tabIndex</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setTabindexExtraAttribute(Element element, int value);
+}
diff --git a/user/src/com/google/gwt/aria/client/RoleImpl.java b/user/src/com/google/gwt/aria/client/RoleImpl.java
index df8c999..8db4830 100644
--- a/user/src/com/google/gwt/aria/client/RoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RoleImpl.java
@@ -20,21 +20,10 @@
 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>
+ * The base class for implementing a Role. Includes basic operations for modifying
+ * the "role" attribute and methods that are common to all roles.
  */
-class RoleImpl {
+class RoleImpl implements Role {
   private static final String ATTR_NAME_ROLE = "role";
 
   private final String roleName;
@@ -44,43 +33,275 @@
     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);
+  @Override
+  public String getAriaAtomicProperty(Element element) {
+    return Property.ATOMIC.get(element);
   }
 
-  /**
-   * Gets the role name
-   *
-   * @return The role name
-   */
+  @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 getName() {
     return roleName;
   }
 
-  /**
-   * Removes the role for element {@code element}
-   *
-   * @param element HTML element
-   */
+  @Override
+  public String getTabindexExtraAttribute(Element element) {
+    return ExtraAttribute.TABINDEX.get(element);
+  }
+
+  @Override
   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
-   */
+  @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 set(Element element) {
     assert element != null : "Element cannot be null.";
     element.setAttribute(ATTR_NAME_ROLE, roleName);
   }
+
+  @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, Id... value) {
+    Property.CONTROLS.set(element, value);
+  }
+
+  @Override
+  public void setAriaDescribedbyProperty(Element element, Id... 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, DropeffectValue... value) {
+    Property.DROPEFFECT.set(element, value);
+  }
+
+  @Override
+  public void setAriaFlowtoProperty(Element element, Id... value) {
+    Property.FLOWTO.set(element, value);
+  }
+
+  @Override
+  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
+    State.INVALID.set(element, value);
+  }
+
+  @Override
+  public void setAriaLabelledbyProperty(Element element, Id... 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, LiveValue value) {
+    Property.LIVE.set(element, value);
+  }
+
+  @Override
+  public void setAriaOwnsProperty(Element element, Id... value) {
+    Property.OWNS.set(element, value);
+  }
+
+  @Override
+  public void setAriaRelevantProperty(Element element, RelevantValue... 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/Roles.java b/user/src/com/google/gwt/aria/client/Roles.java
index 43c7b48..776bed8 100644
--- a/user/src/com/google/gwt/aria/client/Roles.java
+++ b/user/src/com/google/gwt/aria/client/Roles.java
@@ -17,6 +17,11 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
+import com.google.gwt.dom.client.Element;
+
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * <p>A factory providing each concrete role in the ARIA specification. Each role implements
  * methods that a GWT application can use to modify the appropriate DOM attributes for that
@@ -129,6 +134,72 @@
   private static final TreeitemRole TREEITEM = new TreeitemRoleImpl("treeitem");
   private static final TreeRole TREE = new TreeRoleImpl("tree");
 
+  private static final Map<String, Role> ROLES_MAP = new HashMap<String, Role>();
+
+  static {
+    ROLES_MAP.put("region", REGION);
+    ROLES_MAP.put("alert", ALERT);
+    ROLES_MAP.put("dialog", DIALOG);
+    ROLES_MAP.put("alertdialog", ALERTDIALOG);
+    ROLES_MAP.put("application", APPLICATION);
+    ROLES_MAP.put("document", DOCUMENT);
+    ROLES_MAP.put("article", ARTICLE);
+    ROLES_MAP.put("banner", BANNER);
+    ROLES_MAP.put("button", BUTTON);
+    ROLES_MAP.put("checkbox", CHECKBOX);
+    ROLES_MAP.put("gridcell", GRIDCELL);
+    ROLES_MAP.put("columnheader", COLUMNHEADER);
+    ROLES_MAP.put("group", GROUP);
+    ROLES_MAP.put("combobox", COMBOBOX);
+    ROLES_MAP.put("complementary", COMPLEMENTARY);
+    ROLES_MAP.put("contentinfo", CONTENTINFO);
+    ROLES_MAP.put("definition", DEFINITION);
+    ROLES_MAP.put("list", LIST);
+    ROLES_MAP.put("directory", DIRECTORY);
+    ROLES_MAP.put("form", FORM);
+    ROLES_MAP.put("grid", GRID);
+    ROLES_MAP.put("heading", HEADING);
+    ROLES_MAP.put("img", IMG);
+    ROLES_MAP.put("link", LINK);
+    ROLES_MAP.put("listbox", LISTBOX);
+    ROLES_MAP.put("listitem", LISTITEM);
+    ROLES_MAP.put("log", LOG);
+    ROLES_MAP.put("main", MAIN);
+    ROLES_MAP.put("marquee", MARQUEE);
+    ROLES_MAP.put("math", MATH);
+    ROLES_MAP.put("menu", MENU);
+    ROLES_MAP.put("menubar", MENUBAR);
+    ROLES_MAP.put("menuitem", MENUITEM);
+    ROLES_MAP.put("menuitemcheckbox", MENUITEMCHECKBOX);
+    ROLES_MAP.put("option", OPTION);
+    ROLES_MAP.put("radio", RADIO);
+    ROLES_MAP.put("menuitemradio", MENUITEMRADIO);
+    ROLES_MAP.put("navigation", NAVIGATION);
+    ROLES_MAP.put("note", NOTE);
+    ROLES_MAP.put("presentation", PRESENTATION);
+    ROLES_MAP.put("progressbar", PROGRESSBAR);
+    ROLES_MAP.put("radiogroup", RADIOGROUP);
+    ROLES_MAP.put("row", ROW);
+    ROLES_MAP.put("rowgroup", ROWGROUP);
+    ROLES_MAP.put("rowheader", ROWHEADER);
+    ROLES_MAP.put("search", SEARCH);
+    ROLES_MAP.put("separator", SEPARATOR);
+    ROLES_MAP.put("scrollbar", SCROLLBAR);
+    ROLES_MAP.put("slider", SLIDER);
+    ROLES_MAP.put("spinbutton", SPINBUTTON);
+    ROLES_MAP.put("status", STATUS);
+    ROLES_MAP.put("tab", TAB);
+    ROLES_MAP.put("tablist", TABLIST);
+    ROLES_MAP.put("tabpanel", TABPANEL);
+    ROLES_MAP.put("textbox", TEXTBOX);
+    ROLES_MAP.put("timer", TIMER);
+    ROLES_MAP.put("toolbar", TOOLBAR);
+    ROLES_MAP.put("tooltip", TOOLTIP);
+    ROLES_MAP.put("tree", TREE);
+    ROLES_MAP.put("treegrid", TREEGRID);
+    ROLES_MAP.put("treeitem", TREEITEM);
+  }
+
   public static AlertdialogRole getAlertdialogRole() {
     return ALERTDIALOG;
   }
@@ -372,4 +443,22 @@
   public static TreeRole getTreeRole() {
     return TREE;
   }
+
+  /**
+   * Returns the WAI-ARIA role for the {@code element}. If no 'role' attribute is set to the
+   * {@code element} or if the set role tokens do not include a WAI-ARIA role,
+   * null is returned. Otherwise, if a WAI_ARIA role is among the role tokens in the the 'role'
+   * attribute token list, a {@link Role} corresponding the WAI-ARIA role is returned.
+   */
+  public static Role roleOf(Element element) {
+    assert element != null : "Element cannot be null.";
+    String roleAttributeValue = element.getAttribute("role");
+    for (String testRoleName : roleAttributeValue.split("\\s+")) {
+      Role role = ROLES_MAP.get(testRoleName);
+      if (role != null) {
+        return role;
+      }
+    }
+    return null;
+  }
 }
diff --git a/user/src/com/google/gwt/aria/client/RowRole.java b/user/src/com/google/gwt/aria/client/RowRole.java
index 82f1032..2dfe4d7 100644
--- a/user/src/com/google/gwt/aria/client/RowRole.java
+++ b/user/src/com/google/gwt/aria/client/RowRole.java
@@ -27,15 +27,47 @@
  * @see Roles
  */
 public interface RowRole extends GroupRole, WidgetRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaLevelProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaSelectedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute from the {@code element}.
+   */
   void removeAriaLevelProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute from the {@code element}.
+   */
   void removeAriaSelectedState(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaLevelProperty(Element element, int value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaSelectedState(Element element, SelectedValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/RowRoleImpl.java b/user/src/com/google/gwt/aria/client/RowRoleImpl.java
index 9b9a467..c42f7e2 100644
--- a/user/src/com/google/gwt/aria/client/RowRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RowRoleImpl.java
@@ -33,312 +33,57 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaSelectedState(Element element, SelectedValue 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
index 55ba25e..8921248 100644
--- a/user/src/com/google/gwt/aria/client/RowgroupRole.java
+++ b/user/src/com/google/gwt/aria/client/RowgroupRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#rowgroup">rowgroup</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/RowgroupRoleImpl.java b/user/src/com/google/gwt/aria/client/RowgroupRoleImpl.java
index 74ec684..01ebd34 100644
--- a/user/src/com/google/gwt/aria/client/RowgroupRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RowgroupRoleImpl.java
@@ -33,282 +33,27 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 73ab027..c6a6a0d 100644
--- a/user/src/com/google/gwt/aria/client/RowheaderRole.java
+++ b/user/src/com/google/gwt/aria/client/RowheaderRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface RowheaderRole extends GridcellRole, SectionheadRole, WidgetRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-sort">
+   * aria-sort</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaSortProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-sort">
+   * aria-sort</a> attribute from the {@code element}.
+   */
   void removeAriaSortProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-sort">
+   * aria-sort</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaSortProperty(Element element, SortValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java b/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java
index 6e16a37..2403eba 100644
--- a/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/RowheaderRoleImpl.java
@@ -28,96 +28,16 @@
   }
 
   @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);
   }
@@ -133,101 +53,16 @@
   }
 
   @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);
   }
@@ -243,101 +78,16 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... 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, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaRequiredProperty(Element element, boolean value) {
     Property.REQUIRED.set(element, value);
   }
@@ -351,9 +101,4 @@
   public void setAriaSortProperty(Element element, SortValue 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
index 723447e..6f57f4d 100644
--- a/user/src/com/google/gwt/aria/client/ScrollbarRole.java
+++ b/user/src/com/google/gwt/aria/client/ScrollbarRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface ScrollbarRole extends InputRole, RangeRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-orientation">
+   * aria-orientation</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaOrientationProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-orientation">
+   * aria-orientation</a> attribute from the {@code element}.
+   */
   void removeAriaOrientationProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-orientation">
+   * aria-orientation</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaOrientationProperty(Element element, OrientationValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java b/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java
index 6b677e0..0d2e6ae 100644
--- a/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ScrollbarRoleImpl.java
@@ -28,91 +28,16 @@
   }
 
   @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);
   }
@@ -133,96 +58,16 @@
   }
 
   @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);
   }
@@ -243,96 +88,16 @@
   }
 
   @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, IdReference... value) {
+  public void setAriaControlsProperty(Element element, Id... value) {
     Property.CONTROLS.set(element, value);
   }
 
   @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
   public void setAriaOrientationProperty(Element element, OrientationValue value) {
     Property.ORIENTATION.set(element, value);
   }
 
   @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaValuemaxProperty(Element element, Number value) {
     Property.VALUEMAX.set(element, value);
   }
@@ -351,9 +116,4 @@
   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
index 1cd92f7..e73d414 100644
--- a/user/src/com/google/gwt/aria/client/SearchRole.java
+++ b/user/src/com/google/gwt/aria/client/SearchRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#search">search</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/SearchRoleImpl.java b/user/src/com/google/gwt/aria/client/SearchRoleImpl.java
index 2a6fcaf..5704bec 100644
--- a/user/src/com/google/gwt/aria/client/SearchRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/SearchRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index bf6a7b2..2ebc810 100644
--- a/user/src/com/google/gwt/aria/client/SectionRole.java
+++ b/user/src/com/google/gwt/aria/client/SectionRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface SectionRole extends StructureRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaExpandedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute from the {@code element}.
+   */
   void removeAriaExpandedState(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaExpandedState(Element element, ExpandedValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/SectionheadRole.java b/user/src/com/google/gwt/aria/client/SectionheadRole.java
index c54e8a2..47bd28f 100644
--- a/user/src/com/google/gwt/aria/client/SectionheadRole.java
+++ b/user/src/com/google/gwt/aria/client/SectionheadRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface SectionheadRole extends StructureRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaExpandedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute from the {@code element}.
+   */
   void removeAriaExpandedState(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaExpandedState(Element element, ExpandedValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/SelectRole.java b/user/src/com/google/gwt/aria/client/SelectRole.java
index 22de0db..99db605 100644
--- a/user/src/com/google/gwt/aria/client/SelectRole.java
+++ b/user/src/com/google/gwt/aria/client/SelectRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#select">select</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/SeparatorRole.java b/user/src/com/google/gwt/aria/client/SeparatorRole.java
index ffc966d..1322c05 100644
--- a/user/src/com/google/gwt/aria/client/SeparatorRole.java
+++ b/user/src/com/google/gwt/aria/client/SeparatorRole.java
@@ -27,15 +27,47 @@
  * @see Roles
  */
 public interface SeparatorRole extends StructureRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaExpandedState(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-orientation">
+   * aria-orientation</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaOrientationProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute from the {@code element}.
+   */
   void removeAriaExpandedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-orientation">
+   * aria-orientation</a> attribute from the {@code element}.
+   */
   void removeAriaOrientationProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaExpandedState(Element element, ExpandedValue value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-orientation">
+   * aria-orientation</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaOrientationProperty(Element element, OrientationValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java b/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java
index dd75693..9fa1cda 100644
--- a/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/SeparatorRoleImpl.java
@@ -28,287 +28,32 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
   public void setAriaOrientationProperty(Element element, OrientationValue value) {
     Property.ORIENTATION.set(element, value);
   }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index ab268b2..c7b4333 100644
--- a/user/src/com/google/gwt/aria/client/SliderRole.java
+++ b/user/src/com/google/gwt/aria/client/SliderRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface SliderRole extends InputRole, RangeRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-orientation">
+   * aria-orientation</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaOrientationProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-orientation">
+   * aria-orientation</a> attribute from the {@code element}.
+   */
   void removeAriaOrientationProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-orientation">
+   * aria-orientation</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaOrientationProperty(Element element, OrientationValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/SliderRoleImpl.java b/user/src/com/google/gwt/aria/client/SliderRoleImpl.java
index 5ebd768..f64c771 100644
--- a/user/src/com/google/gwt/aria/client/SliderRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/SliderRoleImpl.java
@@ -28,91 +28,11 @@
   }
 
   @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);
   }
@@ -133,96 +53,11 @@
   }
 
   @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);
   }
@@ -243,96 +78,11 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
   public void setAriaOrientationProperty(Element element, OrientationValue value) {
     Property.ORIENTATION.set(element, value);
   }
 
   @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaValuemaxProperty(Element element, Number value) {
     Property.VALUEMAX.set(element, value);
   }
@@ -351,9 +101,4 @@
   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
index cddb0b6..ea3e4c2 100644
--- a/user/src/com/google/gwt/aria/client/SpinbuttonRole.java
+++ b/user/src/com/google/gwt/aria/client/SpinbuttonRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface SpinbuttonRole extends InputRole, RangeRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaRequiredProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute from the {@code element}.
+   */
   void removeAriaRequiredProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} to the given {@code value}.
+   */
   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
index 872080d..fa74542 100644
--- a/user/src/com/google/gwt/aria/client/SpinbuttonRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/SpinbuttonRoleImpl.java
@@ -28,86 +28,6 @@
   }
 
   @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);
   }
@@ -133,91 +53,6 @@
   }
 
   @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);
   }
@@ -243,91 +78,6 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaRequiredProperty(Element element, boolean value) {
     Property.REQUIRED.set(element, value);
   }
@@ -351,9 +101,4 @@
   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/StatusRole.java b/user/src/com/google/gwt/aria/client/StatusRole.java
index 9bde7d7..f8b21cf 100644
--- a/user/src/com/google/gwt/aria/client/StatusRole.java
+++ b/user/src/com/google/gwt/aria/client/StatusRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#status">status</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/StatusRoleImpl.java b/user/src/com/google/gwt/aria/client/StatusRoleImpl.java
index 2329a3e..a5a480e 100644
--- a/user/src/com/google/gwt/aria/client/StatusRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/StatusRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 69a1430..ecbbdce 100644
--- a/user/src/com/google/gwt/aria/client/StructureRole.java
+++ b/user/src/com/google/gwt/aria/client/StructureRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#structure">structure</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/TabRole.java b/user/src/com/google/gwt/aria/client/TabRole.java
index 47875c7..09773ca 100644
--- a/user/src/com/google/gwt/aria/client/TabRole.java
+++ b/user/src/com/google/gwt/aria/client/TabRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface TabRole extends SectionheadRole, WidgetRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaSelectedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute from the {@code element}.
+   */
   void removeAriaSelectedState(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-selected">
+   * aria-selected</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaSelectedState(Element element, SelectedValue value);
 }
diff --git a/user/src/com/google/gwt/aria/client/TabRoleImpl.java b/user/src/com/google/gwt/aria/client/TabRoleImpl.java
index 60aef5e..45fbd3d 100644
--- a/user/src/com/google/gwt/aria/client/TabRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TabRoleImpl.java
@@ -28,287 +28,32 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaSelectedState(Element element, SelectedValue 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
index b795ed8..97b6f33 100644
--- a/user/src/com/google/gwt/aria/client/TablistRole.java
+++ b/user/src/com/google/gwt/aria/client/TablistRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface TablistRole extends CompositeRole, DirectoryRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaLevelProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute from the {@code element}.
+   */
   void removeAriaLevelProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-level">
+   * aria-level</a> attribute for the {@code element} to the given {@code value}.
+   */
   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
index a92be09..c510af1 100644
--- a/user/src/com/google/gwt/aria/client/TablistRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TablistRoleImpl.java
@@ -33,297 +33,42 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 30a8d9a..64f7288 100644
--- a/user/src/com/google/gwt/aria/client/TabpanelRole.java
+++ b/user/src/com/google/gwt/aria/client/TabpanelRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#tabpanel">tabpanel</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/TabpanelRoleImpl.java b/user/src/com/google/gwt/aria/client/TabpanelRoleImpl.java
index 54aaff6..ffee772 100644
--- a/user/src/com/google/gwt/aria/client/TabpanelRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TabpanelRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index 03f6a37..5b8c61e 100644
--- a/user/src/com/google/gwt/aria/client/TextboxRole.java
+++ b/user/src/com/google/gwt/aria/client/TextboxRole.java
@@ -27,33 +27,113 @@
  * @see Roles
  */
 public interface TextboxRole extends InputRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-activedescendant">
+   * aria-activedescendant</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaActivedescendantProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-autocomplete">
+   * aria-autocomplete</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaAutocompleteProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiline">
+   * aria-multiline</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaMultilineProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-readonly">
+   * aria-readonly</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaReadonlyProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaRequiredProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-activedescendant">
+   * aria-activedescendant</a> attribute from the {@code element}.
+   */
   void removeAriaActivedescendantProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-autocomplete">
+   * aria-autocomplete</a> attribute from the {@code element}.
+   */
   void removeAriaAutocompleteProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiline">
+   * aria-multiline</a> attribute from the {@code element}.
+   */
   void removeAriaMultilineProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-readonly">
+   * aria-readonly</a> attribute from the {@code element}.
+   */
   void removeAriaReadonlyProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute from the {@code element}.
+   */
   void removeAriaRequiredProperty(Element element);
 
-  void setAriaActivedescendantProperty(Element element, IdReference value);
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-activedescendant">
+   * aria-activedescendant</a> attribute for the {@code element} to the given {@code value}.
+   */
+  void setAriaActivedescendantProperty(Element element, Id value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-autocomplete">
+   * aria-autocomplete</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaAutocompleteProperty(Element element, AutocompleteValue value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiline">
+   * aria-multiline</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaMultilineProperty(Element element, boolean value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-readonly">
+   * aria-readonly</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaReadonlyProperty(Element element, boolean value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} to the given {@code 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
index 88203ad..72dfce0 100644
--- a/user/src/com/google/gwt/aria/client/TextboxRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TextboxRoleImpl.java
@@ -33,327 +33,72 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, AutocompleteValue 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue 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, IdReference... 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, RelevantValue... 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
index 66a9043..96023c1 100644
--- a/user/src/com/google/gwt/aria/client/TimerRole.java
+++ b/user/src/com/google/gwt/aria/client/TimerRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#timer">timer</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/TimerRoleImpl.java b/user/src/com/google/gwt/aria/client/TimerRoleImpl.java
index 4bcb08b..676c778 100644
--- a/user/src/com/google/gwt/aria/client/TimerRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TimerRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index ae2b7cb..4832496 100644
--- a/user/src/com/google/gwt/aria/client/ToolbarRole.java
+++ b/user/src/com/google/gwt/aria/client/ToolbarRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#toolbar">toolbar</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/ToolbarRoleImpl.java b/user/src/com/google/gwt/aria/client/ToolbarRoleImpl.java
index 4592e60..e58dcb7 100644
--- a/user/src/com/google/gwt/aria/client/ToolbarRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/ToolbarRoleImpl.java
@@ -33,282 +33,27 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index b456cc7..38d33af 100644
--- a/user/src/com/google/gwt/aria/client/TooltipRole.java
+++ b/user/src/com/google/gwt/aria/client/TooltipRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#tooltip">tooltip</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/TooltipRoleImpl.java b/user/src/com/google/gwt/aria/client/TooltipRoleImpl.java
index 309a1ca..576d3bc 100644
--- a/user/src/com/google/gwt/aria/client/TooltipRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TooltipRoleImpl.java
@@ -28,272 +28,17 @@
   }
 
   @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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
-
-  @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index eaf1993..bac9154 100644
--- a/user/src/com/google/gwt/aria/client/TreeRole.java
+++ b/user/src/com/google/gwt/aria/client/TreeRole.java
@@ -27,15 +27,47 @@
  * @see Roles
  */
 public interface TreeRole extends SelectRole {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiselectable">
+   * aria-multiselectable</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaMultiselectableProperty(Element element);
 
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaRequiredProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiselectable">
+   * aria-multiselectable</a> attribute from the {@code element}.
+   */
   void removeAriaMultiselectableProperty(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute from the {@code element}.
+   */
   void removeAriaRequiredProperty(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-multiselectable">
+   * aria-multiselectable</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaMultiselectableProperty(Element element, boolean value);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-required">
+   * aria-required</a> attribute for the {@code element} to the given {@code 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
index 6927782..4cd7c55 100644
--- a/user/src/com/google/gwt/aria/client/TreeRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TreeRoleImpl.java
@@ -33,312 +33,57 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue 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, IdReference... value) {
-    Property.OWNS.set(element, value);
-  }
-
-  @Override
-  public void setAriaRelevantProperty(Element element, RelevantValue... 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
index e2a4430..53308fe 100644
--- a/user/src/com/google/gwt/aria/client/TreegridRole.java
+++ b/user/src/com/google/gwt/aria/client/TreegridRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#treegrid">treegrid</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/TreegridRoleImpl.java b/user/src/com/google/gwt/aria/client/TreegridRoleImpl.java
index 1d5f9bf..eb12ce2 100644
--- a/user/src/com/google/gwt/aria/client/TreegridRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TreegridRoleImpl.java
@@ -33,342 +33,87 @@
   }
 
   @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) {
+  public void setAriaActivedescendantProperty(Element element, Id 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, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue 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, IdReference... 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, RelevantValue... 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
index 2266786..c4480f5 100644
--- a/user/src/com/google/gwt/aria/client/TreeitemRole.java
+++ b/user/src/com/google/gwt/aria/client/TreeitemRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#treeitem">treeitem</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/TreeitemRoleImpl.java b/user/src/com/google/gwt/aria/client/TreeitemRoleImpl.java
index 7344626..79edeb3 100644
--- a/user/src/com/google/gwt/aria/client/TreeitemRoleImpl.java
+++ b/user/src/com/google/gwt/aria/client/TreeitemRoleImpl.java
@@ -28,106 +28,26 @@
   }
 
   @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);
   }
@@ -138,111 +58,26 @@
   }
 
   @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);
   }
@@ -253,111 +88,26 @@
   }
 
   @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, CheckedValue value) {
     State.CHECKED.set(element, value);
   }
 
   @Override
-  public void setAriaControlsProperty(Element element, IdReference... value) {
-    Property.CONTROLS.set(element, value);
-  }
-
-  @Override
-  public void setAriaDescribedbyProperty(Element element, IdReference... 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, DropeffectValue... value) {
-    Property.DROPEFFECT.set(element, value);
-  }
-
-  @Override
   public void setAriaExpandedState(Element element, ExpandedValue value) {
     State.EXPANDED.set(element, value);
   }
 
   @Override
-  public void setAriaFlowtoProperty(Element element, IdReference... value) {
-    Property.FLOWTO.set(element, value);
-  }
-
-  @Override
-  public void setAriaGrabbedState(Element element, GrabbedValue 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, InvalidValue value) {
-    State.INVALID.set(element, value);
-  }
-
-  @Override
-  public void setAriaLabelledbyProperty(Element element, IdReference... 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, LiveValue value) {
-    Property.LIVE.set(element, value);
-  }
-
-  @Override
-  public void setAriaOwnsProperty(Element element, IdReference... 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, RelevantValue... value) {
-    Property.RELEVANT.set(element, value);
-  }
-
-  @Override
   public void setAriaSelectedState(Element element, SelectedValue value) {
     State.SELECTED.set(element, value);
   }
@@ -366,9 +116,4 @@
   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
index 7b7f38e..f12ec33 100644
--- a/user/src/com/google/gwt/aria/client/WidgetRole.java
+++ b/user/src/com/google/gwt/aria/client/WidgetRole.java
@@ -17,7 +17,6 @@
 // This is auto-generated code.  Do not manually edit! //
 /////////////////////////////////////////////////////////
 
-
 /**
  * A type that represents the <a href="http://www.w3.org/TR/wai-aria/roles#widget">widget</a>
  * role in the ARIA specification.
diff --git a/user/src/com/google/gwt/aria/client/WindowRole.java b/user/src/com/google/gwt/aria/client/WindowRole.java
index 73ad921..3bf2495 100644
--- a/user/src/com/google/gwt/aria/client/WindowRole.java
+++ b/user/src/com/google/gwt/aria/client/WindowRole.java
@@ -27,9 +27,25 @@
  * @see Roles
  */
 public interface WindowRole extends Role {
+  /**
+   * Returns the value of the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} or "" if no
+   * such attribute is present.
+   */
   String getAriaExpandedState(Element element);
 
+  /**
+   * Removes the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute from the {@code element}.
+   */
   void removeAriaExpandedState(Element element);
 
+  /**
+   * Sets the
+   * <a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-expanded">
+   * aria-expanded</a> attribute for the {@code element} to the given {@code value}.
+   */
   void setAriaExpandedState(Element element, ExpandedValue value);
 }
diff --git a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
index eae6fa2..6b4924a 100644
--- a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
+++ b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
@@ -532,11 +532,21 @@
     String toReturn = "";
     fnToString = fnToString.trim();
     int index = fnToString.indexOf("(");
+    int start = fnToString.startsWith("function") ? 8 : 0;
+    if (index == -1) {
+      // Firefox 14 does not include parenthesis and uses '@' symbol instead to terminate symbol
+      index = fnToString.indexOf('@');
+      /**
+       * Firefox 14 doesn't return strings like 'function()' for anonymous methods, so
+       * we assert a space must trail 'function' keyword for a method named 'functionName', e.g.
+       * functionName:file.js:2 won't accidentally strip off the 'function' prefix which is part
+       * of the name.
+       */
+      start = fnToString.startsWith("function ") ? 9 : 0;
+    }
     if (index != -1) {
-      int start = fnToString.startsWith("function") ? 8 : 0;
       toReturn = fnToString.substring(start, index).trim();
     }
-
     return toReturn.length() > 0 ? toReturn : "anonymous";
   }
 
diff --git a/user/src/com/google/gwt/dom/builder/shared/ElementBuilderFactory.java b/user/src/com/google/gwt/dom/builder/shared/ElementBuilderFactory.java
index 31da8b1..76e34a0 100644
--- a/user/src/com/google/gwt/dom/builder/shared/ElementBuilderFactory.java
+++ b/user/src/com/google/gwt/dom/builder/shared/ElementBuilderFactory.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.dom.builder.shared;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 
 /**
  * Factory for creating element builders.
diff --git a/user/src/com/google/gwt/dom/builder/shared/ElementBuilderImpl.java b/user/src/com/google/gwt/dom/builder/shared/ElementBuilderImpl.java
index 131e4de..1f69493 100644
--- a/user/src/com/google/gwt/dom/builder/shared/ElementBuilderImpl.java
+++ b/user/src/com/google/gwt/dom/builder/shared/ElementBuilderImpl.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.dom.builder.shared;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.regexp.shared.RegExp;
 import com.google.gwt.safehtml.shared.SafeHtml;
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlStylesBuilder.java b/user/src/com/google/gwt/dom/builder/shared/HtmlStylesBuilder.java
index 2c12769..ce8cd98 100644
--- a/user/src/com/google/gwt/dom/builder/shared/HtmlStylesBuilder.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlStylesBuilder.java
@@ -15,8 +15,8 @@
  */
 package com.google.gwt.dom.builder.shared;
 
-import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.dom.client.Style.BorderStyle;
 import com.google.gwt.dom.client.Style.Cursor;
 import com.google.gwt.dom.client.Style.Display;
diff --git a/user/src/com/google/gwt/editor/client/impl/BaseEditorDriver.java b/user/src/com/google/gwt/editor/client/impl/BaseEditorDriver.java
index 7c4dc5f..84d1097 100644
--- a/user/src/com/google/gwt/editor/client/impl/BaseEditorDriver.java
+++ b/user/src/com/google/gwt/editor/client/impl/BaseEditorDriver.java
@@ -64,7 +64,8 @@
   }
 
   public boolean setConstraintViolations(final Iterable<ConstraintViolation<?>> violations) {
-    return doSetViolations(SimpleViolation.iterableFromConstrantViolations(violations));
+    return doSetViolations(violations == null ? null : SimpleViolation
+        .iterableFromConstrantViolations(violations));
   }
 
   @Override
diff --git a/user/src/com/google/gwt/editor/client/impl/SimpleViolation.java b/user/src/com/google/gwt/editor/client/impl/SimpleViolation.java
index ab4e9ea..803980f 100644
--- a/user/src/com/google/gwt/editor/client/impl/SimpleViolation.java
+++ b/user/src/com/google/gwt/editor/client/impl/SimpleViolation.java
@@ -109,6 +109,10 @@
    */
   public static void pushViolations(Iterable<SimpleViolation> violations,
       EditorDriver<?> driver, KeyMethod keyMethod) {
+    if (violations == null) {
+      return;
+    }
+
     DelegateMap delegateMap = DelegateMap.of(driver, keyMethod);
 
     // For each violation
diff --git a/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java b/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java
index 2c18533..fcf5571 100644
--- a/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java
+++ b/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java
@@ -236,7 +236,7 @@
   private static Map<String, BrowserVersion> createBrowserMap() {
     Map<String, BrowserVersion> browserMap = new HashMap<String, BrowserVersion>();
     for (BrowserVersion browser : new BrowserVersion[] {
-        BrowserVersion.FIREFOX_3, BrowserVersion.INTERNET_EXPLORER_6,
+        BrowserVersion.FIREFOX_3, BrowserVersion.FIREFOX_3_6, BrowserVersion.INTERNET_EXPLORER_6,
         BrowserVersion.INTERNET_EXPLORER_7}) {
       browserMap.put(browser.getNickname(), browser);
     }
diff --git a/user/src/com/google/gwt/junit/client/GWTTestCase.java b/user/src/com/google/gwt/junit/client/GWTTestCase.java
index 4d991cc..b3c0258 100644
--- a/user/src/com/google/gwt/junit/client/GWTTestCase.java
+++ b/user/src/com/google/gwt/junit/client/GWTTestCase.java
@@ -209,7 +209,7 @@
    * where exceptions are originating.
    *
    * @return <code>true</code> for normal JUnit behavior, or <code>false</code>
-   *         to disable normal JUnit getException reporting
+   *         to disable normal JUnit exception reporting
    */
   public boolean catchExceptions() {
     return true;
@@ -349,8 +349,8 @@
    * <ol>
    * <li> If {@link #finishTest()} is called before the delay period expires,
    * the test will succeed.</li>
-   * <li> If any getException escapes from an event handler during the delay
-   * period, the test will error with the thrown getException.</li>
+   * <li> If any exception escapes from an event handler during the delay
+   * period, the test will error with the thrown exception.</li>
    * <li> If the delay period expires and neither of the above has happened, the
    * test will error with a {@link TimeoutException}. </li>
    * </ol>
diff --git a/user/src/com/google/gwt/layout/Layout.gwt.xml b/user/src/com/google/gwt/layout/Layout.gwt.xml
index 65797b5..c7a22f5 100644
--- a/user/src/com/google/gwt/layout/Layout.gwt.xml
+++ b/user/src/com/google/gwt/layout/Layout.gwt.xml
@@ -14,9 +14,12 @@
 
 <module>
   <inherits name="com.google.gwt.core.Core"/>
-  <inherits name="com.google.gwt.user.UserAgent"/>
+  <inherits name="com.google.gwt.useragent.UserAgent"/>
   <inherits name="com.google.gwt.dom.DOM"/>
   <inherits name="com.google.gwt.animation.Animation"/>
+  <inherits name="com.google.gwt.aria.Aria"/>
+  <!--  LayoutImplIE6 uses c.g.g.u.c.Window -->
+  <inherits name="com.google.gwt.user.Window"/>
 
   <replace-with class="com.google.gwt.layout.client.LayoutImplIE8">
     <when-type-is class="com.google.gwt.layout.client.LayoutImpl"/>
diff --git a/user/src/com/google/gwt/layout/client/LayoutImpl.java b/user/src/com/google/gwt/layout/client/LayoutImpl.java
index a21f3f7..9816333 100644
--- a/user/src/com/google/gwt/layout/client/LayoutImpl.java
+++ b/user/src/com/google/gwt/layout/client/LayoutImpl.java
@@ -19,6 +19,7 @@
 import static com.google.gwt.dom.client.Style.Unit.EX;
 import static com.google.gwt.dom.client.Style.Unit.PX;
 
+import com.google.gwt.aria.client.State;
 import com.google.gwt.dom.client.DivElement;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
@@ -62,6 +63,8 @@
     // extra precision.
     style.setWidth(10, widthUnit);
     style.setHeight(10, heightUnit);
+
+    State.HIDDEN.set(ruler, true);
     return ruler;
   }
 
diff --git a/user/src/com/google/gwt/place/Place.gwt.xml b/user/src/com/google/gwt/place/Place.gwt.xml
index 56fff20..524d65d 100644
--- a/user/src/com/google/gwt/place/Place.gwt.xml
+++ b/user/src/com/google/gwt/place/Place.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 0.0.999//EN" "http://google-web-toolkit.googlecode.com/svn/tags/0.0.999/distro-source/core/src/gwt-module.dtd">
 <module>
   <inherits name='com.google.gwt.user.User'/>
 
diff --git a/user/src/com/google/gwt/place/shared/PlaceController.java b/user/src/com/google/gwt/place/shared/PlaceController.java
index 21b80eb..a34d817 100644
--- a/user/src/com/google/gwt/place/shared/PlaceController.java
+++ b/user/src/com/google/gwt/place/shared/PlaceController.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.place.shared;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.Window.ClosingEvent;
diff --git a/user/src/com/google/gwt/place/shared/PlaceHistoryHandler.java b/user/src/com/google/gwt/place/shared/PlaceHistoryHandler.java
index af138bd..e0b37bd 100644
--- a/user/src/com/google/gwt/place/shared/PlaceHistoryHandler.java
+++ b/user/src/com/google/gwt/place/shared/PlaceHistoryHandler.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.place.shared;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.event.logical.shared.ValueChangeEvent;
 import com.google.gwt.event.logical.shared.ValueChangeHandler;
 import com.google.gwt.event.shared.LegacyHandlerWrapper;
diff --git a/user/src/com/google/gwt/place/shared/PlaceHistoryMapper.java b/user/src/com/google/gwt/place/shared/PlaceHistoryMapper.java
index e40ab48..1f19744 100644
--- a/user/src/com/google/gwt/place/shared/PlaceHistoryMapper.java
+++ b/user/src/com/google/gwt/place/shared/PlaceHistoryMapper.java
@@ -21,7 +21,7 @@
  * <p>
  * You can annotate subinterfaces of PlaceHistoryMapper with
  * {@link WithTokenizers} to have their implementation automatically generated
- * via a call to {@link com.google.gwt.core.client.GWT#create(Class)}.
+ * via a call to {@link com.google.gwt.core.shared.GWT#create(Class)}.
  */
 public interface PlaceHistoryMapper {
 
diff --git a/user/src/com/google/gwt/safecss/shared/SafeStylesHostedModeUtils.java b/user/src/com/google/gwt/safecss/shared/SafeStylesHostedModeUtils.java
index b347aaf..4aaadae 100644
--- a/user/src/com/google/gwt/safecss/shared/SafeStylesHostedModeUtils.java
+++ b/user/src/com/google/gwt/safecss/shared/SafeStylesHostedModeUtils.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.safecss.shared;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.thirdparty.guava.common.base.Preconditions;
 
 import java.util.HashMap;
diff --git a/user/src/com/google/gwt/safecss/shared/SafeStylesUtils.java b/user/src/com/google/gwt/safecss/shared/SafeStylesUtils.java
index 652fb48..80404b3 100644
--- a/user/src/com/google/gwt/safecss/shared/SafeStylesUtils.java
+++ b/user/src/com/google/gwt/safecss/shared/SafeStylesUtils.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.safecss.shared;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.dom.client.Style.BorderStyle;
 import com.google.gwt.dom.client.Style.Clear;
 import com.google.gwt.dom.client.Style.Cursor;
diff --git a/user/src/com/google/gwt/safehtml/shared/SafeHtmlHostedModeUtils.java b/user/src/com/google/gwt/safehtml/shared/SafeHtmlHostedModeUtils.java
index 601504f..04b3def 100644
--- a/user/src/com/google/gwt/safehtml/shared/SafeHtmlHostedModeUtils.java
+++ b/user/src/com/google/gwt/safehtml/shared/SafeHtmlHostedModeUtils.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.safehtml.shared;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.thirdparty.guava.common.base.Preconditions;
 import com.google.gwt.thirdparty.streamhtmlparser.HtmlParser;
 import com.google.gwt.thirdparty.streamhtmlparser.HtmlParserFactory;
diff --git a/user/src/com/google/gwt/safehtml/shared/SafeUriHostedModeUtils.java b/user/src/com/google/gwt/safehtml/shared/SafeUriHostedModeUtils.java
index 0ebb8e3..6b52143 100644
--- a/user/src/com/google/gwt/safehtml/shared/SafeUriHostedModeUtils.java
+++ b/user/src/com/google/gwt/safehtml/shared/SafeUriHostedModeUtils.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.safehtml.shared;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.thirdparty.guava.common.base.Preconditions;
 
 import java.net.URI;
diff --git a/user/src/com/google/gwt/safehtml/shared/UriUtils.java b/user/src/com/google/gwt/safehtml/shared/UriUtils.java
index 896d1d9..9d9f9ed 100644
--- a/user/src/com/google/gwt/safehtml/shared/UriUtils.java
+++ b/user/src/com/google/gwt/safehtml/shared/UriUtils.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.safehtml.shared;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.http.client.URL;
 import com.google.gwt.regexp.shared.RegExp;
 
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
index 6cbc633..706c6ec 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
@@ -134,11 +134,27 @@
       return fieldName;
     }
 
-    int count = getGetterCounter(fieldName) + 1;
-    gettersCounter.put(fieldName, count);
+    incrementFieldCounter(fieldName);
     return getFieldGetter(fieldName);
   }
 
+  /**
+   * Prevent a field from being optimized as only being referenced once (and therefore constant for
+   * all intents). This is necessary for UiRenderer fields passed as parameters to render() calls.
+   * Those fields are modified every time a template is rendered with the parameter values.
+   */
+  public void disableOptimization(String fieldName) {
+    // TODO(rchandia): This hackish method should go away when the
+    // UiRenderer generator gets separated from the one used for
+    // UiBinder. Fields corresponding to parameters of render() will
+    // not use the initialization generated by the FieldWriter.
+
+    // Incrementing the counter twice ensures no optimization happens.
+    // See AbstractFieldWriter#writeFieldDefinition()
+    incrementFieldCounter(fieldName);
+    incrementFieldCounter(fieldName);
+  }
+
   public FieldReference findFieldReference(String expressionIn) {
     String expression = expressionIn;
     if (useLazyWidgetBuilders) {
@@ -392,6 +408,14 @@
     return (count == null) ? 0 : count;
   }
 
+  /**
+   * Increments the number of times a getter for the given field is called.
+   */
+  private void incrementFieldCounter(String fieldName) {
+    int count = getGetterCounter(fieldName) + 1;
+    gettersCounter.put(fieldName, count);
+  }
+
   private FieldWriter registerField(String fieldName, FieldWriter field)
       throws UnableToCompleteException {
     ensureValidity(fieldName);
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
index 9cd10d3..76feb3e 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
@@ -394,7 +394,9 @@
 
     fieldWriter = fieldManager.registerField(
         FieldWriterType.IMPORTED, matchingResourceType.getErasedType(), resourceName);
-    fieldWriter.setInitializer(UiBinderWriter.RENDER_PARAM_HOLDER_PREFIX + resourceName);
+    // Sets initialization as a NOOP. These fields are set from
+    // parameters passed to UiRenderer#render(), instead.
+    fieldWriter.setInitializer(resourceName);
   }
 
   private void createSingleImport(XMLElement elem, JClassType enclosingType,
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
index fd6347c..9935863 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -76,8 +76,6 @@
  */
 public class UiBinderWriter implements Statements {
 
-  static final String RENDER_PARAM_HOLDER_PREFIX = "_renderer_param_holder_";
-
   private static final String SAFE_VAR_PREFIX =
     "somethingUnlikelyToCollideWithParamNamesWefio";
 
@@ -1935,8 +1933,28 @@
     w.newline();
 
     JParameter[] renderParameters = findRenderParameters(baseClass);
+    for (JParameter param : renderParameters) {
+      // Prevent fields from render() parameters from being optimized.
+      fieldManager.disableOptimization(param.getName());
+    }
 
-    writeRenderParameterDefinitions(w, renderParameters);
+    // public UiRendererImplClass() {
+    w.write("public %s() {", implClassName);
+    w.indent();
+    w.write("build_fields();");
+    w.outdent();
+    // }
+    w.write("}");
+    w.newline();
+
+    // private build_fields() {
+    w.write("private void build_fields() {");
+    w.indent();
+    fieldManager.initializeWidgetsInnerClass(w, getOwnerClass());
+    w.outdent();
+    // }
+    w.write("}");
+    w.newline();
 
     String renderParameterDeclarations = renderMethodParameters(renderParameters);
     w.write("public void render(final %s sb%s%s) {", SafeHtmlBuilder.class.getName(),
@@ -1949,7 +1967,7 @@
     w.write("uiId = com.google.gwt.dom.client.Document.get().createUniqueId();");
     w.newline();
 
-    fieldManager.initializeWidgetsInnerClass(w, getOwnerClass());
+    w.write("build_fields();");
     w.newline();
 
     String safeHtml = rootField.getSafeHtml();
@@ -2245,20 +2263,13 @@
     }
   }
 
-  private void writeRenderParameterDefinitions(IndentedWriter w, JParameter[] renderParameters) {
-    for (int i = 0; i < renderParameters.length; i++) {
-      JParameter parameter = renderParameters[i];
-      w.write("private %s %s%s;", parameter.getType().getQualifiedSourceName(),
-          RENDER_PARAM_HOLDER_PREFIX, parameter.getName());
-      w.newline();
-    }
-  }
-
   private void writeRenderParameterInitializers(IndentedWriter w, JParameter[] renderParameters) {
     for (int i = 0; i < renderParameters.length; i++) {
       JParameter parameter = renderParameters[i];
-      w.write("%s%s = %s;", RENDER_PARAM_HOLDER_PREFIX, parameter.getName(), parameter.getName());
-      w.newline();
+      if (fieldManager.lookup(parameter.getName()) != null) {
+        w.write("this.%s = %s;", parameter.getName(), parameter.getName());
+        w.newline();
+      }
     }
   }
 
diff --git a/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java b/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
index d7baff6..d489cae 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
@@ -1863,7 +1863,9 @@
      */
     TableRowElement targetTableRow = targetTableCell.getParentElement().cast();
     String eventType = event.getType();
-    boolean isClick = BrowserEvents.CLICK.equals(eventType);
+    boolean isSelect = BrowserEvents.CLICK.equals(eventType)
+        || (BrowserEvents.KEYDOWN.equals(eventType) && event.getKeyCode() == KeyCodes.KEY_ENTER);
+
     int col = targetTableCell.getCellIndex();
     if (targetTableSection == thead || targetTableSection == tfoot) {
       boolean isHeader = (targetTableSection == thead);
@@ -1886,7 +1888,7 @@
             header.onBrowserEvent(context, headerParent, event);
           }
 
-          if (isClick) {
+          if (isSelect) {
             // Preview the event, and possibily disable the column sort event. The event preview is
             // forced even if the header cell does not consume click event
             shouldSortColumn = header.onPreviewColumnSortEvent(context, headerParent, event);
@@ -1895,7 +1897,7 @@
       }
 
       // Sort the header.
-      if (isClick && shouldSortColumn && columnParent != null) {
+      if (isSelect && shouldSortColumn && columnParent != null) {
         Column<T, ?> column =
             isHeader ? headerBuilder.getColumn(columnParent) : footerBuilder
                 .getColumn(columnParent);
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTree.java b/user/src/com/google/gwt/user/cellview/client/CellTree.java
index 751b8ab..4847ee6 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTree.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellTree.java
@@ -26,6 +26,8 @@
 import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.event.dom.client.KeyCodes;
 import com.google.gwt.i18n.client.LocaleInfo;
+import com.google.gwt.i18n.client.LocalizableResource.DefaultLocale;
+import com.google.gwt.i18n.client.Messages;
 import com.google.gwt.resources.client.ClientBundle;
 import com.google.gwt.resources.client.CssResource;
 import com.google.gwt.resources.client.CssResource.ImportedWithPrefix;
@@ -43,6 +45,7 @@
 import com.google.gwt.user.client.ui.HasAnimation;
 import com.google.gwt.user.client.ui.SimplePanel;
 import com.google.gwt.view.client.TreeViewModel;
+import com.google.gwt.aria.client.Roles;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -92,6 +95,17 @@
   }
 
   /**
+   * Constants for labeling the cell tree. Provides just English messages by default.
+   */
+  @DefaultLocale("en_US")
+  public interface CellTreeMessages extends Messages {
+    @DefaultMessage("Show more")
+    String showMore();
+    @DefaultMessage("Empty")
+    String emptyTree();
+  }
+
+  /**
    * A node animation.
    */
   public abstract static class NodeAnimation extends Animation {
@@ -555,7 +569,8 @@
   }
 
   /**
-   * Construct a new {@link CellTree}.
+   * Construct a new {@link CellTree}. Uses default translations that means
+   * that messages will be always in English.
    *
    * @param <T> the type of data in the root node
    * @param viewModel the {@link TreeViewModel} that backs the tree
@@ -563,7 +578,44 @@
    * @param resources the resources used to render the tree
    */
   public <T> CellTree(TreeViewModel viewModel, T rootValue, Resources resources) {
+    this(viewModel, rootValue, resources,
+        GWT.<CellTreeMessages>create(CellTreeMessages.class));
+  }
+
+  /**
+   * Construct a new {@link CellTree}.
+   *
+   * @param <T> the type of data in the root node
+   * @param viewModel the {@link TreeViewModel} that backs the tree
+   * @param rootValue the hidden root value of the tree
+   * @param resources the resources used to render the tree
+   * @param messages translation messages. Users should inherit an empty interface from
+   *                 {@link CellTreeMessages} and add annotations needed for their specific
+   *                 translation systems. Then create the new interface with GWT.create and pass
+   *                 as this argument.
+   */
+  public <T> CellTree(TreeViewModel viewModel, T rootValue, Resources resources,
+      CellTreeMessages messages) {
+    this(viewModel, rootValue, resources, messages, DEFAULT_LIST_SIZE);
+  }
+
+  /**
+   * Construct a new {@link CellTree}.
+   *
+   * @param <T> the type of data in the root node
+   * @param viewModel the {@link TreeViewModel} that backs the tree
+   * @param rootValue the hidden root value of the tree
+   * @param resources the resources used to render the tree
+   * @param messages translation messages. Users should inherit an empty interface from
+   *                 {@link CellTreeMessages} and add annotations needed for their specific
+   *                 translation systems. Then create the new interface with GWT.create and pass
+   *                 as this argument.
+   * @param defaultNodeSize default number of children to display beneath each child node
+   */
+  public <T> CellTree(TreeViewModel viewModel, T rootValue, Resources resources,
+      CellTreeMessages messages, int defaultNodeSize) {
     super(viewModel);
+    this.defaultNodeSize = defaultNodeSize;
     if (template == null) {
       template = GWT.create(Template.class);
     }
@@ -599,9 +651,11 @@
 
     // Associate a view with the item.
     CellTreeNodeView<T> root = new CellTreeNodeView<T>(this, null, null,
-        getElement(), rootValue);
+        getElement(), rootValue, messages);
     keyboardSelectedNode = rootNode = root;
     root.setOpen(true, false);
+
+    Roles.getTreeRole().set(getElement());
   }
 
   /**
@@ -686,7 +740,7 @@
     if (nodeView != null) {
       if (isMouseDown) {
         Element showMoreElem = nodeView.getShowMoreElement();
-        if (nodeView.getImageElement().isOrHasChild(target)) {
+        if (!nodeView.isRootNode() && nodeView.getImageElement().isOrHasChild(target)) {
           // Open the node when the open image is clicked.
           nodeView.setOpen(!nodeView.isOpen(), true);
           return;
@@ -753,7 +807,7 @@
    * Set the default number of children to display beneath each child node. If
    * more nodes are available, a button will appear at the end of the list
    * allowing the user to show more items. Changing this value will not affect
-   * tree nodes that are already open.
+   * other tree nodes that are already open (including the hidden root node).
    *
    * @param defaultNodeSize the max
    * @see #getDefaultNodeSize()
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java b/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
index 1fdba7b..95d8573 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.user.cellview.client;
 
+import com.google.gwt.aria.client.Roles;
 import com.google.gwt.cell.client.Cell;
 import com.google.gwt.cell.client.Cell.Context;
 import com.google.gwt.core.client.GWT;
@@ -40,6 +41,7 @@
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.safehtml.shared.SafeHtmlUtils;
+import com.google.gwt.user.cellview.client.CellTree.CellTreeMessages;
 import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
 import com.google.gwt.user.cellview.client.LoadingStateChangeEvent.LoadingState;
 import com.google.gwt.user.client.ui.UIObject;
@@ -54,6 +56,7 @@
 import com.google.gwt.view.client.SelectionModel;
 import com.google.gwt.view.client.TreeViewModel;
 import com.google.gwt.view.client.TreeViewModel.NodeInfo;
+import com.google.gwt.aria.client.ExpandedValue;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -76,10 +79,10 @@
     SafeHtml innerDiv(SafeStyles cssString, String classes, SafeHtml image, String itemValueStyle,
         SafeHtml cellContents);
 
-    @Template("<div><div style=\"{0}\" class=\"{1}\">{2}</div></div>")
-    SafeHtml outerDiv(SafeStyles cssString, String classes, SafeHtml content);
+    @Template("<div aria-selected=\"{3}\">"
+        + "<div style=\"{0}\" class=\"{1}\">{2}</div></div>")
+    SafeHtml outerDiv(SafeStyles cssString, String classes, SafeHtml content, String ariaSelected);
   }
-
   /**
    * The {@link com.google.gwt.view.client.HasData} used to show children. This
    * class is intentionally static because we might move it to a new
@@ -152,7 +155,9 @@
           if (isRootNode) {
             outerClasses.append(topStyle);
           }
-          if (selectionModel != null && selectionModel.isSelected(value)) {
+          boolean isSelected = (selectionModel != null && selectionModel.isSelected(value));
+          String ariaSelected = String.valueOf(isSelected);
+          if (isSelected) {
             outerClasses.append(selectedStyle);
           }
 
@@ -181,11 +186,11 @@
           SafeHtml innerDiv =
               template.innerDiv(innerPadding, innerClasses.toString(), image, itemValueStyle,
                   cellBuilder.toSafeHtml());
-
           SafeStyles outerPadding =
               SafeStylesUtils.fromTrustedString("padding-" + paddingDirection + ": "
                   + paddingAmount + "px;");
-          sb.append(template.outerDiv(outerPadding, outerClasses.toString(), innerDiv));
+          sb.append(template.outerDiv(outerPadding, outerClasses.toString(), innerDiv,
+              ariaSelected));
         }
       }
 
@@ -281,6 +286,7 @@
         int len = values.size();
         int end = start + len;
         int childCount = nodeView.getChildCount();
+        int setSize = (childCount > len) ? childCount : end;
         ProvidesKey<C> keyProvider = nodeInfo.getProvidesKey();
 
         Element container = nodeView.ensureChildContainer();
@@ -343,6 +349,7 @@
           } else {
             nodeView.children.add(child);
           }
+          child.updateAriaAttributes(setSize);
           childElem = childElem.getNextSiblingElement();
         }
 
@@ -794,6 +801,11 @@
   private boolean isDestroyed;
 
   /**
+   * Messages used for translation.
+   */
+  private final CellTreeMessages messages;
+
+  /**
    * The info about children of this node.
    */
   private NodeInfo<?> nodeInfo;
@@ -842,21 +854,25 @@
 
   /**
    * Construct a {@link CellTreeNodeView}.
-   * 
+   *
    * @param tree the parent {@link CellTreeNodeView}
    * @param parent the parent {@link CellTreeNodeView}
    * @param parentNodeInfo the {@link NodeInfo} of the parent
    * @param elem the outer element of this {@link CellTreeNodeView}
    * @param value the value of this node
+   * @param messages tranlation messages
    */
   CellTreeNodeView(final CellTree tree, final CellTreeNodeView<?> parent,
-      NodeInfo<T> parentNodeInfo, Element elem, T value) {
+      NodeInfo<T> parentNodeInfo, Element elem, T value, CellTreeMessages messages) {
     this.tree = tree;
     this.parentNode = parent;
     this.parentNodeInfo = parentNodeInfo;
     this.depth = parentNode == null ? 0 : parentNode.depth + 1;
     this.value = value;
+    this.messages = messages;
     setElement(elem);
+
+    Roles.getTreeitemRole().set(getElement());
   }
 
   public int getChildCount() {
@@ -1024,7 +1040,7 @@
    */
   protected <C> CellTreeNodeView<C> createTreeNodeView(NodeInfo<C> nodeInfo, Element childElem,
       C childValue, Object viewData) {
-    return new CellTreeNodeView<C>(tree, this, nodeInfo, childElem, childValue);
+    return new CellTreeNodeView<C>(tree, this, nodeInfo, childElem, childValue, messages);
   }
 
   /**
@@ -1161,16 +1177,15 @@
       contentContainer = Document.get().createDivElement();
       ensureAnimationFrame().appendChild(contentContainer);
 
-      // TODO(jlabanca): I18N no data string.
       emptyMessageElem = Document.get().createDivElement();
-      emptyMessageElem.setInnerHTML("no data");
+      emptyMessageElem.setInnerHTML(messages.emptyTree());
       setStyleName(emptyMessageElem, tree.getStyle().cellTreeEmptyMessage(), true);
       showOrHide(emptyMessageElem, false);
       contentContainer.appendChild(emptyMessageElem);
 
       showMoreElem = Document.get().createAnchorElement();
       showMoreElem.setHref("javascript:;");
-      showMoreElem.setInnerText("Show more");
+      showMoreElem.setInnerText(messages.showMore());
       setStyleName(showMoreElem, tree.getStyle().cellTreeShowMoreButton(), true);
       showOrHide(showMoreElem, false);
       contentContainer.appendChild(showMoreElem);
@@ -1338,6 +1353,26 @@
     listView.setVisibleRange(range.getStart(), pageSize);
   }
 
+  private void updateAriaAttributes(int setSize) {
+    // Early out if this is a root node.
+    if (isRootNode()) {
+      return;
+    }
+
+    Roles.getTreeitemRole().setAriaSetsizeProperty(getElement(), setSize);
+    int selectionIndex = parentNode.indexOf(this);
+    Roles.getTreeitemRole().setAriaPosinsetProperty(getElement(), selectionIndex + 1);
+    // Set 'aria-expanded' state
+    // don't set aria-expanded on the leaf nodes
+    if (isLeaf()) {
+      Roles.getTreeitemRole().removeAriaExpandedState(getElement());
+    } else {
+      Roles.getTreeitemRole().setAriaExpandedState(getElement(),
+          ExpandedValue.of(open));
+    }
+    Roles.getTreeitemRole().setAriaLevelProperty(getElement(), this.depth);
+  }
+
   /**
    * Update the image based on the current state.
    * 
@@ -1364,5 +1399,14 @@
 
     Element oldImg = getImageElement();
     oldImg.getParentElement().replaceChild(imageElem, oldImg);
+
+    // Set 'aria-expanded' state
+    // don't set aria-expanded on the leaf nodes
+    if (isLeaf()) {
+      Roles.getTreeitemRole().removeAriaExpandedState(getElement());
+    } else {
+      Roles.getTreeitemRole().setAriaExpandedState(getElement(),
+          ExpandedValue.of(open));
+    }
   }
 }
diff --git a/user/src/com/google/gwt/user/cellview/client/DefaultHeaderOrFooterBuilder.java b/user/src/com/google/gwt/user/cellview/client/DefaultHeaderOrFooterBuilder.java
index 0c664ea..a348508 100644
--- a/user/src/com/google/gwt/user/cellview/client/DefaultHeaderOrFooterBuilder.java
+++ b/user/src/com/google/gwt/user/cellview/client/DefaultHeaderOrFooterBuilder.java
@@ -111,6 +111,12 @@
         if (prevHeader != null) {
           // Build the header.
           Context context = new Context(0, curColumn - prevColspan, prevHeader.getKey());
+          // Add div element with aria button role
+          if (isSortable) {
+            // TODO: Figure out aria-label and translation of label text
+            th.attribute("role", "button");
+            th.tabIndex(-1);
+          }
           renderSortableHeader(th, context, prevHeader, isSorted, isSortAscending);
         }
         th.endTH();
diff --git a/user/src/com/google/gwt/user/client/ui/MenuBar.java b/user/src/com/google/gwt/user/client/ui/MenuBar.java
index 949b358..0cb43d4 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuBar.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuBar.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.user.client.ui;
 
-import com.google.gwt.aria.client.IdReference;
+import com.google.gwt.aria.client.Id;
 import com.google.gwt.aria.client.Roles;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.Scheduler;
@@ -762,7 +762,7 @@
       }
 
       Roles.getMenubarRole().setAriaActivedescendantProperty(getElement(),
-          IdReference.of(DOM.getElementAttribute(item.getElement(), "id")));
+          Id.of(item.getElement()));
     }
 
     selectedItem = item;
diff --git a/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java b/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java
index a328ac6..e2584c4 100644
--- a/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java
+++ b/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java
@@ -22,6 +22,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -153,6 +154,11 @@
 
   private Response defaultResponse;
 
+  /*
+   * Comparator used for sorting candidates from search.
+   */
+  private Comparator<String> comparator = null;
+
   /**
    * Constructor for <code>MultiWordSuggestOracle</code>. This uses a space as
    * the whitespace character.
@@ -266,6 +272,15 @@
   }
 
   /**
+   * Sets the comparator used for sorting candidates from search.
+   *
+   * @param comparator the comparator to use.
+   */
+  public void setComparator(Comparator<String> comparator) {
+    this.comparator = comparator;
+  }
+
+  /**
    * Sets the default suggestion collection.
    *
    * @param suggestionList the default list of suggestions
@@ -398,7 +413,7 @@
     }
     if (candidateSet != null) {
       candidates.addAll(candidateSet);
-      Collections.sort(candidates);
+      Collections.sort(candidates, comparator);
     }
     return candidates;
   }
diff --git a/user/src/com/google/gwt/user/client/ui/PopupPanel.java b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
index 8460eb4..2434496 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
@@ -1375,6 +1375,7 @@
       }
 
       case Event.ONMOUSEDOWN:
+      case Event.ONTOUCHSTART:
         // Don't eat events if event capture is enabled, as this can
         // interfere with dialog dragging, for example.
         if (DOM.getCaptureElement() != null) {
@@ -1390,7 +1391,8 @@
       case Event.ONMOUSEUP:
       case Event.ONMOUSEMOVE:
       case Event.ONCLICK:
-      case Event.ONDBLCLICK: {
+      case Event.ONDBLCLICK:
+      case Event.ONTOUCHEND: {
         // Don't eat events if event capture is enabled, as this can
         // interfere with dialog dragging, for example.
         if (DOM.getCaptureElement() != null) {
diff --git a/user/src/com/google/gwt/user/client/ui/SuggestBox.java b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
index 58f7d9f..650372a 100644
--- a/user/src/com/google/gwt/user/client/ui/SuggestBox.java
+++ b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
@@ -97,11 +97,9 @@
  * <dd>the suggest box itself</dd>
  * </dl>
  *
- * TODO(pdr): Add SafeHtml support to this and implementing classes.
- *
  * @see SuggestOracle
  * @see MultiWordSuggestOracle
- * @see TextBoxBase
+ * @see ValueBoxBase
  */
 @SuppressWarnings("deprecation")
 public class SuggestBox extends Composite implements HasText, HasFocus,
@@ -666,7 +664,7 @@
   private String currentText;
   private LeafValueEditor<String> editor;
   private final SuggestionDisplay display;
-  private final TextBoxBase box;
+  private final ValueBoxBase<String> box;
   private final Callback callback = new Callback() {
     public void onSuggestionsReady(Request request, Response response) {
       // If disabled while request was in-flight, drop it
@@ -713,7 +711,7 @@
    *          text widget
    * @param box the text widget
    */
-  public SuggestBox(SuggestOracle oracle, TextBoxBase box) {
+  public SuggestBox(SuggestOracle oracle, ValueBoxBase<String> box) {
     this(oracle, box, new DefaultSuggestionDisplay());
   }
 
@@ -726,7 +724,7 @@
    * @param box the text widget
    * @param suggestDisplay the class used to display suggestions
    */
-  public SuggestBox(SuggestOracle oracle, TextBoxBase box,
+  public SuggestBox(SuggestOracle oracle, ValueBoxBase<String> box,
       SuggestionDisplay suggestDisplay) {
     this.box = box;
     this.display = suggestDisplay;
@@ -873,9 +871,13 @@
    * Get the text box associated with this suggest box.
    *
    * @return this suggest box's text box
+   * @throws ClassCastException if this suggest box's value box is not an
+   *     instance of TextBoxBase
+   * @deprecated in favour of getValueBox
    */
+  @Deprecated
   public TextBoxBase getTextBox() {
-    return box;
+    return (TextBoxBase) box;
   }
 
   public String getValue() {
@@ -883,6 +885,15 @@
   }
 
   /**
+   * Get the ValueBoxBase associated with this suggest box.
+   *
+   * @return this suggest box's value box
+   */
+  public ValueBoxBase<String> getValueBox() {
+    return box;
+  }
+
+  /**
    * Hide current suggestions in the {@link DefaultSuggestionDisplay}. Note that
    * this method is a no-op unless the {@link DefaultSuggestionDisplay} is used.
    *
diff --git a/user/src/com/google/gwt/user/client/ui/Tree.java b/user/src/com/google/gwt/user/client/ui/Tree.java
index bb95982..a83796c 100644
--- a/user/src/com/google/gwt/user/client/ui/Tree.java
+++ b/user/src/com/google/gwt/user/client/ui/Tree.java
@@ -15,8 +15,8 @@
  */
 package com.google.gwt.user.client.ui;
 
-import com.google.gwt.aria.client.IdReference;
 import com.google.gwt.aria.client.ExpandedValue;
+import com.google.gwt.aria.client.Id;
 import com.google.gwt.aria.client.Roles;
 import com.google.gwt.aria.client.SelectedValue;
 import com.google.gwt.core.client.GWT;
@@ -1428,7 +1428,7 @@
     // Update the 'aria-activedescendant' state for the focusable element to
     // match the id of the currently selected item
 
-    Roles.getTreeRole().setAriaActivedescendantProperty(focusable,
-        IdReference.of(DOM.getElementAttribute(curSelectionContentElem, "id")));
+    Roles.getTreeRole().setAriaActivedescendantProperty(focusable, Id.of(
+        curSelectionContentElem));
   }
 }
diff --git a/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java b/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java
index d1cd4b7..85da019 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java
@@ -37,6 +37,12 @@
  */
 public class ClippedImageImpl {
 
+  interface DraggableTemplate extends SafeHtmlTemplates {
+    @SafeHtmlTemplates.Template("<img onload='this.__gwtLastUnhandledEvent=\"load\";' src='{0}' "
+        + "style='{1}' border='0' draggable='true'>")
+    SafeHtml image(SafeUri clearImage, SafeStyles style);
+  }
+
   interface Template extends SafeHtmlTemplates {
     @SafeHtmlTemplates.Template("<img onload='this.__gwtLastUnhandledEvent=\"load\";' src='{0}' "
         + "style='{1}' border='0'>")
@@ -46,6 +52,7 @@
   protected static final SafeUri clearImage =
     UriUtils.fromTrustedString(GWT.getModuleBaseURL() + "clear.cache.gif");
   private static Template template;
+  private static DraggableTemplate draggableTemplate;
 
   public void adjust(Element img, SafeUri url, int left, int top, int width, int height) {
     String style = "url(\"" + url.asString() + "\") no-repeat " + (-left + "px ") + (-top + "px");
@@ -65,12 +72,30 @@
   }
 
   public SafeHtml getSafeHtml(SafeUri url, int left, int top, int width, int height) {
+    return getSafeHtml(url, left, top, width, height, false);
+  }
+
+  public SafeHtml getSafeHtml(SafeUri url, int left, int top, int width, int height,
+      boolean isDraggable) {
     SafeStylesBuilder builder = new SafeStylesBuilder();
     builder.width(width, Unit.PX).height(height, Unit.PX).trustedNameAndValue("background",
         "url(" + url.asString() + ") " + "no-repeat " + (-left + "px ") + (-top + "px"));
 
-    return getTemplate().image(clearImage,
+    if (!isDraggable) {
+      return getTemplate().image(clearImage,
         SafeStylesUtils.fromTrustedString(builder.toSafeStyles().asString()));
+    } else {
+      return getDraggableTemplate().image(clearImage,
+          SafeStylesUtils.fromTrustedString(builder.toSafeStyles().asString()));
+    }
+  }
+
+  private DraggableTemplate getDraggableTemplate() {
+    // no need to synchronize, JavaScript in the browser is single-threaded
+    if (draggableTemplate == null) {
+      draggableTemplate = GWT.create(DraggableTemplate.class);
+    }
+    return draggableTemplate;
   }
 
   private Template getTemplate() {
diff --git a/user/src/com/google/gwt/user/client/ui/impl/ClippedImagePrototype.java b/user/src/com/google/gwt/user/client/ui/impl/ClippedImagePrototype.java
index 0b9b63c..ee5874a 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/ClippedImagePrototype.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/ClippedImagePrototype.java
@@ -36,6 +36,7 @@
   private int top = 0;
   private SafeUri url = null;
   private int width = 0;
+  private boolean isDraggable = false;
 
   public ClippedImagePrototype(SafeUri url, int left, int top, int width, int height) {
     this.url = url;
@@ -72,6 +73,10 @@
 
   @Override
   public SafeHtml getSafeHtml() {
-    return impl.getSafeHtml(url, left, top, width, height);
+    return impl.getSafeHtml(url, left, top, width, height, isDraggable);
+  }
+
+  public void setDraggable(boolean isDraggable) {
+    this.isDraggable = isDraggable;
   }
 }
diff --git a/user/src/com/google/gwt/user/client/ui/impl/FocusImplStandard.java b/user/src/com/google/gwt/user/client/ui/impl/FocusImplStandard.java
index 74ca355..be1d0b4 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/FocusImplStandard.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/FocusImplStandard.java
@@ -42,6 +42,7 @@
     var input = $doc.createElement('input');
     input.type = 'text';
     input.tabIndex = -1;
+    input.setAttribute('role', 'presentation');
     var style = input.style;
     style.opacity = 0;
     style.height = '1px';
diff --git a/user/src/com/google/gwt/user/datepicker/client/CalendarView.java b/user/src/com/google/gwt/user/datepicker/client/CalendarView.java
index bb168b3..941361d 100644
--- a/user/src/com/google/gwt/user/datepicker/client/CalendarView.java
+++ b/user/src/com/google/gwt/user/datepicker/client/CalendarView.java
@@ -72,6 +72,15 @@
   public abstract void removeStyleFromDate(String styleName, Date date);
 
   /**
+   * Sets aria-selected in the given date's cell and clears the other cells.
+   *
+   * @param date the date of the cell where aria-selected should be set,
+   * or null to clear aria-selected.
+   */
+  public void setAriaSelectedCell(Date date) {
+  }
+
+  /**
    * Enables or Disables a particular date. by default all valid dates are
    * enabled after a rendering event. Disabled dates cannot be selected.
    * 
@@ -88,4 +97,4 @@
   protected final void setHighlightedDate(Date date) {
     getDatePicker().setHighlightedDate(date);
   }
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/gwt/user/datepicker/client/CellGridImpl.java b/user/src/com/google/gwt/user/datepicker/client/CellGridImpl.java
index 77ce3b0..2e17692 100644
--- a/user/src/com/google/gwt/user/datepicker/client/CellGridImpl.java
+++ b/user/src/com/google/gwt/user/datepicker/client/CellGridImpl.java
@@ -16,14 +16,18 @@
 
 package com.google.gwt.user.datepicker.client;
 
+import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.event.dom.client.KeyDownEvent;
+import com.google.gwt.event.dom.client.KeyDownHandler;
 import com.google.gwt.event.dom.client.KeyCodes;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.impl.ElementMapperImpl;
 import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.UIObject;
+import com.google.gwt.user.client.ui.Widget;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -36,28 +40,43 @@
  */
 abstract class CellGridImpl<V> extends Grid {
 
-  /**
-   * Cell type.
-   */
-  public abstract class Cell extends UIObject {
+  abstract class Cell extends Widget {
     private boolean enabled = true;
     private V value;
     private int index;
 
-    /**
-     * Create a cell grid.
-     * 
-     * @param elem the wrapped element
-     * @param value the value
-     */
-    public Cell(Element elem, V value) {
-      this.value = value;
-      Cell current = this;
-      index = cellList.size();
-      cellList.add(current);
+    Cell(V value) {
+      this(Document.get().createDivElement(), value);
+    }
 
-      setElement(elem);
-      elementToCell.put(current);
+    Cell(Element elem, V value) {
+      this.value = value;
+      index = cellList.size();
+      cellList.add(this);
+
+      if (elem != null) {
+        setElement(elem);
+      }
+
+      elementToCell.put(this);
+      addDomHandler(new KeyDownHandler() {
+        @Override
+        public void onKeyDown(KeyDownEvent event) {
+          if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER ||
+             event.getNativeKeyCode() == ' ') {
+            if (isActive(Cell.this)) {
+              setSelected(Cell.this);
+            }
+          }
+        }
+      }, KeyDownEvent.getType());
+
+      addDomHandler(new ClickHandler() {
+          @Override
+          public void onClick(ClickEvent event) {
+            setSelected(Cell.this);
+          }
+        }, ClickEvent.getType());
     }
 
     public V getValue() {
@@ -261,20 +280,6 @@
     onSelected(last, selectedCell);
   }
 
-  protected void onKeyDown(Cell lastHighlighted, KeyDownEvent event) {
-    if (event.isAnyModifierKeyDown()) {
-      return;
-    }
-    int keyCode = event.getNativeKeyCode();
-    if (lastHighlighted == null) {
-      if (keyCode == KeyCodes.KEY_DOWN && cellList.size() > 0) {
-        setHighlighted(cellList.get(0));
-      }
-    } else {
-      lastHighlighted.verticalNavigation(keyCode);
-    }
-  }
-
   protected abstract void onSelected(Cell lastSelected, Cell cell);
 
   private boolean isActive(Cell cell) {
diff --git a/user/src/com/google/gwt/user/datepicker/client/DateBox.java b/user/src/com/google/gwt/user/datepicker/client/DateBox.java
index fd45d72..8cd8fd4 100644
--- a/user/src/com/google/gwt/user/datepicker/client/DateBox.java
+++ b/user/src/com/google/gwt/user/datepicker/client/DateBox.java
@@ -38,6 +38,7 @@
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.i18n.client.DateTimeFormat;
 import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HasEnabled;
 import com.google.gwt.user.client.ui.HasValue;
 import com.google.gwt.user.client.ui.PopupPanel;
 import com.google.gwt.user.client.ui.TextBox;
@@ -65,7 +66,7 @@
  * {@example com.google.gwt.examples.DateBoxExample}
  * </p>
  */
-public class DateBox extends Composite implements HasValue<Date>,
+public class DateBox extends Composite implements HasEnabled, HasValue<Date>,
     IsEditor<LeafValueEditor<Date>> {
   /**
    * Default {@link DateBox.Format} class. The date is first parsed using the
@@ -387,6 +388,13 @@
   }
 
   /**
+   * Returns true if the date box is enabled, false if not.
+   */
+  public boolean isEnabled() {
+    return box.isEnabled();
+  }
+
+  /**
    * Sets the date box's 'access key'. This key is used (in conjunction with a
    * browser-specific modifier key) to automatically focus the widget.
    *
diff --git a/user/src/com/google/gwt/user/datepicker/client/DatePicker.java b/user/src/com/google/gwt/user/datepicker/client/DatePicker.java
index 439875a..4fe8e68 100644
--- a/user/src/com/google/gwt/user/datepicker/client/DatePicker.java
+++ b/user/src/com/google/gwt/user/datepicker/client/DatePicker.java
@@ -595,6 +595,8 @@
     if (value != null) {
       addStyleToDates(css().dayIsValue(), value);
     }
+    getView().setAriaSelectedCell(newValue);
+
     if (fireEvents) {
       DateChangeEvent.fireIfNotEqualDates(this, oldValue, newValue);
     }
@@ -639,6 +641,7 @@
     if (isAttached()) {
       ShowRangeEvent.fire(this, getFirstDate(), getLastDate());
     }
+    getView().setAriaSelectedCell(value);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java b/user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java
index 1f72e65..a28da02 100644
--- a/user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java
+++ b/user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java
@@ -15,8 +15,9 @@
  */
 package com.google.gwt.user.datepicker.client;
 
+import com.google.gwt.aria.client.Roles;
+import com.google.gwt.aria.client.SelectedValue;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
 import com.google.gwt.user.datepicker.client.DefaultCalendarView.CellGrid.DateCell;
 
@@ -42,12 +43,15 @@
       private String cellStyle;
       private String dateStyle;
 
-      DateCell(Element td, boolean isWeekend) {
-        super(td, new Date());
+      DateCell(boolean isWeekend) {
+        super(new Date());
         cellStyle = css().day();
+
         if (isWeekend) {
           cellStyle += " " + css().dayIsWeekend();
         }
+        getElement().setTabIndex(isFiller() ? -1 : 0);
+        setAriaSelected(false);
       }
 
       @Override
@@ -85,28 +89,13 @@
         updateStyle();
       }
 
-      public void update(Date current) {
-        setEnabled(true);
-        getValue().setTime(current.getTime());
-        String value = getModel().formatDayOfMonth(getValue());
-        setText(value);
-        dateStyle = cellStyle;
-        if (isFiller()) {
-          dateStyle += " " + css().dayIsFiller();
-        } else {
-          String extraStyle = getDatePicker().getStyleOfDate(current);
-          if (extraStyle != null) {
-            dateStyle += " " + extraStyle;
-          }
-        }
-        // We want to certify that all date styles have " " before and after
-        // them for ease of adding to and replacing them.
-        dateStyle += " ";
-        updateStyle();
+      public void setAriaSelected(boolean value) {
+        Roles.getGridcellRole().setAriaSelectedState(getElement(), SelectedValue.of(value));
       }
 
       @Override
       public void updateStyle() {
+
         String accum = dateStyle;
 
         if (isHighlighted()) {
@@ -122,6 +111,28 @@
         setStyleName(accum);
       }
 
+      void update(Date current) {
+        setEnabled(true);
+        getValue().setTime(current.getTime());
+        String value = getModel().formatDayOfMonth(getValue());
+        setText(value);
+        dateStyle = cellStyle;
+        if (isFiller()) {
+          getElement().setTabIndex(-1);
+          dateStyle += " " + css().dayIsFiller();
+        } else {
+          getElement().setTabIndex(0);
+          String extraStyle = getDatePicker().getStyleOfDate(current);
+          if (extraStyle != null) {
+            dateStyle += " " + extraStyle;
+          }
+        }
+        // We want to certify that all date styles have " " before and after
+        // them for ease of adding to and replacing them.
+        dateStyle += " ";
+        updateStyle();
+      }
+
       private void setText(String value) {
         DOM.setInnerText(getElement(), value);
       }
@@ -142,6 +153,8 @@
 
   private Date lastDisplayed = new Date();
 
+  private DateCell ariaSelectedCell;
+
   /**
    * Constructor.
    */
@@ -189,6 +202,7 @@
       DateCell cell = (DateCell) grid.getCell(i);
       cell.update(lastDisplayed);
     }
+    setAriaSelectedCell(null);
   }
 
   @Override
@@ -197,6 +211,18 @@
   }
 
   @Override
+  public void setAriaSelectedCell(Date date) {
+    if (ariaSelectedCell != null) {
+      ariaSelectedCell.setAriaSelected(false);
+    }
+    DateCell newSelectedCell = date != null ? getCell(date) : null;
+    if (newSelectedCell != null) {
+      newSelectedCell.setAriaSelected(true);
+    }
+    ariaSelectedCell = newSelectedCell;
+  }
+
+  @Override
   public void setEnabledOnDate(boolean enabled, Date date) {
     getCell(date).setEnabled(enabled);
   }
@@ -230,10 +256,9 @@
     // Set up the calendar grid.
     for (int row = 1; row <= CalendarModel.WEEKS_IN_MONTH; row++) {
       for (int column = 0; column < CalendarModel.DAYS_IN_WEEK; column++) {
-        // set up formatter.
-        Element e = formatter.getElement(row, column);
-        grid.new DateCell(e, column == weekendStartColumn
+        DateCell cell = grid.new DateCell(column == weekendStartColumn
             || column == weekendEndColumn);
+        grid.setWidget(row, column, cell);
       }
     }
     initWidget(grid);
@@ -242,7 +267,9 @@
 
   private DateCell getCell(Date d) {
     int index = CalendarUtil.getDaysBetween(firstDisplayed, d);
-    assert (index >= 0);
+    if (index < 0 || grid.getNumCells() <= index) {
+      return null;
+    }
 
     DateCell cell = (DateCell) grid.getCell(index);
     if (cell.getValue().getDate() != d.getDate()) {
diff --git a/user/src/com/google/gwt/user/datepicker/client/DefaultMonthSelector.java b/user/src/com/google/gwt/user/datepicker/client/DefaultMonthSelector.java
index 388707f..cdbe9e9 100644
--- a/user/src/com/google/gwt/user/datepicker/client/DefaultMonthSelector.java
+++ b/user/src/com/google/gwt/user/datepicker/client/DefaultMonthSelector.java
@@ -16,6 +16,7 @@
 
 package com.google.gwt.user.datepicker.client;
 
+import com.google.gwt.dom.client.Element;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.user.client.ui.Grid;
@@ -38,7 +39,21 @@
    */
   public DefaultMonthSelector() {
   }
- 
+
+  /**
+   * Returns the button for moving to the previous month.
+   */
+  public Element getBackwardButtonElement() {
+    return backwards.getElement();
+  }
+
+  /**
+   * Returns the button for moving to the next month.
+   */
+  public Element getForwardButtonElement() {
+    return forwards.getElement();
+  }
+
   @Override
   protected void refresh() {
     String formattedMonth = getModel().formatCurrentMonth();
@@ -80,5 +95,4 @@
     grid.setStyleName(css().monthSelector());
     initWidget(grid);
   }
-
 }
diff --git a/user/src/com/google/gwt/user/tools/templates/sample/_warFolder_/favicon.icobin b/user/src/com/google/gwt/user/tools/templates/sample/_warFolder_/favicon.icobin
new file mode 100644
index 0000000..858a707
--- /dev/null
+++ b/user/src/com/google/gwt/user/tools/templates/sample/_warFolder_/favicon.icobin
Binary files differ
diff --git a/user/src/com/google/gwt/validation/Validation.gwt.xml b/user/src/com/google/gwt/validation/Validation.gwt.xml
index 9bfb54d..8c29199 100644
--- a/user/src/com/google/gwt/validation/Validation.gwt.xml
+++ b/user/src/com/google/gwt/validation/Validation.gwt.xml
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN"
-  "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
@@ -31,10 +29,6 @@
     class="com.google.gwt.validation.client.GwtMessageInterpolator">
     <when-type-is class="javax.validation.MessageInterpolator" />
   </replace-with>
-  <replace-with
-    class="com.google.gwt.validation.client.GwtTraversableResolver">
-    <when-type-is class="javax.validation.TraversableResolver" />
-  </replace-with>
 
   <replace-with
     class="com.google.gwt.validation.client.GwtValidationProviderResolver">
@@ -49,13 +43,12 @@
     <when-type-is class="javax.validation.spi.ValidationProvider" />
   </replace-with>
 
-  <!-- Generators -->
+  <!-- Generator -->
   <generate-with class="com.google.gwt.validation.rebind.ValidatorGenerator">
-    <when-type-assignable class="javax.validation.Validator" />
-  </generate-with>
-  <generate-with
-    class="com.google.gwt.validation.rebind.GwtSpecificValidatorGenerator">
-    <when-type-assignable
-      class="com.google.gwt.validation.client.impl.GwtSpecificValidator" />
+    <any>
+      <when-type-assignable class="javax.validation.Validator" />
+      <when-type-assignable
+        class="com.google.gwt.validation.client.impl.GwtSpecificValidator" />
+    </any>
   </generate-with>
 </module>
diff --git a/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java b/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java
index dfde7da..107c3df 100644
--- a/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java
+++ b/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java
@@ -28,9 +28,6 @@
 import javax.validation.spi.ConfigurationState;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Abstract {@link ValidatorFactory} that delegates to a GWT generated
  * {@link Validator}.
  * <p>
@@ -104,16 +101,20 @@
         GWT.<ConstraintValidatorFactory>create(ConstraintValidatorFactory.class);
     TraversableResolver configTraversableResolver = configState.getTraversableResolver();
     this.traversableResolver = configTraversableResolver != null ?
-        configTraversableResolver : GWT.<TraversableResolver>create(TraversableResolver.class);
+        configTraversableResolver : new DefaultTraversableResolver();
     MessageInterpolator configMessageInterpolator = configState.getMessageInterpolator();
     this.messageInterpolator = configMessageInterpolator != null ?
         configMessageInterpolator : new GwtMessageInterpolator();
   }
 
+  /**
+   * Unsupported. Always throws an {@link UnsupportedOperationException}.
+   * 
+   * @throws UnsupportedOperationException
+   */
   @Override
   public final <T> T unwrap(Class<T> type) {
-    // TODO(nchalko) implement
-    return null;
+    throw new UnsupportedOperationException("GWT Validation does not support upwrap()");
   }
 
   @Override
diff --git a/user/src/com/google/gwt/validation/client/AbstractValidationMessageResolver.java b/user/src/com/google/gwt/validation/client/AbstractValidationMessageResolver.java
index f922e7c..6c7eaa0 100644
--- a/user/src/com/google/gwt/validation/client/AbstractValidationMessageResolver.java
+++ b/user/src/com/google/gwt/validation/client/AbstractValidationMessageResolver.java
@@ -20,9 +20,6 @@
 import java.util.MissingResourceException;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * ValidationMessageResolver using a {@link ConstantsWithLookup} source.
  */
 public abstract class AbstractValidationMessageResolver {
diff --git a/user/src/com/google/gwt/validation/client/BaseMessageInterpolator.java b/user/src/com/google/gwt/validation/client/BaseMessageInterpolator.java
index 94031f8..4b42bb4 100644
--- a/user/src/com/google/gwt/validation/client/BaseMessageInterpolator.java
+++ b/user/src/com/google/gwt/validation/client/BaseMessageInterpolator.java
@@ -25,9 +25,6 @@
 import javax.validation.MessageInterpolator;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Base GWT {@link MessageInterpolator}.
  */
 abstract class BaseMessageInterpolator implements MessageInterpolator {
@@ -48,6 +45,7 @@
       final Map<String, Object> map) {
     return new Function<String, String>() {
 
+      @Override
       public String apply(String from) {
         Object object = map.get(from);
         return object == null ? null : object.toString();
@@ -58,6 +56,7 @@
   private static Function<String, String> createReplacer(
       final ValidationMessageResolver messageResolver) {
     return new Function<String, String>() {
+      @Override
       public String apply(String from) {
         Object object = messageResolver.get(from);
         return object == null ? null : object.toString();
@@ -82,6 +81,7 @@
     userReplacer = createReplacer(userValidationMessagesResolver);
   }
 
+  @Override
   public final String interpolate(String messageTemplate, Context context) {
     return gwtInterpolate(messageTemplate, context, null);
   }
diff --git a/user/src/com/google/gwt/validation/client/GwtTraversableResolver.java b/user/src/com/google/gwt/validation/client/DefaultTraversableResolver.java
similarity index 78%
rename from user/src/com/google/gwt/validation/client/GwtTraversableResolver.java
rename to user/src/com/google/gwt/validation/client/DefaultTraversableResolver.java
index 862e193..20eae6a 100644
--- a/user/src/com/google/gwt/validation/client/GwtTraversableResolver.java
+++ b/user/src/com/google/gwt/validation/client/DefaultTraversableResolver.java
@@ -22,25 +22,22 @@
 import javax.validation.TraversableResolver;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
- * GWT {@link TraversableResolver}.
+ * Default {@link TraversableResolver}. Always allows full traversal.
  */
-public final class GwtTraversableResolver implements TraversableResolver {
+public final class DefaultTraversableResolver implements TraversableResolver {
 
+  @Override
   public boolean isCascadable(Object traversableObject,
       Node traversableProperty, Class<?> rootBeanType,
       Path pathToTraversableObject, ElementType elementType) {
-    // TODO(nchalko) implement
-    return false;
+    return true;
   }
 
+  @Override
   public boolean isReachable(Object traversableObject,
       Node traversableProperty, Class<?> rootBeanType,
       Path pathToTraversableObject, ElementType elementType) {
-    // TODO(nchalko) implement
-    return false;
+    return true;
   }
 
 }
diff --git a/user/src/com/google/gwt/validation/client/GwtConstraintValidatorFactory.java b/user/src/com/google/gwt/validation/client/GwtConstraintValidatorFactory.java
index cdaeab2..b4e36b6 100644
--- a/user/src/com/google/gwt/validation/client/GwtConstraintValidatorFactory.java
+++ b/user/src/com/google/gwt/validation/client/GwtConstraintValidatorFactory.java
@@ -19,9 +19,6 @@
 import javax.validation.ConstraintValidatorFactory;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * GWT does not support {@link ConstraintValidatorFactory} use
  * {@link com.google.gwt.core.client.GWT#create(Class) GWT.create(Class)} instead. Using this
  * class throws a {@link UnsupportedOperationException}.
diff --git a/user/src/com/google/gwt/validation/client/GwtMessageInterpolator.java b/user/src/com/google/gwt/validation/client/GwtMessageInterpolator.java
index bb114ca..a49c126 100644
--- a/user/src/com/google/gwt/validation/client/GwtMessageInterpolator.java
+++ b/user/src/com/google/gwt/validation/client/GwtMessageInterpolator.java
@@ -20,9 +20,6 @@
 import java.util.Locale;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Simple GWT {@link javax.validation.MessageInterpolator}.
  */
 public final class GwtMessageInterpolator extends BaseMessageInterpolator {
@@ -49,6 +46,7 @@
     super(userValidationMessagesResolver);
   }
 
+  @Override
   public final String interpolate(String messageTemplate, Context context,
       Locale locale) {
     // The super sourced GWT version of this calls
diff --git a/user/src/com/google/gwt/validation/client/GwtValidation.java b/user/src/com/google/gwt/validation/client/GwtValidation.java
index 53bb07e..cf06c3a 100644
--- a/user/src/com/google/gwt/validation/client/GwtValidation.java
+++ b/user/src/com/google/gwt/validation/client/GwtValidation.java
@@ -25,17 +25,15 @@
 import javax.validation.groups.Default;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Annotates a {@code javax.validation.Validator} explicitly listing the classes
  * that can be validated in GWT.
  * <p>
- * Define the Validator you want, explicitly listing the class you want to
- * validate.
+ * Define the Validator you want, explicitly listing the classes and groups 
+ * you want to validate.
  * 
  * <pre>
- * &#064;GwtValidation(MyBean.class, MyOther.class)
+ * &#064;GwtValidation(value = {MyBean.class, MyOther.class},
+ *     groups = {Default.class, OtherGroup.class})
  * public interface MyValidator extends javax.validation.Validator {
  * }
  * </pre>
@@ -49,6 +47,12 @@
  * </pre>
  * 
  * <p>
+ * You must list all validation groups you are using (as well as groups
+ * making up a group sequence)&ndash; unless you are only using the Default group,
+ * in which case you may omit the "groups" field of the {@link GwtValidation}
+ * annotation.
+ * 
+ * <p>
  * NOTE: Validation is done using only the Constraints found on the Classes
  * listed in the annotation. If you have
  * 
diff --git a/user/src/com/google/gwt/validation/client/GwtValidationProviderResolver.java b/user/src/com/google/gwt/validation/client/GwtValidationProviderResolver.java
index 18aa7de..0bdafd9 100644
--- a/user/src/com/google/gwt/validation/client/GwtValidationProviderResolver.java
+++ b/user/src/com/google/gwt/validation/client/GwtValidationProviderResolver.java
@@ -25,9 +25,6 @@
 import javax.validation.spi.ValidationProvider;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * The default GWT {@link ValidationProviderResolver}. This always returns the
  * single default ValidationProvider using {@link GWT#create(Class)}.
  */
@@ -44,6 +41,7 @@
     return temp;
   }
 
+  @Override
   public List<ValidationProvider<?>> getValidationProviders() {
     return defaultList;
   }
diff --git a/user/src/com/google/gwt/validation/client/ProviderValidationMessageResolver.java b/user/src/com/google/gwt/validation/client/ProviderValidationMessageResolver.java
index 08d9d4f..51a461c 100644
--- a/user/src/com/google/gwt/validation/client/ProviderValidationMessageResolver.java
+++ b/user/src/com/google/gwt/validation/client/ProviderValidationMessageResolver.java
@@ -16,9 +16,6 @@
 package com.google.gwt.validation.client;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Validation Providers implement this to resolve Validation Messages.
  */
 public interface ProviderValidationMessageResolver extends ValidationMessageResolver {
diff --git a/user/src/com/google/gwt/validation/client/UserValidationMessagesResolver.java b/user/src/com/google/gwt/validation/client/UserValidationMessagesResolver.java
index a96e84e..41a0620 100644
--- a/user/src/com/google/gwt/validation/client/UserValidationMessagesResolver.java
+++ b/user/src/com/google/gwt/validation/client/UserValidationMessagesResolver.java
@@ -16,9 +16,6 @@
 package com.google.gwt.validation.client;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Validation Providers implement this to resolve Validation Messages. including
  * overriding the default {@link ProviderValidationMessageResolver}.
  */
diff --git a/user/src/com/google/gwt/validation/client/ValidationMessageResolver.java b/user/src/com/google/gwt/validation/client/ValidationMessageResolver.java
index e8f33ad..37020b9 100644
--- a/user/src/com/google/gwt/validation/client/ValidationMessageResolver.java
+++ b/user/src/com/google/gwt/validation/client/ValidationMessageResolver.java
@@ -16,9 +16,6 @@
 package com.google.gwt.validation.client;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Users and Validation providers implement this to resolve ValidationMessages.
  */
 public interface ValidationMessageResolver {
diff --git a/user/src/com/google/gwt/validation/client/constraints/AbstractDecimalMaxValidator.java b/user/src/com/google/gwt/validation/client/constraints/AbstractDecimalMaxValidator.java
index a6796a0..4bdf8c0 100644
--- a/user/src/com/google/gwt/validation/client/constraints/AbstractDecimalMaxValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/AbstractDecimalMaxValidator.java
@@ -36,6 +36,7 @@
     super();
   }
 
+  @Override
   public final void initialize(DecimalMax constraintAnnotation) {
     try {
       max = new BigDecimal(constraintAnnotation.value());
diff --git a/user/src/com/google/gwt/validation/client/constraints/AbstractDecimalMinValidator.java b/user/src/com/google/gwt/validation/client/constraints/AbstractDecimalMinValidator.java
index c0c6748..6f1d949 100644
--- a/user/src/com/google/gwt/validation/client/constraints/AbstractDecimalMinValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/AbstractDecimalMinValidator.java
@@ -31,6 +31,7 @@
 
   private BigDecimal min;
 
+  @Override
   public final void initialize(DecimalMin constraintAnnotation) {
     try {
       min = new BigDecimal(constraintAnnotation.value());
diff --git a/user/src/com/google/gwt/validation/client/constraints/AbstractDigitsValidator.java b/user/src/com/google/gwt/validation/client/constraints/AbstractDigitsValidator.java
index 3b21514..0607706 100644
--- a/user/src/com/google/gwt/validation/client/constraints/AbstractDigitsValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/AbstractDigitsValidator.java
@@ -32,6 +32,7 @@
   private int fraction;
   private int integer;
 
+  @Override
   public final void initialize(Digits constraintAnnotation) {
     if (!(constraintAnnotation.fraction() >= 0)) {
       throw new IllegalArgumentException(
diff --git a/user/src/com/google/gwt/validation/client/constraints/AbstractMaxValidator.java b/user/src/com/google/gwt/validation/client/constraints/AbstractMaxValidator.java
index 5465269..f6a8799 100644
--- a/user/src/com/google/gwt/validation/client/constraints/AbstractMaxValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/AbstractMaxValidator.java
@@ -22,6 +22,7 @@
 import javax.validation.constraints.Max;
 
 /**
+ * Abstract {@link Max} constraint validator implementation for a <code>T</code>.
  *
  * @param <T> the type of object to validate
  */
@@ -30,6 +31,7 @@
 
   private long max;
 
+  @Override
   public final void initialize(Max constraintAnnotation) {
     max = constraintAnnotation.value();
   }
diff --git a/user/src/com/google/gwt/validation/client/constraints/AbstractMinValidator.java b/user/src/com/google/gwt/validation/client/constraints/AbstractMinValidator.java
index 0fab154..78de274 100644
--- a/user/src/com/google/gwt/validation/client/constraints/AbstractMinValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/AbstractMinValidator.java
@@ -22,8 +22,7 @@
 import javax.validation.constraints.Min;
 
 /**
- * Abstract {@link Min} constraint validator implementation for a <code>T</code>
- * .
+ * Abstract {@link Min} constraint validator implementation for a <code>T</code>.
  *
  * @param <T> the type of object to validate
  */
@@ -32,6 +31,7 @@
 
   private long min;
 
+  @Override
   public final void initialize(Min constraintAnnotation) {
     min = constraintAnnotation.value();
   }
diff --git a/user/src/com/google/gwt/validation/client/constraints/AbstractSizeValidator.java b/user/src/com/google/gwt/validation/client/constraints/AbstractSizeValidator.java
index 43d38b5..034b327 100644
--- a/user/src/com/google/gwt/validation/client/constraints/AbstractSizeValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/AbstractSizeValidator.java
@@ -33,6 +33,7 @@
     super();
   }
 
+  @Override
   public final void initialize(Size annotation) {
     if (!(annotation.min() >= 0)) {
       throw new IllegalArgumentException(
diff --git a/user/src/com/google/gwt/validation/client/constraints/AssertFalseValidator.java b/user/src/com/google/gwt/validation/client/constraints/AssertFalseValidator.java
index 8a29e01..7d5dfa6 100644
--- a/user/src/com/google/gwt/validation/client/constraints/AssertFalseValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/AssertFalseValidator.java
@@ -20,17 +20,16 @@
 import javax.validation.constraints.AssertFalse;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link AssertFalse} constraint validator implementation.
  */
 public class AssertFalseValidator implements
     ConstraintValidator<AssertFalse, Boolean> {
 
+  @Override
   public final void initialize(AssertFalse constraintAnnotation) {
   }
 
+  @Override
   public final boolean isValid(Boolean value, ConstraintValidatorContext context) {
     return value == null || !value.booleanValue();
   }
diff --git a/user/src/com/google/gwt/validation/client/constraints/AssertTrueValidator.java b/user/src/com/google/gwt/validation/client/constraints/AssertTrueValidator.java
index c9d1f3f..0025007 100644
--- a/user/src/com/google/gwt/validation/client/constraints/AssertTrueValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/AssertTrueValidator.java
@@ -20,17 +20,16 @@
 import javax.validation.constraints.AssertTrue;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link AssertTrue} constraint validator implementation.
  */
 public class AssertTrueValidator implements
     ConstraintValidator<AssertTrue, Boolean> {
 
+  @Override
   public final void initialize(AssertTrue constraintAnnotation) {
   }
 
+  @Override
   public final boolean isValid(Boolean value, ConstraintValidatorContext context) {
     return value == null || value.booleanValue();
   }
diff --git a/user/src/com/google/gwt/validation/client/constraints/DecimalMaxValidatorForNumber.java b/user/src/com/google/gwt/validation/client/constraints/DecimalMaxValidatorForNumber.java
index 239c177..992b1f9 100644
--- a/user/src/com/google/gwt/validation/client/constraints/DecimalMaxValidatorForNumber.java
+++ b/user/src/com/google/gwt/validation/client/constraints/DecimalMaxValidatorForNumber.java
@@ -21,15 +21,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.DecimalMax} constraint validator
  * implementation for a {@link Number}.
  */
 public class DecimalMaxValidatorForNumber extends
     AbstractDecimalMaxValidator<Number> {
 
+  @Override
   public final boolean isValid(Number value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/DecimalMaxValidatorForString.java b/user/src/com/google/gwt/validation/client/constraints/DecimalMaxValidatorForString.java
index 9b47c5c..cd23b74 100644
--- a/user/src/com/google/gwt/validation/client/constraints/DecimalMaxValidatorForString.java
+++ b/user/src/com/google/gwt/validation/client/constraints/DecimalMaxValidatorForString.java
@@ -20,15 +20,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.DecimalMax} constraint validator
  * implementation for a {@link String}.
  */
 public class DecimalMaxValidatorForString extends
     AbstractDecimalMaxValidator<String> {
 
+  @Override
   public final boolean isValid(String value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/DecimalMinValidatorForNumber.java b/user/src/com/google/gwt/validation/client/constraints/DecimalMinValidatorForNumber.java
index 2c47788..933e5eb 100644
--- a/user/src/com/google/gwt/validation/client/constraints/DecimalMinValidatorForNumber.java
+++ b/user/src/com/google/gwt/validation/client/constraints/DecimalMinValidatorForNumber.java
@@ -21,15 +21,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.DecimalMin} constraint validator
  * implementation for a {@link Number}.
  */
 public class DecimalMinValidatorForNumber extends
     AbstractDecimalMinValidator<Number> {
 
+  @Override
   public final boolean isValid(Number value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/DecimalMinValidatorForString.java b/user/src/com/google/gwt/validation/client/constraints/DecimalMinValidatorForString.java
index 2a1e33a..cb7a46e 100644
--- a/user/src/com/google/gwt/validation/client/constraints/DecimalMinValidatorForString.java
+++ b/user/src/com/google/gwt/validation/client/constraints/DecimalMinValidatorForString.java
@@ -20,15 +20,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.DecimalMax} constraint validator
  * implementation for a {@link String}.
  */
 public class DecimalMinValidatorForString extends
     AbstractDecimalMinValidator<String> {
 
+  @Override
   public final boolean isValid(String value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/DigitsValidatorForNumber.java b/user/src/com/google/gwt/validation/client/constraints/DigitsValidatorForNumber.java
index 5282e7d..aaa27e6 100644
--- a/user/src/com/google/gwt/validation/client/constraints/DigitsValidatorForNumber.java
+++ b/user/src/com/google/gwt/validation/client/constraints/DigitsValidatorForNumber.java
@@ -21,15 +21,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Digits} constraint validator
  * implementation for a {@link Number}.
  */
 public class DigitsValidatorForNumber extends
     AbstractDigitsValidator<Number> {
 
+  @Override
   public final boolean isValid(Number value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/DigitsValidatorForString.java b/user/src/com/google/gwt/validation/client/constraints/DigitsValidatorForString.java
index a52fc05..2a2804a 100644
--- a/user/src/com/google/gwt/validation/client/constraints/DigitsValidatorForString.java
+++ b/user/src/com/google/gwt/validation/client/constraints/DigitsValidatorForString.java
@@ -20,15 +20,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Digits} constraint validator
  * implementation for a {@link String}.
  */
 public class DigitsValidatorForString extends
     AbstractDigitsValidator<String> {
 
+  @Override
   public final boolean isValid(String value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/FutureValidatorForDate.java b/user/src/com/google/gwt/validation/client/constraints/FutureValidatorForDate.java
index 5a7fa66..4d3dfef 100644
--- a/user/src/com/google/gwt/validation/client/constraints/FutureValidatorForDate.java
+++ b/user/src/com/google/gwt/validation/client/constraints/FutureValidatorForDate.java
@@ -22,18 +22,17 @@
 import javax.validation.constraints.Future;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link Future} constraint validator implementation for a
  * {@link java.util.Date}.
  */
 public class FutureValidatorForDate implements
     ConstraintValidator<Future, Date> {
 
+  @Override
   public final void initialize(Future constraintAnnotation) {
   }
 
+  @Override
   public final boolean isValid(Date value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/MaxValidatorForNumber.java b/user/src/com/google/gwt/validation/client/constraints/MaxValidatorForNumber.java
index bfea94c..d464afa 100644
--- a/user/src/com/google/gwt/validation/client/constraints/MaxValidatorForNumber.java
+++ b/user/src/com/google/gwt/validation/client/constraints/MaxValidatorForNumber.java
@@ -18,14 +18,12 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Max} constraint validator implementation
  * for a {@link Number}.
  */
 public class MaxValidatorForNumber extends AbstractMaxValidator<Number> {
 
+  @Override
   public final boolean isValid(Number value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/MaxValidatorForString.java b/user/src/com/google/gwt/validation/client/constraints/MaxValidatorForString.java
index 91aee3f..6b085be 100644
--- a/user/src/com/google/gwt/validation/client/constraints/MaxValidatorForString.java
+++ b/user/src/com/google/gwt/validation/client/constraints/MaxValidatorForString.java
@@ -20,14 +20,12 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Max} constraint validator implementation
  * for a {@link String}.
  */
 public class MaxValidatorForString extends AbstractMaxValidator<String> {
 
+  @Override
   public final boolean isValid(String value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/MinValidatorForNumber.java b/user/src/com/google/gwt/validation/client/constraints/MinValidatorForNumber.java
index 5c0f097..1fd8a0e 100644
--- a/user/src/com/google/gwt/validation/client/constraints/MinValidatorForNumber.java
+++ b/user/src/com/google/gwt/validation/client/constraints/MinValidatorForNumber.java
@@ -18,14 +18,12 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Min} constraint validator implementation
  * for a {@link Number}.
  */
 public class MinValidatorForNumber extends AbstractMinValidator<Number> {
 
+  @Override
   public final boolean isValid(Number value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/MinValidatorForString.java b/user/src/com/google/gwt/validation/client/constraints/MinValidatorForString.java
index ca0c0c4..0203771 100644
--- a/user/src/com/google/gwt/validation/client/constraints/MinValidatorForString.java
+++ b/user/src/com/google/gwt/validation/client/constraints/MinValidatorForString.java
@@ -20,14 +20,12 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Min} constraint validator implementation
  * for a {@link String}.
  */
 public class MinValidatorForString extends AbstractMinValidator<String> {
 
+  @Override
   public final boolean isValid(String value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/NotGwtCompatibleValidator.java b/user/src/com/google/gwt/validation/client/constraints/NotGwtCompatibleValidator.java
index 140cd5a..c70703d 100644
--- a/user/src/com/google/gwt/validation/client/constraints/NotGwtCompatibleValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/NotGwtCompatibleValidator.java
@@ -21,23 +21,8 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Masks a {@link ConstraintValidator} that is not GWT compatible. This
  * validator always fails.
- * <p>
- * Extend this class and implement it as GWT super class. Use validation groups
- * to keep this constraint from being validated on the client.
- * 
- * <p>
- * In a super source directory override your validator like this:
- * 
- * <pre>
- * public class MyValidator extends
- *     NotGwtCompatibleValidator &lt;MyConstraint, MyType&gt;{
- * }
- * </pre>
  * 
  * @param <A> the constraint to validate
  * @param <T> the type to validate
@@ -45,12 +30,14 @@
 public abstract class NotGwtCompatibleValidator<A extends Annotation, T>
     implements ConstraintValidator<A, T> {
 
+  @Override
   public final void initialize(A constraintAnnotation) {
   }
 
   /**
    * Always fails.
    */
+  @Override
   public final boolean isValid(T value, ConstraintValidatorContext context) {
     // TODO (nchalko) add a custom message
     return false;
diff --git a/user/src/com/google/gwt/validation/client/constraints/NotNullValidator.java b/user/src/com/google/gwt/validation/client/constraints/NotNullValidator.java
index b8d76fb..06d903e 100644
--- a/user/src/com/google/gwt/validation/client/constraints/NotNullValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/NotNullValidator.java
@@ -20,17 +20,16 @@
 import javax.validation.constraints.NotNull;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link NotNull} constraint validator implementation.
  */
 public class NotNullValidator implements
     ConstraintValidator<NotNull, Object> {
 
+  @Override
   public final void initialize(NotNull constraintAnnotation) {
   }
 
+  @Override
   public final boolean isValid(Object value, ConstraintValidatorContext context) {
     return value != null;
   }
diff --git a/user/src/com/google/gwt/validation/client/constraints/NullValidator.java b/user/src/com/google/gwt/validation/client/constraints/NullValidator.java
index 751173b..d6bb3e0 100644
--- a/user/src/com/google/gwt/validation/client/constraints/NullValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/NullValidator.java
@@ -20,16 +20,15 @@
 import javax.validation.constraints.Null;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link Null} constraint validator implementation.
  */
 public class NullValidator implements ConstraintValidator<Null, Object> {
 
+  @Override
   public final void initialize(Null constraintAnnotation) {
   }
 
+  @Override
   public final boolean isValid(Object value, ConstraintValidatorContext context) {
     return value == null;
   }
diff --git a/user/src/com/google/gwt/validation/client/constraints/PastValidatorForDate.java b/user/src/com/google/gwt/validation/client/constraints/PastValidatorForDate.java
index 53f5010..29e0999 100644
--- a/user/src/com/google/gwt/validation/client/constraints/PastValidatorForDate.java
+++ b/user/src/com/google/gwt/validation/client/constraints/PastValidatorForDate.java
@@ -22,17 +22,16 @@
 import javax.validation.constraints.Past;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link Past} constraint validator implementation for a {@link java.util.Date}.
  */
 public class PastValidatorForDate implements
     ConstraintValidator<Past, Date> {
 
+  @Override
   public final void initialize(Past constraintAnnotation) {
   }
 
+  @Override
   public final boolean isValid(Date value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/PatternValidator.java b/user/src/com/google/gwt/validation/client/constraints/PatternValidator.java
index e9093c8..0ca57da 100644
--- a/user/src/com/google/gwt/validation/client/constraints/PatternValidator.java
+++ b/user/src/com/google/gwt/validation/client/constraints/PatternValidator.java
@@ -24,9 +24,6 @@
 import javax.validation.constraints.Pattern.Flag;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link Pattern} constraint validator implementation.
  * <p>
  * Note this implementation uses {@link RegExp} which differs from
@@ -36,6 +33,7 @@
     ConstraintValidator<Pattern, String> {
   private RegExp pattern;
 
+  @Override
   public final void initialize(Pattern annotation) {
     Pattern.Flag flags[] = annotation.flags();
     String flagString = "";
@@ -45,6 +43,7 @@
     pattern = RegExp.compile(annotation.regexp(), flagString);
   }
 
+  @Override
   public final boolean isValid(String value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfBoolean.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfBoolean.java
index ce523f5..57f2581 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfBoolean.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfBoolean.java
@@ -18,15 +18,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a array of {@code boolean}s.
  */
 public class SizeValidatorForArrayOfBoolean extends
     AbstractSizeValidator<boolean[]> {
 
+  @Override
   public final boolean isValid(boolean[] value,
       ConstraintValidatorContext context) {
     if (value == null) {
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfByte.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfByte.java
index 68506c1..4524fa4 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfByte.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfByte.java
@@ -18,15 +18,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a array of {@code byte}s.
  */
 public class SizeValidatorForArrayOfByte extends
     AbstractSizeValidator<byte[]> {
 
+  @Override
   public final boolean isValid(byte[] value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfChar.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfChar.java
index a1ffc4b..6b53dd4 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfChar.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfChar.java
@@ -18,15 +18,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a array of {@code char}s.
  */
 public class SizeValidatorForArrayOfChar extends
     AbstractSizeValidator<char[]> {
 
+  @Override
   public final boolean isValid(char[] value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfDouble.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfDouble.java
index 486056e..5f45135 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfDouble.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfDouble.java
@@ -18,15 +18,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a array of {@code double}s.
  */
 public class SizeValidatorForArrayOfDouble extends
     AbstractSizeValidator<double[]> {
 
+  @Override
   public final boolean isValid(double[] value,
       ConstraintValidatorContext context) {
     if (value == null) {
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfFloat.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfFloat.java
index 09c5e0e..21797e6 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfFloat.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfFloat.java
@@ -18,15 +18,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a array of {@code float}s.
  */
 public class SizeValidatorForArrayOfFloat extends
     AbstractSizeValidator<float[]> {
 
+  @Override
   public final boolean isValid(float[] value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfInt.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfInt.java
index ad0af0c..a30746c 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfInt.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfInt.java
@@ -18,15 +18,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a array of {@code int}s.
  */
 public class SizeValidatorForArrayOfInt extends
     AbstractSizeValidator<int[]> {
 
+  @Override
   public final boolean isValid(int[] value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfLong.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfLong.java
index 6905984..d30691e 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfLong.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfLong.java
@@ -18,15 +18,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a array of {@code long}s.
  */
 public class SizeValidatorForArrayOfLong extends
     AbstractSizeValidator<long[]> {
 
+  @Override
   public final boolean isValid(long[] value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfObject.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfObject.java
index 58b0f50..02b6fa8 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfObject.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfObject.java
@@ -18,15 +18,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a array of {@link Object}s.
  */
 public class SizeValidatorForArrayOfObject extends
     AbstractSizeValidator<Object[]> {
 
+  @Override
   public final boolean isValid(Object[] value,
       ConstraintValidatorContext context) {
     if (value == null) {
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfShort.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfShort.java
index 4bef589..9d6e25d 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfShort.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForArrayOfShort.java
@@ -18,15 +18,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a array of {@code short}s.
  */
 public class SizeValidatorForArrayOfShort extends
     AbstractSizeValidator<short[]> {
 
+  @Override
   public final boolean isValid(short[] value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForCollection.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForCollection.java
index 6914c3d..b41fb05 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForCollection.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForCollection.java
@@ -20,15 +20,13 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a {@link Collection}.
  */
 public class SizeValidatorForCollection extends
     AbstractSizeValidator<Collection<?>> {
 
+  @Override
   public final boolean isValid(Collection<?> value,
       ConstraintValidatorContext context) {
     if (value == null) {
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForMap.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForMap.java
index ccf1c6c..2a63413 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForMap.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForMap.java
@@ -20,14 +20,12 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a {@link Map}.
  */
 public class SizeValidatorForMap extends AbstractSizeValidator<Map<?, ?>> {
 
+  @Override
   public final boolean isValid(Map<?, ?> value,
       ConstraintValidatorContext context) {
     if (value == null) {
diff --git a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForString.java b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForString.java
index 4ad9c47..d20ddb1 100644
--- a/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForString.java
+++ b/user/src/com/google/gwt/validation/client/constraints/SizeValidatorForString.java
@@ -18,14 +18,12 @@
 import javax.validation.ConstraintValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * {@link javax.validation.constraints.Size} constraint validator implementation
  * for a {@link String}.
  */
 public class SizeValidatorForString extends AbstractSizeValidator<String> {
 
+  @Override
   public final boolean isValid(String value, ConstraintValidatorContext context) {
     if (value == null) {
       return true;
diff --git a/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java b/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java
index 0b380c4..36e3616 100644
--- a/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java
+++ b/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java
@@ -15,11 +15,9 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.Group;
-import com.google.gwt.validation.client.GroupChain;
-import com.google.gwt.validation.client.GroupChainGenerator;
-import com.google.gwt.validation.client.GroupValidator;
-import com.google.gwt.validation.client.ValidationGroupsMetadata;
+import com.google.gwt.validation.client.impl.metadata.BeanMetadata;
+import com.google.gwt.validation.client.impl.metadata.MessageAndPath;
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadata;
 
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
@@ -40,9 +38,6 @@
 import javax.validation.groups.Default;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Base methods for implementing a {@link GwtSpecificValidator}.
  * <p>
  * All methods that do not need to be generated go here.
diff --git a/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java b/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java
index 664d4a8..48f1806 100644
--- a/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java
+++ b/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.ValidationGroupsMetadata;
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadata;
 
 import java.util.Arrays;
 import java.util.HashSet;
@@ -29,9 +29,6 @@
 import javax.validation.Validator;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Base methods for implementing {@link Validator} in GWT.
  * <p>
  * All methods that do not need to be generated go here.
@@ -46,7 +43,7 @@
 
   /**
    * Creates a validator initialized with the default group inheritance map.
-   * @see #AbstractGwtValidator(ValidationGroups)
+   * @see #AbstractGwtValidator(ValidationGroupsMetadata)
    */
   public AbstractGwtValidator() {
     this(ValidationGroupsMetadata.builder().build());
diff --git a/user/src/com/google/gwt/validation/client/impl/BaseGwtConfiguration.java b/user/src/com/google/gwt/validation/client/impl/BaseGwtConfiguration.java
index c7d00f9..4279e27 100644
--- a/user/src/com/google/gwt/validation/client/impl/BaseGwtConfiguration.java
+++ b/user/src/com/google/gwt/validation/client/impl/BaseGwtConfiguration.java
@@ -16,6 +16,7 @@
 package com.google.gwt.validation.client.impl;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.validation.client.DefaultTraversableResolver;
 import com.google.gwt.validation.client.spi.GwtConfigurationState;
 import com.google.gwt.validation.client.spi.GwtValidationProvider;
 
@@ -30,9 +31,6 @@
 import javax.validation.spi.BootstrapState;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Base GWT {@link Configuration}.
  */
 public abstract class BaseGwtConfiguration implements
@@ -90,7 +88,7 @@
 
   @Override
   public final TraversableResolver getDefaultTraversableResolver() {
-    return GWT.create(TraversableResolver.class);
+    return new DefaultTraversableResolver();
   }
 
   @Override
diff --git a/user/src/com/google/gwt/validation/client/impl/ConstraintDescriptorImpl.java b/user/src/com/google/gwt/validation/client/impl/ConstraintDescriptorImpl.java
index 63b160a..e42e82a 100644
--- a/user/src/com/google/gwt/validation/client/impl/ConstraintDescriptorImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/ConstraintDescriptorImpl.java
@@ -15,8 +15,6 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.ConstraintOrigin;
-
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
 import java.util.Arrays;
@@ -30,9 +28,6 @@
 import javax.validation.metadata.ConstraintDescriptor;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * A immutable GWT implementation of {@link ConstraintDescriptor}.
  * 
  * @param <T> the constraint annotation to describe.
diff --git a/user/src/com/google/gwt/validation/client/impl/ConstraintFinderImpl.java b/user/src/com/google/gwt/validation/client/impl/ConstraintFinderImpl.java
index 30369c4..9964487 100644
--- a/user/src/com/google/gwt/validation/client/impl/ConstraintFinderImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/ConstraintFinderImpl.java
@@ -15,11 +15,8 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.ConstraintOrigin;
-import com.google.gwt.validation.client.Group;
-import com.google.gwt.validation.client.GroupChain;
-import com.google.gwt.validation.client.GroupChainGenerator;
-import com.google.gwt.validation.client.ValidationGroupsMetadata;
+import com.google.gwt.validation.client.impl.metadata.BeanMetadata;
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadata;
 
 import java.lang.annotation.ElementType;
 import java.util.ArrayList;
@@ -36,9 +33,7 @@
 import javax.validation.metadata.ElementDescriptor.ConstraintFinder;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
+ * Finds constraints declared on an element using specified criteria.
  */
 public final class ConstraintFinderImpl implements ConstraintFinder {
   private Set<ConstraintDescriptorImpl<?>> constraintDescriptors;
diff --git a/user/src/com/google/gwt/validation/client/ConstraintOrigin.java b/user/src/com/google/gwt/validation/client/impl/ConstraintOrigin.java
similarity index 88%
rename from user/src/com/google/gwt/validation/client/ConstraintOrigin.java
rename to user/src/com/google/gwt/validation/client/impl/ConstraintOrigin.java
index 41c0da7..b12caf7 100644
--- a/user/src/com/google/gwt/validation/client/ConstraintOrigin.java
+++ b/user/src/com/google/gwt/validation/client/impl/ConstraintOrigin.java
@@ -13,17 +13,15 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.validation.client;
+package com.google.gwt.validation.client.impl;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Visibility looked at when discovering constraints.
  * <p>
  * Exactly the same as the
  * <a href="http://docs.jboss.org/hibernate/validator/4.3/api/org/hibernate/validator/internal/metadata/core/ConstraintOrigin.html">
  * Hibernate implementation</a>.
+ * Duplicated here to avoid dependency.
  */
 public enum ConstraintOrigin {
   /**
diff --git a/user/src/com/google/gwt/validation/client/impl/ConstraintValidatorContextImpl.java b/user/src/com/google/gwt/validation/client/impl/ConstraintValidatorContextImpl.java
index 470c1a1..18b570d 100644
--- a/user/src/com/google/gwt/validation/client/impl/ConstraintValidatorContextImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/ConstraintValidatorContextImpl.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.validation.client.impl;
 
+import com.google.gwt.validation.client.impl.metadata.MessageAndPath;
+
 import java.lang.annotation.Annotation;
 import java.util.HashSet;
 import java.util.Set;
@@ -27,9 +29,6 @@
 import javax.validation.metadata.ConstraintDescriptor;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * GWT safe immutable implementation of {@link ConstraintValidatorContext}
  * <p>
  * These objects are very short lived.
@@ -61,11 +60,13 @@
       this.messageTemplate = messageTemplate;
     }
 
+    @Override
     public ConstraintValidatorContext addConstraintViolation() {
       messages.add(new MessageAndPath(context.basePath, messageTemplate));
       return context;
     }
 
+    @Override
     public NodeBuilderDefinedContext addNode(String name) {
       return new NodeBuilderDefinedContextImpl(this, messageTemplate,
           basePath.append(name));
@@ -81,11 +82,6 @@
     private final ConstraintViolationBuilderImpl parent;
     private final PathImpl path;
 
-    /**
-     * @param parent
-     * @param messageTemplate
-     * @param append
-     */
     public NodeBuilderCustomizableContextImpl(
         ConstraintViolationBuilderImpl parent, String messageTemplate,
         PathImpl path) {
@@ -94,14 +90,17 @@
       this.path = path;
     }
 
+    @Override
     public ConstraintValidatorContext addConstraintViolation() {
       return null;
     }
 
+    @Override
     public NodeBuilderCustomizableContext addNode(String name) {
       return this;
     }
 
+    @Override
     public NodeContextBuilder inIterable() {
       return new NodeContextBuilderImpl(path, messageTemplate, parent);
     }
@@ -117,11 +116,6 @@
     private final ConstraintViolationBuilderImpl parent;
     private final PathImpl path;
 
-    /**
-     * @param constraintViolationBuilderImpl
-     * @param messageTemplate
-     * @param append
-     */
     public NodeBuilderDefinedContextImpl(ConstraintViolationBuilderImpl parent,
         String messageTemplate, PathImpl path) {
       this.parent = parent;
@@ -129,11 +123,13 @@
       this.path = path;
     }
 
+    @Override
     public ConstraintValidatorContext addConstraintViolation() {
       messages.add(new MessageAndPath(path, messageTemplate));
       return parent.context;
     }
 
+    @Override
     public NodeBuilderCustomizableContext addNode(String name) {
       return new NodeBuilderCustomizableContextImpl(parent, messageTemplate,
           path.append(name));
@@ -158,20 +154,24 @@
       this.parent = parent;
     }
 
+    @Override
     public ConstraintValidatorContext addConstraintViolation() {
       return null;
     }
 
+    @Override
     public NodeBuilderCustomizableContext addNode(String name) {
       return new NodeBuilderCustomizableContextImpl(parent, messageTemplate,
           path.append(name));
     }
 
+    @Override
     public NodeBuilderDefinedContext atIndex(Integer index) {
       return new NodeBuilderDefinedContextImpl(parent, messageTemplate,
           path.appendIndex(null, index.intValue()));
     }
 
+    @Override
     public NodeBuilderDefinedContext atKey(Object key) {
       return new NodeBuilderDefinedContextImpl(parent, messageTemplate,
           path.appendKey(null, key));
@@ -192,6 +192,7 @@
     this.descriptor = descriptor;
   }
 
+  @Override
   public ConstraintViolationBuilder buildConstraintViolationWithTemplate(
       String messageTemplate) {
     ConstraintViolationBuilderImpl builder = new ConstraintViolationBuilderImpl(
@@ -199,10 +200,12 @@
     return builder;
   }
 
+  @Override
   public void disableDefaultConstraintViolation() {
     disableDefault = true;
   }
 
+  @Override
   public String getDefaultConstraintMessageTemplate() {
     return (String) descriptor.getAttributes().get("message");
   }
diff --git a/user/src/com/google/gwt/validation/client/impl/ConstraintViolationImpl.java b/user/src/com/google/gwt/validation/client/impl/ConstraintViolationImpl.java
index 038775d..ad2ad1b 100644
--- a/user/src/com/google/gwt/validation/client/impl/ConstraintViolationImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/ConstraintViolationImpl.java
@@ -23,9 +23,6 @@
 import javax.validation.metadata.ConstraintDescriptor;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * An implementation of {@link ConstraintViolation}.
  * 
  * @param <T> the type of bean validated.
diff --git a/user/src/com/google/gwt/validation/client/Group.java b/user/src/com/google/gwt/validation/client/impl/Group.java
similarity index 93%
rename from user/src/com/google/gwt/validation/client/Group.java
rename to user/src/com/google/gwt/validation/client/impl/Group.java
index 8bfbce2..ccb7fad 100644
--- a/user/src/com/google/gwt/validation/client/Group.java
+++ b/user/src/com/google/gwt/validation/client/impl/Group.java
@@ -13,14 +13,11 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.validation.client;
+package com.google.gwt.validation.client.impl;
 
 import javax.validation.groups.Default;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Encapsulates a single validation group.
  * <p>
  * Modified from the Hibernate validator for use with GWT.
diff --git a/user/src/com/google/gwt/validation/client/GroupChain.java b/user/src/com/google/gwt/validation/client/impl/GroupChain.java
similarity index 96%
rename from user/src/com/google/gwt/validation/client/GroupChain.java
rename to user/src/com/google/gwt/validation/client/impl/GroupChain.java
index f379afc..d177bc4 100644
--- a/user/src/com/google/gwt/validation/client/GroupChain.java
+++ b/user/src/com/google/gwt/validation/client/impl/GroupChain.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.validation.client;
+package com.google.gwt.validation.client.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -26,9 +26,6 @@
 import javax.validation.groups.Default;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * An instance of {@code GroupChain} defines the group order during one full validation call.
  * <p>
  * Modified from the Hibernate validator for use with GWT.
diff --git a/user/src/com/google/gwt/validation/client/GroupChainGenerator.java b/user/src/com/google/gwt/validation/client/impl/GroupChainGenerator.java
similarity index 96%
rename from user/src/com/google/gwt/validation/client/GroupChainGenerator.java
rename to user/src/com/google/gwt/validation/client/impl/GroupChainGenerator.java
index c312cc1..594de06 100644
--- a/user/src/com/google/gwt/validation/client/GroupChainGenerator.java
+++ b/user/src/com/google/gwt/validation/client/impl/GroupChainGenerator.java
@@ -13,7 +13,9 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.validation.client;
+package com.google.gwt.validation.client.impl;
+
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadata;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -26,10 +28,8 @@
 import javax.validation.ValidationException;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
- * Helper class used to resolve groups and sequences into a single chain of groups which can then be validated.
+ * Helper class used to resolve groups and sequences into a single chain of groups which can then
+ * be validated.
  * <p>
  * Modified from the Hibernate validator for use with GWT.
  */
diff --git a/user/src/com/google/gwt/validation/client/GroupValidator.java b/user/src/com/google/gwt/validation/client/impl/GroupValidator.java
similarity index 85%
rename from user/src/com/google/gwt/validation/client/GroupValidator.java
rename to user/src/com/google/gwt/validation/client/impl/GroupValidator.java
index bd73947..34ad2d5 100644
--- a/user/src/com/google/gwt/validation/client/GroupValidator.java
+++ b/user/src/com/google/gwt/validation/client/impl/GroupValidator.java
@@ -13,18 +13,14 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.validation.client;
+package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.impl.GwtValidationContext;
 
 import java.util.Set;
 
 import javax.validation.ConstraintViolation;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Does shallow group-specific validation. Group sequences and Default group overriding are not
  * directly supported by implementations of this interface. Instead, this is used by higher-level
  * validators to delegate the validation of specific areas.
diff --git a/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptor.java b/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptor.java
index e5560d7..50b3a33 100644
--- a/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptor.java
+++ b/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptor.java
@@ -15,14 +15,11 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.ValidationGroupsMetadata;
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadata;
 
 import javax.validation.metadata.BeanDescriptor;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Marker interface used by GWT to generate a {@link BeanDescriptor} for a
  * specific class T.
  * 
diff --git a/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptorImpl.java b/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptorImpl.java
index c17c433..e3f7661 100644
--- a/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptorImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/GwtBeanDescriptorImpl.java
@@ -15,7 +15,8 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.ValidationGroupsMetadata;
+import com.google.gwt.validation.client.impl.metadata.BeanMetadata;
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadata;
 
 import java.lang.annotation.Annotation;
 import java.util.Collection;
@@ -28,9 +29,6 @@
 import javax.validation.metadata.PropertyDescriptor;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Abstract BeanDescriptor for use by generated {@link GwtBeanDescriptor}.
  * <p>
  * Subclasses are expected to call setDescriptorMap from the constructor.
@@ -142,6 +140,7 @@
     return clazz;
   }
 
+  
   @Override
   public boolean hasConstraints() {
     return !constraints.isEmpty();
diff --git a/user/src/com/google/gwt/validation/client/impl/GwtConfiguration.java b/user/src/com/google/gwt/validation/client/impl/GwtConfiguration.java
index 26438e8..436ee89 100644
--- a/user/src/com/google/gwt/validation/client/impl/GwtConfiguration.java
+++ b/user/src/com/google/gwt/validation/client/impl/GwtConfiguration.java
@@ -22,9 +22,6 @@
 import javax.validation.spi.BootstrapState;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Extends {@link BaseGwtConfiguration} with just the parts that are not GWT
  * compatible.
  */
@@ -35,6 +32,10 @@
     super(gwtValidationProvider, state);
   }
 
+  /**
+   * Unsupported. Always throws an {@link UnsupportedOperationException}.
+   */
+  @Override
   public GwtConfiguration addMapping(InputStream stream) {
     throw new UnsupportedOperationException("GWT does not support InputStreams");
   }
diff --git a/user/src/com/google/gwt/validation/client/impl/GwtSpecificValidator.java b/user/src/com/google/gwt/validation/client/impl/GwtSpecificValidator.java
index b97bb7a..86acd4b 100644
--- a/user/src/com/google/gwt/validation/client/impl/GwtSpecificValidator.java
+++ b/user/src/com/google/gwt/validation/client/impl/GwtSpecificValidator.java
@@ -15,8 +15,8 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.Group;
-import com.google.gwt.validation.client.ValidationGroupsMetadata;
+import com.google.gwt.validation.client.impl.metadata.BeanMetadata;
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadata;
 
 import java.util.Set;
 
@@ -24,9 +24,6 @@
 import javax.validation.ValidationException;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Defines GWT version of {@link javax.validation.Validator}. This used by
  * generate a specific Validator for a given class G.
  * 
@@ -53,6 +50,7 @@
    * perform validation of a bean using the specific group(s).
    * @param context GWT validation context.
    * @param object Object being validated.
+   * @param propertyName The name of the property being validated.
    * @param violations Set of violations to add to.
    * @param groups What group(s) to validate.
    */
@@ -67,7 +65,9 @@
    * Helper method used to first expand the Default group sequence and then 
    * perform validation of a bean using the specific group(s).
    * @param context GWT validation context.
-   * @param object Object being validated.
+   * @param beanType Class being validated.
+   * @param propertyName The name of the property being validated.
+   * @param value The value of the property to use.
    * @param violations Set of violations to add to.
    * @param groups What group(s) to validate.
    */
diff --git a/user/src/com/google/gwt/validation/client/impl/GwtValidationContext.java b/user/src/com/google/gwt/validation/client/impl/GwtValidationContext.java
index 34de391..ed8eaf7 100644
--- a/user/src/com/google/gwt/validation/client/impl/GwtValidationContext.java
+++ b/user/src/com/google/gwt/validation/client/impl/GwtValidationContext.java
@@ -20,13 +20,11 @@
 import java.util.Set;
 
 import javax.validation.MessageInterpolator;
+import javax.validation.TraversableResolver;
 import javax.validation.metadata.BeanDescriptor;
 import javax.validation.metadata.ConstraintDescriptor;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Context for a {@link com.google.gwt.validation.client.GwtValidation}.
  * 
  * <p>
@@ -42,6 +40,7 @@
   private final Class<T> rootBeanClass;
   private final T rootBean;
   private final MessageInterpolator messageInterpolator;
+  private final TraversableResolver traversableResolver;
   private final AbstractGwtValidator validator;
 
   /**
@@ -49,25 +48,26 @@
    * <p>
    * This set is shared with and updated by children contexts created by
    * {@link #append(String)}, {@link #appendIndex(String, int)} and
-   * {@link #appendKey(String, String)}.
+   * {@link #appendKey(String, Object)}.
    */
   private final Set<Object> validatedObjects;
 
-  public GwtValidationContext(Class<T> rootBeanClass, T rootBean,
-      BeanDescriptor beanDescriptor,
-      MessageInterpolator messageInterpolator, AbstractGwtValidator validator) {
-    this(rootBeanClass, rootBean, beanDescriptor, messageInterpolator,
+  public GwtValidationContext(Class<T> rootBeanClass, T rootBean, BeanDescriptor beanDescriptor,
+      MessageInterpolator messageInterpolator, TraversableResolver traversableResolver,
+      AbstractGwtValidator validator) {
+    this(rootBeanClass, rootBean, beanDescriptor, messageInterpolator, traversableResolver,
         validator,
         new HashSet<Object>());
   }
 
   private GwtValidationContext(Class<T> rootBeanClass, T rootBean, BeanDescriptor beanDescriptor,
-      MessageInterpolator messageInterpolator, AbstractGwtValidator validator,
-      Set<Object> validatedObjects) {
+      MessageInterpolator messageInterpolator, TraversableResolver traversableResolver, 
+      AbstractGwtValidator validator, Set<Object> validatedObjects) {
     this.rootBeanClass = rootBeanClass;
     this.rootBean = rootBean;
     this.beanDescriptor = beanDescriptor;
     this.messageInterpolator = messageInterpolator;
+    this.traversableResolver = traversableResolver;
     this.validator = validator;
     this.validatedObjects = new HashSet<Object>(validatedObjects);
   }
@@ -87,7 +87,7 @@
    */
   public GwtValidationContext<T> append(String name) {
     GwtValidationContext<T> temp = new GwtValidationContext<T>(rootBeanClass,
-        rootBean, beanDescriptor, messageInterpolator, validator,
+        rootBean, beanDescriptor, messageInterpolator, traversableResolver, validator,
         validatedObjects);
     temp.path = path.append(name);
     return temp;
@@ -100,7 +100,7 @@
    */
   public GwtValidationContext<T> appendIndex(String name, int index) {
     GwtValidationContext<T> temp = new GwtValidationContext<T>(rootBeanClass,
-        rootBean, beanDescriptor, messageInterpolator, validator,
+        rootBean, beanDescriptor, messageInterpolator, traversableResolver, validator,
         validatedObjects);
     temp.path = path.appendIndex(name, index);
     return temp;
@@ -113,7 +113,7 @@
    */
   public GwtValidationContext<T> appendIterable(String name) {
     GwtValidationContext<T> temp = new GwtValidationContext<T>(rootBeanClass,
-        rootBean, beanDescriptor, messageInterpolator, validator,
+        rootBean, beanDescriptor, messageInterpolator, traversableResolver, validator,
         validatedObjects);
     temp.path = path.appendIterable(name);
     return temp;
@@ -126,7 +126,7 @@
    */
   public GwtValidationContext<T> appendKey(String name, Object key) {
     GwtValidationContext<T> temp = new GwtValidationContext<T>(rootBeanClass,
-        rootBean, beanDescriptor, messageInterpolator, validator,
+        rootBean, beanDescriptor, messageInterpolator, traversableResolver, validator,
         validatedObjects);
     temp.path = path.appendKey(name, key);
     return temp;
@@ -141,6 +141,10 @@
     return messageInterpolator;
   }
 
+  public PathImpl getPath() {
+    return path;
+  }
+
   public T getRootBean() {
     return rootBean;
   }
@@ -149,6 +153,10 @@
     return rootBeanClass;
   }
 
+  public TraversableResolver getTraversableResolver() {
+    return traversableResolver;
+  }
+
   public AbstractGwtValidator getValidator() {
     return validator;
   }
diff --git a/user/src/com/google/gwt/validation/client/impl/GwtValidatorContext.java b/user/src/com/google/gwt/validation/client/impl/GwtValidatorContext.java
index abf5890..bf62d54 100644
--- a/user/src/com/google/gwt/validation/client/impl/GwtValidatorContext.java
+++ b/user/src/com/google/gwt/validation/client/impl/GwtValidatorContext.java
@@ -24,9 +24,6 @@
 import javax.validation.ValidatorContext;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * GWT {@link ValidatorContext}.
  */
 public final class GwtValidatorContext implements ValidatorContext {
@@ -56,6 +53,7 @@
     traversableResolver = validatorFactory.getTraversableResolver();
   }
 
+  @Override
   public ValidatorContext constraintValidatorFactory(
       ConstraintValidatorFactory constraintValidatorfactory) {
     if (constraintValidatorfactory == null) {
@@ -66,6 +64,7 @@
     return this;
   }
 
+  @Override
   public Validator getValidator() {
     AbstractGwtValidator validator = validatorFactory.createValidator();
     validator.init(constraintValidatorfactory, messageInterpolator,
@@ -73,6 +72,7 @@
     return validator;
   }
 
+  @Override
   public ValidatorContext messageInterpolator(
       MessageInterpolator messageInterpolator) {
     if (messageInterpolator == null) {
@@ -83,6 +83,7 @@
     return this;
   }
 
+  @Override
   public ValidatorContext traversableResolver(
       TraversableResolver traversableResolver) {
     if (traversableResolver == null) {
diff --git a/user/src/com/google/gwt/validation/client/impl/MessageInterpolatorContextImpl.java b/user/src/com/google/gwt/validation/client/impl/MessageInterpolatorContextImpl.java
index 64b6592..9d11063 100644
--- a/user/src/com/google/gwt/validation/client/impl/MessageInterpolatorContextImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/MessageInterpolatorContextImpl.java
@@ -31,10 +31,12 @@
     this.value = value;
   }
 
+  @Override
   public ConstraintDescriptor<?> getConstraintDescriptor() {
     return constraintDescriptor;
   }
 
+  @Override
   public Object getValidatedValue() {
     return value;
   }
diff --git a/user/src/com/google/gwt/validation/client/impl/NodeImpl.java b/user/src/com/google/gwt/validation/client/impl/NodeImpl.java
index 7f59f39..dc11a4b 100644
--- a/user/src/com/google/gwt/validation/client/impl/NodeImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/NodeImpl.java
@@ -20,9 +20,6 @@
 import javax.validation.Path.Node;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * An immutable GWT safe implementation of {@link Node}.
  */
 final class NodeImpl implements Node, Serializable {
@@ -75,14 +72,17 @@
         && this.isInIterable == that.isInIterable;
   }
 
+  @Override
   public Integer getIndex() {
     return index;
   }
 
+  @Override
   public Object getKey() {
     return key;
   }
 
+  @Override
   public String getName() {
     return name;
   }
@@ -98,6 +98,7 @@
     return result;
   }
 
+  @Override
   public boolean isInIterable() {
     return isInIterable;
   }
diff --git a/user/src/com/google/gwt/validation/client/impl/NullUserValidationMessageResolver.java b/user/src/com/google/gwt/validation/client/impl/NullUserValidationMessageResolver.java
index c654751..d6258d1 100644
--- a/user/src/com/google/gwt/validation/client/impl/NullUserValidationMessageResolver.java
+++ b/user/src/com/google/gwt/validation/client/impl/NullUserValidationMessageResolver.java
@@ -18,14 +18,12 @@
 import com.google.gwt.validation.client.UserValidationMessagesResolver;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Always resolves message keys to null.
  */
 public final class NullUserValidationMessageResolver implements
     UserValidationMessagesResolver {
 
+  @Override
   public String get(String key) {
     return null;
   }
diff --git a/user/src/com/google/gwt/validation/client/impl/PathImpl.java b/user/src/com/google/gwt/validation/client/impl/PathImpl.java
index b88b643..818c2b7 100644
--- a/user/src/com/google/gwt/validation/client/impl/PathImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/PathImpl.java
@@ -23,9 +23,6 @@
 import javax.validation.Path;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * An immutable GWT safe implementation of {@link Path}.
  */
 public final class PathImpl implements Path, Serializable {
@@ -36,7 +33,7 @@
 
   /**
    * Creates a new path containing only the root (<code>null</code>)
-   * {@link Node}.
+   * {@link javax.validation.Path.Node Node}.
    */
   public PathImpl() {
     nodes.add(NodeImpl.ROOT_NODE);
@@ -49,6 +46,10 @@
     nodes.add(node);
   }
 
+  private PathImpl(List<Node> nodes) {
+    this.nodes.addAll(nodes);
+  }
+
   /**
    * Create a new path with a node named <code>name</code> appended to the
    * existing path.
@@ -65,7 +66,7 @@
    * the existing path.
    *
    * @param name
-   * @param key
+   * @param index
    * @return The new path with appended node.
    */
   public PathImpl appendIndex(String name, int index) {
@@ -107,11 +108,26 @@
     return this.nodes.equals(that.nodes);
   }
 
+  public Node getLeafNode() {
+    return nodes.get(nodes.size() - 1);
+  }
+
+  public PathImpl getPathWithoutLeafNode() {
+    List<Node> nodesCopy = new ArrayList<Node>(nodes);
+    PathImpl path = this;
+    if (!nodesCopy.isEmpty()) {
+      nodesCopy.remove(nodesCopy.size() - 1);
+      path = new PathImpl(nodesCopy);
+    }
+    return path;
+  }
+
   @Override
   public int hashCode() {
     return nodes.hashCode();
   }
 
+  @Override
   public Iterator<Node> iterator() {
     return nodes.iterator();
   }
diff --git a/user/src/com/google/gwt/validation/client/impl/PropertyDescriptorImpl.java b/user/src/com/google/gwt/validation/client/impl/PropertyDescriptorImpl.java
index 77d72f8..6a3aced 100644
--- a/user/src/com/google/gwt/validation/client/impl/PropertyDescriptorImpl.java
+++ b/user/src/com/google/gwt/validation/client/impl/PropertyDescriptorImpl.java
@@ -15,7 +15,8 @@
  */
 package com.google.gwt.validation.client.impl;
 
-import com.google.gwt.validation.client.ValidationGroupsMetadata;
+import com.google.gwt.validation.client.impl.metadata.BeanMetadata;
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadata;
 
 import java.util.Arrays;
 import java.util.HashSet;
@@ -25,9 +26,7 @@
 import javax.validation.metadata.PropertyDescriptor;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
+ * Describes a constrained bean property.
  */
 public final class PropertyDescriptorImpl implements PropertyDescriptor {
 
diff --git a/user/src/com/google/gwt/validation/client/impl/Validation.java b/user/src/com/google/gwt/validation/client/impl/Validation.java
index ea2e488..3bf33c9 100644
--- a/user/src/com/google/gwt/validation/client/impl/Validation.java
+++ b/user/src/com/google/gwt/validation/client/impl/Validation.java
@@ -29,76 +29,37 @@
 import javax.validation.spi.ValidationProvider;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
- * This class is the entry point for Bean Validation. There are three ways to
- * bootstrap it:
- * <ul>
- * <li>
- * The easiest approach is to build the default <code>ValidatorFactory</code>.
+ * This class is the entry point for Bean Validation. Bootstrapping is done as follows:
  * 
  * <pre>{@code ValidatorFactory factory = Validation.buildDefaultValidatorFactory();}</pre>
- * In this case, the default validation provider resolver will be used to locate
- * available providers. The chosen provider is defined as followed:
- * <ul>
- * <li>Since GWT does not support XML configuration, the first provider returned
- * by the <code>ValidationProviderResolver</code> instance is used.</li>
- * </ul>
- * </li>
- * <li>
- * The second bootstrap approach allows to choose a custom
- * <code>ValidationProviderResolver</code>. The chosen
- * <code>ValidationProvider</code> is then determined in the same way as in the
- * default bootstrapping case (see above).
+ * 
+ * Or, equivalently:
  * 
  * <pre>{@code
  * Configuration<?> configuration = Validation
  *    .byDefaultProvider()
- *    .providerResolver( new MyResolverStrategy() )
  *    .configure();
  * ValidatorFactory factory = configuration.buildValidatorFactory();}
  * </pre>
- * </li>
- * <li>
- * The third approach allows you to specify explicitly and in a type safe
- * fashion the expected provider.
- * <p/>
- * Optionally you can choose a custom <code>ValidationProviderResolver</code>.
  * 
- * <pre>{@code
- * ACMEConfiguration configuration = Validation
- *    .byProvider(ACMEProvider.class)
- *    .providerResolver( new MyResolverStrategy() )  // optionally set the provider resolver
- *    .configure();
- * ValidatorFactory factory = configuration.buildValidatorFactory();}
- * </pre>
- * </li>
- * </ul>
- * Note:<br/>
- * <ul>
- * <li>
- * The <code>ValidatorFactory</code> object built by the bootstrap process
- * should be cached and shared amongst <code>Validator</code> consumers.</li>
- * <li>
- * This class is thread-safe.</li>
- * </ul>
- * 
+ * Only the default provider is available for use, and thus the {@code byProvider} and 
+ * {@code providerResolver} methods are not supported. Calling either of these methods will
+ * generate an exception.
+ * <p>
  * This class was modified by Google from the original
  * javax.validation.Validation source to make it suitable for GWT.
  */
 public class Validation {
 
   // private class, not exposed
-  private static class GenericBootstrapImpl implements GenericBootstrap,
+  private static class GenericGWTBootstrapImpl implements GenericBootstrap,
       BootstrapState {
 
     private ValidationProviderResolver defaultResolver;
-    private ValidationProviderResolver resolver;
 
+    @Override
     public Configuration<?> configure() {
-      ValidationProviderResolver aResolver = this.resolver == null
-          ? getDefaultValidationProviderResolver() : this.resolver;
+      ValidationProviderResolver aResolver = getDefaultValidationProviderResolver();
 
       List<ValidationProvider<?>> resolvers;
       try {
@@ -125,6 +86,7 @@
       return config;
     }
 
+    @Override
     public ValidationProviderResolver getDefaultValidationProviderResolver() {
       if (defaultResolver == null) {
         defaultResolver = GWT.create(ValidationProviderResolver.class);
@@ -132,81 +94,20 @@
       return defaultResolver;
     }
 
+    @Override
     public ValidationProviderResolver getValidationProviderResolver() {
-      return resolver;
+      return getDefaultValidationProviderResolver();
     }
 
+    /**
+     * Unsupported. Always throws an {@link UnsupportedOperationException}.
+     * 
+     * @throws UnsupportedOperationException
+     */
+    @Override
     public GenericBootstrap providerResolver(ValidationProviderResolver resolver) {
-      this.resolver = resolver;
-      return this;
-    }
-  }
-
-  // private class, not exposed
-  private static class ProviderSpecificBootstrapImpl
-      <T extends Configuration<T>, U extends ValidationProvider<T>>
-      implements ProviderSpecificBootstrap<T> {
-
-    private ValidationProviderResolver resolver;
-    private final Class<U> validationProviderClass;
-
-    public ProviderSpecificBootstrapImpl(Class<U> validationProviderClass) {
-      this.validationProviderClass = validationProviderClass;
-    }
-
-    /**
-     * Determine the provider implementation suitable for byProvider(Class) and
-     * delegate the creation of this specific Configuration subclass to the
-     * provider.
-     *
-     * @return a Configuration sub interface implementation
-     */
-    public T configure() {
-      if (validationProviderClass == null) {
-        throw new ValidationException(
-            "builder is mandatory. Use Validation.byDefaultProvider() to use the generic provider discovery mechanism");
-      }
-      // used mostly as a BootstrapState
-      GenericBootstrapImpl state = new GenericBootstrapImpl();
-      if (resolver == null) {
-        resolver = state.getDefaultValidationProviderResolver();
-      } else {
-        // stay null if no resolver is defined
-        state.providerResolver(resolver);
-      }
-
-      List<ValidationProvider<?>> resolvers;
-      try {
-        resolvers = resolver.getValidationProviders();
-      } catch (RuntimeException re) {
-        throw new ValidationException(
-            "Unable to get available provider resolvers.", re);
-      }
-
-      for (ValidationProvider<?> provider : resolvers) {
-        // GWT validation only support exact matches.
-        if (validationProviderClass.equals(provider.getClass())) {
-          @SuppressWarnings("unchecked")
-          ValidationProvider<T> specificProvider = (ValidationProvider<T>) provider;
-          return specificProvider.createSpecializedConfiguration(state);
-        }
-      }
-      throw new ValidationException("Unable to find provider: "
-          + validationProviderClass);
-    }
-
-    /**
-     * Optionally define the provider resolver implementation used. If not
-     * defined, use the default ValidationProviderResolver
-     *
-     * @param resolver ValidationProviderResolver implementation used
-     *
-     * @return self
-     */
-    public ProviderSpecificBootstrap<T> providerResolver(
-        ValidationProviderResolver resolver) {
-      this.resolver = resolver;
-      return this;
+      throw new UnsupportedOperationException("GWT Validation does not support custom validator " +
+          "provider resolvers");
     }
   }
 
@@ -229,13 +130,11 @@
   }
 
   /**
-   * Build a <code>Configuration</code>. The provider list is resolved using the
-   * strategy provided to the bootstrap state.
+   * Build a <code>Configuration</code>.
    *
    * <pre>
    * Configuration&lt?&gt; configuration = Validation
    *    .byDefaultProvider()
-   *    .providerResolver( new MyResolverStrategy() )
    *    .configure();
    * ValidatorFactory factory = configuration.buildValidatorFactory();
    * </pre>
@@ -246,35 +145,18 @@
    *         with the bootstrap state provided.
    */
   public static GenericBootstrap byDefaultProvider() {
-    return new GenericBootstrapImpl();
+    return new GenericGWTBootstrapImpl();
   }
 
   /**
-   * Build a <code>Configuration</code> for a particular provider
-   * implementation. Optionally overrides the provider resolution strategy used
-   * to determine the provider.
-   * <p/>
-   * Used by applications targeting a specific provider programmatically.
-   * <p/>
-   *
-   * <pre>
-   * ACMEConfiguration configuration =
-   *     Validation.byProvider(ACMEProvider.class)
-   *             .providerResolver( new MyResolverStrategy() )
-   *             .configure();
-   * </pre>
-   * , where <code>ACMEConfiguration</code> is the <code>Configuration</code>
-   * sub interface uniquely identifying the ACME Bean Validation provider. and
-   * <code>ACMEProvider</code> is the <code>ValidationProvider</code>
-   * implementation of the ACME provider.
-   *
-   * @param providerType the <code>ValidationProvider</code> implementation type
-   *
-   * @return instance building a provider specific <code>Configuration</code>
-   *         sub interface implementation.
+   * Unsupported. Always throws an {@link UnsupportedOperationException}.
+   * @param providerType 
+   * 
+   * @throws UnsupportedOperationException
    */
   public static <T extends Configuration<T>,U extends ValidationProvider<T>>
       ProviderSpecificBootstrap<T> byProvider(Class<U> providerType) {
-    return new ProviderSpecificBootstrapImpl<T, U>(providerType);
+    throw new UnsupportedOperationException("GWT Validation does not support custom validator " +
+        "providers");
   }
 }
diff --git a/user/src/com/google/gwt/validation/client/impl/BeanMetadata.java b/user/src/com/google/gwt/validation/client/impl/metadata/BeanMetadata.java
similarity index 88%
rename from user/src/com/google/gwt/validation/client/impl/BeanMetadata.java
rename to user/src/com/google/gwt/validation/client/impl/metadata/BeanMetadata.java
index 0aa177f..7db686d 100644
--- a/user/src/com/google/gwt/validation/client/impl/BeanMetadata.java
+++ b/user/src/com/google/gwt/validation/client/impl/metadata/BeanMetadata.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.validation.client.impl;
+package com.google.gwt.validation.client.impl.metadata;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -22,10 +22,7 @@
 import javax.validation.groups.Default;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
- * Describes information about a bean.
+ * Describes information about a bean which is used for validation purposes.
  */
 public class BeanMetadata {
   private final Class<?> beanClass;
diff --git a/user/src/com/google/gwt/validation/client/impl/MessageAndPath.java b/user/src/com/google/gwt/validation/client/impl/metadata/MessageAndPath.java
similarity index 88%
rename from user/src/com/google/gwt/validation/client/impl/MessageAndPath.java
rename to user/src/com/google/gwt/validation/client/impl/metadata/MessageAndPath.java
index d83c65c..a248830 100644
--- a/user/src/com/google/gwt/validation/client/impl/MessageAndPath.java
+++ b/user/src/com/google/gwt/validation/client/impl/metadata/MessageAndPath.java
@@ -13,14 +13,11 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.validation.client.impl;
+package com.google.gwt.validation.client.impl.metadata;
 
 import javax.validation.Path;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Holds as Message and a Path.
  * <p>
  * Used to build a {@link javax.validation.ConstraintViolation}
diff --git a/user/src/com/google/gwt/validation/client/ValidationGroupsMetadata.java b/user/src/com/google/gwt/validation/client/impl/metadata/ValidationGroupsMetadata.java
similarity index 97%
rename from user/src/com/google/gwt/validation/client/ValidationGroupsMetadata.java
rename to user/src/com/google/gwt/validation/client/impl/metadata/ValidationGroupsMetadata.java
index bd3d803..f22a1ed 100644
--- a/user/src/com/google/gwt/validation/client/ValidationGroupsMetadata.java
+++ b/user/src/com/google/gwt/validation/client/impl/metadata/ValidationGroupsMetadata.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.validation.client;
+package com.google.gwt.validation.client.impl.metadata;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -29,9 +29,6 @@
 
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Contains all the information known about the inheritance information for validation groups.
  */
 public class ValidationGroupsMetadata {
diff --git a/user/src/com/google/gwt/validation/client/spi/BaseConfigurationState.java b/user/src/com/google/gwt/validation/client/spi/BaseConfigurationState.java
index e28cb1b..78caf1f 100644
--- a/user/src/com/google/gwt/validation/client/spi/BaseConfigurationState.java
+++ b/user/src/com/google/gwt/validation/client/spi/BaseConfigurationState.java
@@ -24,9 +24,6 @@
 import javax.validation.spi.ConfigurationState;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Base GWT implementation of {@link ConfigurationState}.
  */
 public abstract class BaseConfigurationState implements ConfigurationState {
diff --git a/user/src/com/google/gwt/validation/client/spi/GwtBootStrapState.java b/user/src/com/google/gwt/validation/client/spi/GwtBootStrapState.java
deleted file mode 100644
index 4fa6240..0000000
--- a/user/src/com/google/gwt/validation/client/spi/GwtBootStrapState.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.validation.client.spi;
-
-import com.google.gwt.core.client.GWT;
-
-import javax.validation.ValidationProviderResolver;
-import javax.validation.spi.BootstrapState;
-
-/**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
- * GWT {@link BootstrapState}.
- */
-public final class GwtBootStrapState implements BootstrapState {
-
-  public ValidationProviderResolver getDefaultValidationProviderResolver() {
-    return GWT.create(ValidationProviderResolver.class);
-  }
-
-  public ValidationProviderResolver getValidationProviderResolver() {
-    return null;
-  }
-}
diff --git a/user/src/com/google/gwt/validation/client/spi/GwtConfigurationState.java b/user/src/com/google/gwt/validation/client/spi/GwtConfigurationState.java
index 1496001..2820b91 100644
--- a/user/src/com/google/gwt/validation/client/spi/GwtConfigurationState.java
+++ b/user/src/com/google/gwt/validation/client/spi/GwtConfigurationState.java
@@ -24,9 +24,6 @@
 import javax.validation.TraversableResolver;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Only the GWT incompatible parts.
  */
 public final class GwtConfigurationState extends BaseConfigurationState {
diff --git a/user/src/com/google/gwt/validation/client/spi/GwtValidationProvider.java b/user/src/com/google/gwt/validation/client/spi/GwtValidationProvider.java
index ca24bf3..2ee502a 100644
--- a/user/src/com/google/gwt/validation/client/spi/GwtValidationProvider.java
+++ b/user/src/com/google/gwt/validation/client/spi/GwtValidationProvider.java
@@ -27,9 +27,6 @@
 import javax.validation.spi.ValidationProvider;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * GWT {@link ValidationProvider}.
  */
 public final class GwtValidationProvider implements
diff --git a/user/src/com/google/gwt/validation/rebind/AbstractCreator.java b/user/src/com/google/gwt/validation/rebind/AbstractCreator.java
index 9af4aa1..b52e95a 100644
--- a/user/src/com/google/gwt/validation/rebind/AbstractCreator.java
+++ b/user/src/com/google/gwt/validation/rebind/AbstractCreator.java
@@ -27,27 +27,26 @@
 import java.io.PrintWriter;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Abstract Class for Creating source files.
  * <p>
  * This class is not thread safe.
  */
 public abstract class AbstractCreator extends AbstractSourceCreator {
 
-  protected final GeneratorContext context;
+  final GeneratorContext context;
 
-  protected final TreeLogger logger;
+  final TreeLogger logger;
 
-  protected final JClassType validatorType;
+  final JClassType validatorType;
 
-  public AbstractCreator(GeneratorContext context, TreeLogger logger,
-      JClassType validatorType) {
-    super();
+  final BeanHelperCache cache;
+
+  AbstractCreator(GeneratorContext context, TreeLogger logger,
+      JClassType validatorType, BeanHelperCache cache) {
     this.context = context;
     this.logger = branch(logger, "Creating " + validatorType);
     this.validatorType = validatorType;
+    this.cache = cache;
   }
 
   public final String create() throws UnableToCompleteException {
@@ -70,18 +69,17 @@
 
   protected BeanHelper createBeanHelper(Class<?> clazz)
       throws UnableToCompleteException {
-    return BeanHelper.createBeanHelper(clazz, logger, context);
+    return cache.createHelper(clazz, logger, context);
   }
 
   protected BeanHelper createBeanHelper(JClassType jType)
       throws UnableToCompleteException {
-    return BeanHelper.createBeanHelper(jType, logger, context);
+    return cache.createHelper(jType, logger, context);
   }
 
   protected final String getPackage() {
     JPackage serviceIntfPkg = validatorType.getPackage();
-    String packageName = serviceIntfPkg == null ? "" : serviceIntfPkg.getName();
-    return packageName;
+    return serviceIntfPkg == null ? "" : serviceIntfPkg.getName();
   }
 
   protected String getSimpleName() {
@@ -94,22 +92,6 @@
   protected abstract void writeClassBody(SourceWriter sourceWriter)
       throws UnableToCompleteException;
 
-  protected void writeValidatorInstance(SourceWriter sw, BeanHelper bean) {
-  BeanHelper.writeInterface(context, logger, bean);
-  // private final MyBeanValidator myBeanValidator =
-  sw.print("private final " + bean.getFullyQualifiedValidatorName() + " ");
-  sw.print(bean.getValidatorInstanceName());
-  sw.println(" = ");
-  sw.indent();
-  sw.indent();
-
-  // MyBeanValidator.INSTANCE;
-  sw.print(bean.getFullyQualifiedValidatorName());
-  sw.println(".INSTANCE;");
-  sw.outdent();
-  sw.outdent();
-}
-
   private String getQualifiedName() {
     String packageName = getPackage();
     return (packageName == "" ? "" : packageName + ".") + getSimpleName();
@@ -126,8 +108,6 @@
     ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(
         packageName, simpleName);
     compose(composerFactory);
-    SourceWriter sourceWriter = composerFactory.createSourceWriter(ctx,
-        printWriter);
-    return sourceWriter;
+    return composerFactory.createSourceWriter(ctx, printWriter);
   }
 }
\ No newline at end of file
diff --git a/user/src/com/google/gwt/validation/rebind/BeanHelper.java b/user/src/com/google/gwt/validation/rebind/BeanHelper.java
index 081c496..4e5134f 100644
--- a/user/src/com/google/gwt/validation/rebind/BeanHelper.java
+++ b/user/src/com/google/gwt/validation/rebind/BeanHelper.java
@@ -15,10 +15,6 @@
  */
 package com.google.gwt.validation.rebind;
 
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.ext.GeneratorContext;
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JArrayType;
 import com.google.gwt.core.ext.typeinfo.JClassType;
 import com.google.gwt.core.ext.typeinfo.JField;
@@ -27,25 +23,11 @@
 import com.google.gwt.core.ext.typeinfo.JType;
 import com.google.gwt.core.ext.typeinfo.NotFoundException;
 import com.google.gwt.thirdparty.guava.common.base.Function;
-import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
-import com.google.gwt.user.rebind.SourceWriter;
-import com.google.gwt.validation.client.impl.GwtSpecificValidator;
 
-import java.io.PrintWriter;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.validation.Validation;
-import javax.validation.ValidationException;
-import javax.validation.Validator;
 import javax.validation.metadata.BeanDescriptor;
 import javax.validation.metadata.PropertyDescriptor;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * A simple struct for the various values associated with a Bean that can be
  * validated.
  */
@@ -53,159 +35,22 @@
 
   public static final Function<BeanHelper, Class<?>> TO_CLAZZ = 
       new Function<BeanHelper, Class<?>>() {
+    @Override
     public Class<?> apply(BeanHelper helper) {
       return helper.getClazz();
     }
   };
 
-  private static final Validator serverSideValidator = 
-      Validation.buildDefaultValidatorFactory().getValidator();
-
-  // stash the map in a ThreadLocal, since each GWT module lives in its own
-  // thread in DevMode
-  private static final ThreadLocal<Map<JClassType, BeanHelper>> threadLocalHelperMap =
-        new ThreadLocal<Map<JClassType, BeanHelper>>() {
-    @Override
-    protected synchronized Map<JClassType, BeanHelper> initialValue() {
-      return new HashMap<JClassType, BeanHelper>();
-    }
-  };
-
-  /**
-   * Visible for testing.
-   */
-  public static void clearBeanHelpersForTests() {
-    threadLocalHelperMap.get().clear();
-  }
-
-  public static BeanHelper createBeanHelper(Class<?> clazz, TreeLogger logger,
-      GeneratorContext context) throws UnableToCompleteException {
-    JClassType beanType = context.getTypeOracle().findType(
-        clazz.getCanonicalName());
-    return createBeanHelper(clazz, beanType, logger, context);
-  }
-
-  public static Map<JClassType, BeanHelper> getBeanHelpers() {
-    return Collections.unmodifiableMap(threadLocalHelperMap.get());
-  }
-
-  protected static BeanHelper createBeanHelper(JClassType jType,
-      TreeLogger logger, GeneratorContext context)
-      throws UnableToCompleteException {
-    JClassType erasedType = jType.getErasedType();
-    try {
-      Class<?> clazz = Class.forName(erasedType.getQualifiedBinaryName());
-      return createBeanHelper(clazz, erasedType, logger, context);
-    } catch (ClassNotFoundException e) {
-      logger.log(TreeLogger.ERROR, "Unable to create BeanHelper for "
-          + erasedType, e);
-      throw new UnableToCompleteException();
-    }
-  }
-
-  protected static boolean isClassConstrained(Class<?> clazz) {
-    return serverSideValidator.getConstraintsForClass(clazz).isBeanConstrained();
-  }
-
-  static BeanHelper getBeanHelper(JClassType beanType) {
-    return getBeanHelpers().get(beanType.getErasedType());
-  }
-
-  /**
-   * Write an Empty Interface implementing {@link GwtSpecificValidator} with
-   * Generic parameter of the bean type.
-   */
-  static void writeInterface(GeneratorContext context, TreeLogger logger,
-      BeanHelper bean) {
-    PrintWriter pw = context.tryCreate(logger, bean.getPackage(),
-        bean.getValidatorName());
-    if (pw != null) {
-      TreeLogger interfaceLogger = logger.branch(TreeLogger.TRACE,
-          "Creating the interface for " + bean.getFullyQualifiedValidatorName());
-
-      ClassSourceFileComposerFactory factory = new ClassSourceFileComposerFactory(
-          bean.getPackage(), bean.getValidatorName());
-      factory.addImplementedInterface(GwtSpecificValidator.class.getCanonicalName()
-          + " <" + bean.getTypeCanonicalName() + ">");
-      factory.addImport(GWT.class.getCanonicalName());
-      factory.makeInterface();
-      SourceWriter sw = factory.createSourceWriter(context, pw);
-
-      // static MyValidator INSTANCE = GWT.create(MyValidator.class);
-      sw.print("static ");
-      sw.print(bean.getValidatorName());
-      sw.print(" INSTANCE = GWT.create(");
-      sw.print(bean.getValidatorName());
-      sw.println(".class);");
-
-      sw.commit(interfaceLogger);
-      pw.close();
-    }
-  }
-
-  private static synchronized void addBeanHelper(BeanHelper helper) {
-    threadLocalHelperMap.get().put(helper.getJClass(), helper);
-  }
-
-  private static BeanHelper createBeanHelper(Class<?> clazz,
-      JClassType beanType, TreeLogger logger, GeneratorContext context)
-      throws UnableToCompleteException {
-    BeanHelper helper = getBeanHelper(beanType);
-    if (helper == null) {
-      BeanDescriptor bean;
-      try {
-        bean = serverSideValidator.getConstraintsForClass(clazz);
-      } catch (ValidationException e) {
-        logger.log(TreeLogger.ERROR,
-            "Unable to create a validator for " + clazz.getCanonicalName()
-                + " because " + e.getMessage(), e);
-        throw new UnableToCompleteException();
-      }
-      helper = new BeanHelper(beanType, clazz, bean);
-      addBeanHelper(helper);
-      writeInterface(context, logger, helper);
-
-      // now recurse on all Cascaded elements
-      for (PropertyDescriptor p : bean.getConstrainedProperties()) {
-        if (p.isCascaded()) {
-          createBeanHelper(p, helper, logger, context);
-        }
-      }
-    }
-    return helper;
-  }
-
-  private static void createBeanHelper(PropertyDescriptor p, BeanHelper parent,
-      TreeLogger logger, GeneratorContext context)
-      throws UnableToCompleteException {
-    Class<?> elementClass = p.getElementClass();
-    if (GwtSpecificValidatorCreator.isIterableOrMap(elementClass)) {
-      if (parent.hasField(p)) {
-        JClassType type = parent.getAssociationType(p, true);
-
-        createBeanHelper(type.getErasedType(), logger, context);
-      }
-      if (parent.hasGetter(p)) {
-        JClassType type = parent.getAssociationType(p, false);
-
-        createBeanHelper(type.getErasedType(), logger, context);
-      }
-    } else {
-      if (serverSideValidator.getConstraintsForClass(elementClass).isBeanConstrained()) {
-        createBeanHelper(elementClass, logger, context);
-      }
-    }
-  }
-
   private final BeanDescriptor beanDescriptor;
 
   private final JClassType jClass;
 
-  private Class<?> clazz;
+  private final Class<?> clazz;
 
-  private BeanHelper(JClassType jClass, Class<?> clazz,
-      BeanDescriptor beanDescriptor) {
-    super();
+  /**
+   * Shouldn't be created directly; instead use BeanHelperCache.
+   */
+  BeanHelper(JClassType jClass, Class<?> clazz, BeanDescriptor beanDescriptor) {
     this.beanDescriptor = beanDescriptor;
     this.jClass = jClass;
     this.clazz = clazz;
@@ -240,11 +85,6 @@
     return clazz;
   }
 
-  public String getDescriptorName() {
-
-    return jClass.getName() + "Descriptor";
-  }
-
   public String getFullyQualifiedValidatorName() {
     return getPackage() + "." + getValidatorName();
   }
diff --git a/user/src/com/google/gwt/validation/rebind/BeanHelperCache.java b/user/src/com/google/gwt/validation/rebind/BeanHelperCache.java
new file mode 100644
index 0000000..1db6b9c
--- /dev/null
+++ b/user/src/com/google/gwt/validation/rebind/BeanHelperCache.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.rebind;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.ext.GeneratorContext;
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
+import com.google.gwt.user.rebind.SourceWriter;
+import com.google.gwt.validation.client.impl.GwtSpecificValidator;
+
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.validation.Validation;
+import javax.validation.ValidationException;
+import javax.validation.Validator;
+import javax.validation.metadata.BeanDescriptor;
+import javax.validation.metadata.PropertyDescriptor;
+
+/**
+ * A cache and factory for BeanHelpers. There should be one BeanHelperCache per
+ * compilation run.
+ * <p>
+ * (public for tests)
+ */
+public class BeanHelperCache { // public for testing
+
+  private final Map<JClassType, BeanHelper> cache;
+  private final Validator serverSideValidator;
+
+  /**
+   * Creates a cache. There should be one cache per compiler run.
+   * (public for tests.)
+   */
+  public BeanHelperCache() {
+    cache = new HashMap<JClassType, BeanHelper>();
+    serverSideValidator = Validation.buildDefaultValidatorFactory().getValidator();
+  }
+
+  /**
+   * Clears the cache.
+   * (Public for testing.)
+   */
+  public void clear() {
+    cache.clear();
+  }
+
+  /**
+   * Creates a BeanHelper and writes an interface containing its instance. Also,
+   * recursively creates any BeanHelpers on its constrained properties.
+   * (Public for testing.)
+   */
+  public BeanHelper createHelper(Class<?> clazz, TreeLogger logger,
+      GeneratorContext context) throws UnableToCompleteException {
+    JClassType beanType = context.getTypeOracle().findType(clazz.getCanonicalName());
+    return doCreateHelper(clazz, beanType, logger, context);
+  }
+
+  /**
+   * Creates a BeanHelper and writes an interface containing its instance. Also,
+   * recursively creates any BeanHelpers on its constrained properties.
+   */
+  BeanHelper createHelper(JClassType jType, TreeLogger logger, GeneratorContext context)
+      throws UnableToCompleteException {
+    JClassType erasedType = jType.getErasedType();
+    try {
+      Class<?> clazz = Class.forName(erasedType.getQualifiedBinaryName());
+      return doCreateHelper(clazz, erasedType, logger, context);
+    } catch (ClassNotFoundException e) {
+      logger.log(TreeLogger.ERROR, "Unable to create BeanHelper for "
+          + erasedType, e);
+      throw new UnableToCompleteException();
+    }
+  }
+
+  List<BeanHelper> getAllBeans() {
+    return Util.sortMostSpecificFirst(cache.values(), BeanHelper.TO_CLAZZ);
+  }
+
+  BeanHelper getBean(JClassType key) {
+    return cache.get(key);
+  }
+
+  boolean isClassConstrained(Class<?> clazz) {
+    return serverSideValidator.getConstraintsForClass(clazz).isBeanConstrained();
+  }
+
+  private BeanHelper doCreateHelper(Class<?> clazz,
+      JClassType beanType, TreeLogger logger, GeneratorContext context)
+      throws UnableToCompleteException {
+    BeanHelper helper = getBean(beanType);
+    if (helper == null) {
+      BeanDescriptor bean;
+      try {
+        bean = serverSideValidator.getConstraintsForClass(clazz);
+      } catch (ValidationException e) {
+        logger.log(TreeLogger.ERROR,
+            "Unable to create a validator for " + clazz.getCanonicalName()
+                + " because " + e.getMessage(), e);
+        throw new UnableToCompleteException();
+      }
+      helper = new BeanHelper(beanType, clazz, bean);
+      cache.put(helper.getJClass(), helper);
+
+      writeInterface(context, logger, helper);
+
+      // now recurse on all Cascaded elements
+      for (PropertyDescriptor p : bean.getConstrainedProperties()) {
+        // TODO(idol) only bother creating objects for properties that have constrains in the groups
+        // specified in @GwtValidation, but not others
+        if (p.isCascaded()) {
+          doCreateHelperForProp(p, helper, logger, context);
+        }
+      }
+    }
+    return helper;
+  }
+
+  /**
+   * Creates the appropriate BeanHelper for a property on a bean.
+   */
+  private void doCreateHelperForProp(PropertyDescriptor p, BeanHelper parent,
+      TreeLogger logger, GeneratorContext context)
+      throws UnableToCompleteException {
+    Class<?> elementClass = p.getElementClass();
+    if (GwtSpecificValidatorCreator.isIterableOrMap(elementClass)) {
+      if (parent.hasField(p)) {
+        JClassType type = parent.getAssociationType(p, true);
+
+        createHelper(type.getErasedType(), logger, context);
+      }
+      if (parent.hasGetter(p)) {
+        JClassType type = parent.getAssociationType(p, false);
+
+        createHelper(type.getErasedType(), logger, context);
+      }
+    } else {
+      if (serverSideValidator.getConstraintsForClass(elementClass).isBeanConstrained()) {
+        createHelper(elementClass, logger, context);
+      }
+    }
+  }
+
+  /**
+   * Write an Empty Interface implementing
+   * {@link com.google.gwt.validation.client.impl.GwtSpecificValidator} with
+   * Generic parameter of the bean type.
+   */
+  private void writeInterface(GeneratorContext context, TreeLogger logger, BeanHelper bean) {
+    PrintWriter pw = context.tryCreate(logger, bean.getPackage(),
+        bean.getValidatorName());
+    if (pw != null) {
+      TreeLogger interfaceLogger = logger.branch(TreeLogger.TRACE,
+          "Creating the interface for " + bean.getFullyQualifiedValidatorName());
+
+      ClassSourceFileComposerFactory factory = new ClassSourceFileComposerFactory(
+          bean.getPackage(), bean.getValidatorName());
+      factory.addImplementedInterface(GwtSpecificValidator.class.getCanonicalName()
+          + " <" + bean.getTypeCanonicalName() + ">");
+      factory.addImport(GWT.class.getCanonicalName());
+      factory.makeInterface();
+      SourceWriter sw = factory.createSourceWriter(context, pw);
+
+      // static MyValidator INSTANCE = GWT.create(MyValidator.class);
+      sw.print("static ");
+      sw.print(bean.getValidatorName());
+      sw.print(" INSTANCE = GWT.create(");
+      sw.print(bean.getValidatorName());
+      sw.println(".class);");
+
+      sw.commit(interfaceLogger);
+      pw.close();
+    }
+  }
+}
diff --git a/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java b/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
index d93b90f..dfcd5a7 100644
--- a/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
+++ b/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
@@ -40,18 +40,19 @@
 import com.google.gwt.thirdparty.guava.common.primitives.Primitives;
 import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
 import com.google.gwt.user.rebind.SourceWriter;
-import com.google.gwt.validation.client.ConstraintOrigin;
-import com.google.gwt.validation.client.Group;
-import com.google.gwt.validation.client.GroupChain;
-import com.google.gwt.validation.client.GroupChainGenerator;
-import com.google.gwt.validation.client.ValidationGroupsMetadata;
 import com.google.gwt.validation.client.impl.AbstractGwtSpecificValidator;
 import com.google.gwt.validation.client.impl.ConstraintDescriptorImpl;
-import com.google.gwt.validation.client.impl.BeanMetadata;
+import com.google.gwt.validation.client.impl.ConstraintOrigin;
+import com.google.gwt.validation.client.impl.Group;
+import com.google.gwt.validation.client.impl.GroupChain;
+import com.google.gwt.validation.client.impl.GroupChainGenerator;
 import com.google.gwt.validation.client.impl.GwtBeanDescriptor;
 import com.google.gwt.validation.client.impl.GwtBeanDescriptorImpl;
 import com.google.gwt.validation.client.impl.GwtValidationContext;
+import com.google.gwt.validation.client.impl.PathImpl;
 import com.google.gwt.validation.client.impl.PropertyDescriptorImpl;
+import com.google.gwt.validation.client.impl.metadata.BeanMetadata;
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadata;
 
 import java.beans.BeanInfo;
 import java.beans.IntrospectionException;
@@ -65,6 +66,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -76,6 +78,7 @@
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintViolation;
 import javax.validation.GroupSequence;
+import javax.validation.Path.Node;
 import javax.validation.Payload;
 import javax.validation.UnexpectedTypeException;
 import javax.validation.Valid;
@@ -86,9 +89,6 @@
 import javax.validation.metadata.PropertyDescriptor;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Creates a {@link com.google.gwt.validation.client.impl.GwtSpecificValidator}.
  * <p>
  * This class is not thread safe.
@@ -341,19 +341,27 @@
 
   private Set<JMethod> gettersToWrap = Sets.newHashSet();
 
+  private final Set<Class<?>> validGroups;
+
+  private final Map<ConstraintDescriptor<?>, Boolean> validConstraintsMap = Maps.newHashMap();
+
   public GwtSpecificValidatorCreator(JClassType validatorType,
       JClassType beanType, BeanHelper beanHelper, TreeLogger logger,
-      GeneratorContext context) {
-    super(context, logger, validatorType);
+      GeneratorContext context, BeanHelperCache cache, Class<?>[] validGroupsFromAnnotation) {
+    super(context, logger, validatorType, cache);
     this.beanType = beanType;
     this.beanHelper = beanHelper;
+
+    Set<Class<?>> tempValidGroups = Sets.newHashSet(validGroupsFromAnnotation);
+    tempValidGroups.add(Default.class);
+    this.validGroups = Collections.unmodifiableSet(tempValidGroups);
   }
 
   @Override
   protected void compose(ClassSourceFileComposerFactory composerFactory) {
     addImports(composerFactory, Annotation.class, ConstraintViolation.class,
-        GWT.class, ValidationGroupsMetadata.class, Group.class, GroupChain.class,
-        GroupChainGenerator.class, GwtBeanDescriptor.class, BeanMetadata.class, 
+        GWT.class, ValidationGroupsMetadata.class, Group.class, GroupChain.class, PathImpl.class,
+        Node.class, GroupChainGenerator.class, GwtBeanDescriptor.class, BeanMetadata.class, 
         GwtValidationContext.class, ArrayList.class, HashSet.class, IllegalArgumentException.class,
         Set.class, Collection.class, Iterator.class, List.class, ValidationException.class);
     composerFactory.setSuperclass(AbstractGwtSpecificValidator.class.getCanonicalName()
@@ -400,6 +408,17 @@
     }
   }
 
+  private boolean areConstraintDescriptorGroupsValid(ConstraintDescriptor<?> constraintDescriptor) {
+    if (validConstraintsMap.containsKey(constraintDescriptor)) {
+      return validConstraintsMap.get(constraintDescriptor);
+    } else {
+      boolean areValid = checkGroups(constraintDescriptor.getGroups());
+      // cache result
+      validConstraintsMap.put(constraintDescriptor, areValid);
+      return areValid;
+    }
+  }
+
   private <T> T[] asArray(Collection<?> collection, T[] array) {
     if (collection == null) {
       return null;
@@ -407,6 +426,15 @@
     return collection.toArray(array);
   }
 
+  private boolean checkGroups(Set<Class<?>> groups) {
+    for (Class<?> group : groups) {
+      if (validGroups.contains(group)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   private String constraintDescriptorVar(String name, int count) {
     String s = name + "_c" + count;
     return s;
@@ -528,6 +556,29 @@
     return Iterables.any(propertyDescriptors, nameMatches);
   }
 
+  private boolean isPropertyConstrained(PropertyDescriptor p, boolean useField) {
+    // cascaded counts as constrained
+    // we must know if the @Valid annotation is on a field or a getter
+    JClassType jClass = beanHelper.getJClass();
+    if (useField &&
+        jClass.findField(p.getPropertyName()).isAnnotationPresent(Valid.class)) {
+      return true;
+    } else if (!useField &&
+        jClass.findMethod(asGetter(p),NO_ARGS).isAnnotationPresent(Valid.class)) {
+      return true;
+    }
+    // for non-cascaded properties
+    for (ConstraintDescriptor<?> constraint : p.getConstraintDescriptors()) {
+      org.hibernate.validator.metadata.ConstraintDescriptorImpl<?> constraintHibernate = 
+          (org.hibernate.validator.metadata.ConstraintDescriptorImpl<?>) constraint;
+      if (constraintHibernate.getElementType() ==
+          (useField ? ElementType.FIELD : ElementType.METHOD)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   private Predicate<PropertyDescriptor> newPropertyNameMatches(
       final PropertyDescriptor p) {
     return new Predicate<PropertyDescriptor>() {
@@ -574,9 +625,13 @@
     // .setConstrained(true)
     sw.println(".setConstrained(" + beanDescriptor.isBeanConstrained() + ")");
 
-    for (int count = 0; count < beanDescriptor.getConstraintDescriptors().size(); count++) {
-      // .add(c0)
-      sw.println(".add(" + constraintDescriptorVar("this", count) + ")");
+    int count = 0;
+    for (ConstraintDescriptor<?> constraint : beanDescriptor.getConstraintDescriptors()) {
+      if (areConstraintDescriptorGroupsValid(constraint)) {
+        // .add(c0)
+        sw.println(".add(" + constraintDescriptorVar("this", count) + ")");
+        count++;
+      }
     }
 
     // .put("myProperty", myProperty_pd)
@@ -652,34 +707,36 @@
     int count = 0;
     Class<?> clazz = beanHelper.getClazz();
     for (ConstraintDescriptor<?> constraint : beanHelper.getBeanDescriptor().getConstraintDescriptors()) {
-      if (hasMatchingAnnotation(constraint)) {
+      if (areConstraintDescriptorGroupsValid(constraint)) {
+        if (hasMatchingAnnotation(constraint)) {
 
-        if (!constraint.getConstraintValidatorClasses().isEmpty()) {
-          Class<? extends ConstraintValidator<? extends Annotation, ?>> validatorClass = getValidatorForType(
-              constraint, clazz);
-
-          // validate(context, violations, null, object,
-          sw.print("validate(context, violations, null, object, ");
-
-          // new MyValidtor(),
-          sw.print("new ");
-          sw.print(validatorClass.getCanonicalName());
-          sw.print("(), "); // TODO(nchalko) use ConstraintValidatorFactory
-
-          // this.aConstraintDescriptor, groups);
-          sw.print(constraintDescriptorVar("this", count));
-          sw.print(", ");
-          sw.print(groupsVarName);
-          sw.println(");");
-        } else if (constraint.getComposingConstraints().isEmpty()) {
-          // TODO(nchalko) What does the spec say to do here.
-          logger.log(TreeLogger.WARN, "No ConstraintValidator of " + constraint
-              + " for type " + clazz);
+          if (!constraint.getConstraintValidatorClasses().isEmpty()) {
+            Class<? extends ConstraintValidator<? extends Annotation, ?>> validatorClass =
+                getValidatorForType(constraint, clazz);
+  
+            // validate(context, violations, null, object,
+            sw.print("validate(context, violations, null, object, ");
+  
+            // new MyValidtor(),
+            sw.print("new ");
+            sw.print(validatorClass.getCanonicalName());
+            sw.print("(), "); // TODO(nchalko) use ConstraintValidatorFactory
+  
+            // this.aConstraintDescriptor, groups);
+            sw.print(constraintDescriptorVar("this", count));
+            sw.print(", ");
+            sw.print(groupsVarName);
+            sw.println(");");
+          } else if (constraint.getComposingConstraints().isEmpty()) {
+            // TODO(nchalko) What does the spec say to do here.
+            logger.log(TreeLogger.WARN, "No ConstraintValidator of " + constraint
+                + " for type " + clazz);
+          }
+          // TODO(nchalko) handle constraint.isReportAsSingleViolation() and
+          // hasComposingConstraints
         }
-        // TODO(nchalko) handle constraint.isReportAsSingleViolation() and
-        // hasComposingConstraints
+        count++;
       }
-      count++;
     }
   }
 
@@ -1016,13 +1073,14 @@
     for (PropertyDescriptor p :
          beanHelper.getBeanDescriptor().getConstrainedProperties()) {
       int count = 0;
-      // Check if the same annotation is applied to the same property twice (getter and field)
       for (ConstraintDescriptor<?> constraint : p.getConstraintDescriptors()) {
         org.hibernate.validator.metadata.ConstraintDescriptorImpl<?> constraintHibernate = 
             (org.hibernate.validator.metadata.ConstraintDescriptorImpl<?>) constraint;
-        writeConstraintDescriptor(sw, constraint, constraintHibernate.getElementType(),
-            convertConstraintOriginEnum(constraintHibernate.getDefinedOn()),
-            constraintDescriptorVar(p.getPropertyName(), count++));
+        if (areConstraintDescriptorGroupsValid(constraint)) {
+          writeConstraintDescriptor(sw, constraint, constraintHibernate.getElementType(),
+              convertConstraintOriginEnum(constraintHibernate.getDefinedOn()),
+              constraintDescriptorVar(p.getPropertyName(), count++));
+        }
       }
       writePropertyDescriptor(sw, p);
       if (p.isCascaded()) {
@@ -1038,9 +1096,11 @@
         beanHelper.getBeanDescriptor().getConstraintDescriptors()) {
       org.hibernate.validator.metadata.ConstraintDescriptorImpl<?> constraintHibernate =
           (org.hibernate.validator.metadata.ConstraintDescriptorImpl<?>) constraint;
-      writeConstraintDescriptor(sw, constraint, ElementType.TYPE,
-          convertConstraintOriginEnum(constraintHibernate.getDefinedOn()),
-          constraintDescriptorVar("this", count++));
+      if (areConstraintDescriptorGroupsValid(constraint)) {
+        writeConstraintDescriptor(sw, constraint, ElementType.TYPE,
+            convertConstraintOriginEnum(constraintHibernate.getDefinedOn()),
+            constraintDescriptorVar("this", count++));
+      }
     }
 
     // Now write the BeanDescriptor after we already have the
@@ -1242,10 +1302,13 @@
 
     // myProperty_c0,
     // myProperty_c1 );
-    int size = p.getConstraintDescriptors().size();
-    for (int i = 0; i < size; i++) {
-      sw.println(","); // Print the , for the previous line
-      sw.print(constraintDescriptorVar(p.getPropertyName(), i));
+    int count = 0;
+    for (ConstraintDescriptor<?> constraint : p.getConstraintDescriptors()) {
+      if (areConstraintDescriptorGroupsValid(constraint)) {
+        sw.println(","); // Print the , for the previous line
+        sw.print(constraintDescriptorVar(p.getPropertyName(), count));
+        count++;
+      }
     }
     sw.println(");");
 
@@ -1395,7 +1458,7 @@
       sw.print("validate(myContext, ");
       sw.print(violationsVar);
       sw.print(", object, value, ");
-      sw.print("new "); // TODO(nchalko) use ConstraintValidatorFactory
+      sw.print("new ");
       sw.print(validatorClass.getCanonicalName());
       sw.print("(), ");
       sw.print(constraintDescriptorVar);
@@ -1801,81 +1864,145 @@
     sw.println("Class<?>... groups) {");
     sw.outdent();
 
-    // context = context.append("myProperty");
-    sw.print("final GwtValidationContext<T> myContext = context.append(\"");
-    sw.print(p.getPropertyName());
-    sw.println("\");");
+    // only write the checks if the property is constrained in some way
+    if (isPropertyConstrained(p, useField)) {
+      // context = context.append("myProperty");
+      sw.print("final GwtValidationContext<T> myContext = context.append(\"");
+      sw.print(p.getPropertyName());
+      sw.println("\");");
+  
+      // only check this property if the TraversableResolver says we can
 
-    // TODO(nchalko) move this out of here to the Validate method
-    if (p.isCascaded() && hasValid(p, useField)) {
-
-      // if(honorValid && value != null) {
-      sw.println("if(honorValid && value != null) {");
+      // Node leafNode = myContext.getPath().getLeafNode();
+      sw.println("Node leafNode = myContext.getPath().getLeafNode();");
+      // PathImpl path = myContext.getPath().getPathWithoutLeafNode();
+      sw.println("PathImpl path = myContext.getPath().getPathWithoutLeafNode();");
+      // boolean isReachable;
+      sw.println("boolean isReachable;");
+      // try {
+      sw.println("try {");
       sw.indent();
-
-      if (isIterableOrMap(elementClass)) {
-        JClassType associationType = beanHelper.getAssociationType(p,
-            useField);
-        createBeanHelper(associationType);
-        if (Map.class.isAssignableFrom(elementClass)) {
-          writeValidateMap(sw, p);
-        } else {
-          writeValidateIterable(sw, p);
-        }
-      } else {
-        createBeanHelper(elementClass);
-
-        // if (!context.alreadyValidated(value)) {
-        sw.println(" if (!context.alreadyValidated(value)) {");
+      // isReachable = myContext.getTraversableResolver().isReachable(object, leafNode,
+      //       myContext.getRootBeanClass(), path, ElementType);
+      sw.println("isReachable = myContext.getTraversableResolver().isReachable(object, " +
+          "leafNode, myContext.getRootBeanClass(), path, " + 
+          (useField ? asLiteral(ElementType.FIELD) : asLiteral(ElementType.METHOD)) + ");");
+      // } catch (Exception e) {
+      sw.outdent();
+      sw.println("} catch (Exception e) {");
+      sw.indent();
+      // throw new ValidationException("TraversableResolver isReachable caused an exception", e);
+      sw.println("throw new ValidationException(\"TraversableResolver isReachable caused an " +
+          "exception\", e);");
+      // }
+      sw.outdent();
+      sw.println("}");
+      // if (isReachable) {
+      sw.println("if (isReachable) {");
+      sw.indent();
+  
+      // TODO(nchalko) move this out of here to the Validate method
+      if (p.isCascaded() && hasValid(p, useField)) {
+  
+        // if (honorValid && value != null) {
+        sw.println("if (honorValid && value != null) {");
         sw.indent();
-
-        // violations.addAll(myContext.getValidator().validate(context, value,
-        // groups));
-        sw.print("violations.addAll(");
-        sw.println("myContext.getValidator().validate(myContext, value, groups));");
+        // boolean isCascadable;
+        sw.println("boolean isCascadable;");
+        // try {
+        sw.println("try {");
+        sw.indent();
+        // isCascadable = myContext.getTraversableResolver().isCascadable(object, leafNode,
+        //       myContext.getRootBeanClass(), path, ElementType)
+        sw.println("isCascadable = myContext.getTraversableResolver().isCascadable(object, " +
+            "leafNode, myContext.getRootBeanClass(), path, " + 
+          (useField ? asLiteral(ElementType.FIELD) : asLiteral(ElementType.METHOD)) + ");");
+        // } catch (Exception e) {
+        sw.outdent();
+        sw.println("} catch (Exception e) {");
+        sw.indent();
+        // throw new ValidationException("TraversableResolver isReachable caused an exception", e);
+        sw.println("throw new ValidationException(\"TraversableResolver isCascadable caused an " +
+            "exception\", e);");
+        // }
+        sw.outdent();
+        sw.println("}");
+        // if (isCascadable) {
+        sw.println("if (isCascadable) {");
+        sw.indent();
+  
+        if (isIterableOrMap(elementClass)) {
+          JClassType associationType = beanHelper.getAssociationType(p,
+              useField);
+          createBeanHelper(associationType);
+          if (Map.class.isAssignableFrom(elementClass)) {
+            writeValidateMap(sw, p);
+          } else {
+            writeValidateIterable(sw, p);
+          }
+        } else {
+          createBeanHelper(elementClass);
+  
+          // if (!context.alreadyValidated(value)) {
+          sw.println(" if (!context.alreadyValidated(value)) {");
+          sw.indent();
+  
+          // violations.addAll(myContext.getValidator().validate(context, value,
+          // groups));
+          sw.print("violations.addAll(");
+          sw.println("myContext.getValidator().validate(myContext, value, groups));");
+  
+          // }
+          sw.outdent();
+          sw.println("}");
+        }
 
         // }
         sw.outdent();
         sw.println("}");
+        // }
+        sw.outdent();
+        sw.println("}");
       }
-
+  
+      // It is possible for an annotation with the exact same values to be set on
+      // both the field and the getter.
+      // Keep track of the ones we have used to make sure we don't duplicate.
+      Set<Object> includedAnnotations = Sets.newHashSet();
+      int count = 0;
+      for (ConstraintDescriptor<?> constraint : p.getConstraintDescriptors()) {
+        if (areConstraintDescriptorGroupsValid(constraint)) {
+          Object annotation = constraint.getAnnotation();
+          if (hasMatchingAnnotation(p, useField, constraint)) {
+            String constraintDescriptorVar = constraintDescriptorVar(p.getPropertyName(), count);
+            if (!includedAnnotations.contains(annotation)) {
+              if (useField) {
+                writeValidateConstraint(sw, p, elementClass, constraint, constraintDescriptorVar);
+              } else {
+                // The annotation hasn't been looked at twice (yet) and we are validating a getter
+                // Write the call if only the getter has this constraint applied to it
+                boolean hasField = beanHelper.hasField(p);
+                if (!hasField ||
+                    (hasField && !hasMatchingAnnotation(p, true, constraint))) {
+                  writeValidateConstraint(sw, p, elementClass, constraint, constraintDescriptorVar);
+                }
+              }
+            } else {
+              // The annotation has been looked at once already during this validate property call
+              // so we know the field and the getter are both annotated with the same constraint.
+              if (!useField) {
+                writeValidateConstraint(sw, p, elementClass, constraint, constraintDescriptorVar);
+              }
+            }
+            includedAnnotations.add(annotation);
+          }
+          count++;
+        }
+      }
       // }
       sw.outdent();
       sw.println("}");
     }
-
-    // It is possible for an annotation with the exact same values to be set on
-    // both the field and the getter.
-    // Keep track of the ones we have used to make sure we don't duplicate.
-    Set<Object> includedAnnotations = Sets.newHashSet();
-    int count = 0;
-    for (ConstraintDescriptor<?> constraint : p.getConstraintDescriptors()) {
-      Object annotation = constraint.getAnnotation();
-      if (hasMatchingAnnotation(p, useField, constraint)) {
-        String constraintDescriptorVar = constraintDescriptorVar(p.getPropertyName(), count);
-        if (!includedAnnotations.contains(annotation)) {
-          if (useField) {
-            writeValidateConstraint(sw, p, elementClass, constraint, constraintDescriptorVar);
-          } else {
-            // The annotation hasn't been looked at twice (yet) and we are validating a getter
-            // Write the call if only the getter has this constraint applied to it
-            boolean hasField = beanHelper.hasField(p);
-            if (!hasField ||
-                (hasField && !hasMatchingAnnotation(p, true, constraint))) {
-              writeValidateConstraint(sw, p, elementClass, constraint, constraintDescriptorVar);
-            }
-          }
-        } else {
-          // The annotation has been looked at once already during this validate property call
-          // so we know the field and the getter are both annotated with the same constraint.
-          if (!useField) {
-            writeValidateConstraint(sw, p, elementClass, constraint, constraintDescriptorVar);
-          }
-        }
-        includedAnnotations.add(annotation);
-      }
-      count++;
-    }
     sw.outdent();
     sw.println("}");
   }
@@ -1932,7 +2059,7 @@
   private void writeValidatorCall(SourceWriter sw, Class<?> type, Stage stage,
       PropertyDescriptor p, boolean expandDefaultGroupSequence, String groupsVarName)
       throws UnableToCompleteException {
-    if (BeanHelper.isClassConstrained(type) && !isIterableOrMap(type)) {
+    if (cache.isClassConstrained(type) && !isIterableOrMap(type)) {
       BeanHelper helper = createBeanHelper(type);
       beansToValidate.add(helper);
       switch (stage) {
@@ -1985,4 +2112,4 @@
       sw.println();
     }
   }
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorGenerator.java b/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorGenerator.java
deleted file mode 100644
index 357baff..0000000
--- a/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorGenerator.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.validation.rebind;
-
-import com.google.gwt.core.ext.Generator;
-import com.google.gwt.core.ext.GeneratorContext;
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.typeinfo.JClassType;
-import com.google.gwt.core.ext.typeinfo.JParameterizedType;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
-import com.google.gwt.validation.client.impl.GwtSpecificValidator;
-
-/**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
- * Generates a {@link com.google.gwt.validation.client.GwtSpecificValidator}.
- * <p>
- * This class is thread safe.
- */
-public final class GwtSpecificValidatorGenerator extends Generator {
-
-  @Override
-  public String generate(TreeLogger logger, GeneratorContext context,
-      String typeName) throws UnableToCompleteException {
-    JClassType validatorType = context.getTypeOracle().findType(typeName);
-    TypeOracle typeOracle = context.getTypeOracle();
-    assert (typeOracle != null);
-
-    JClassType validator = typeOracle.findType(typeName);
-    if (validator == null) {
-      logger.log(TreeLogger.ERROR, "Unable to find metadata for type '"
-          + typeName + "'", null);
-      throw new UnableToCompleteException();
-    }
-
-    JClassType gwtSpecificInterface = getGwtSpecificValidator(logger, validator);
-    JClassType beanType = getBeanType(logger, validator, gwtSpecificInterface);
-
-    BeanHelper beanHelper = BeanHelper.createBeanHelper(beanType,logger,context);
-
-    if (beanHelper == null) {
-      logger.log(TreeLogger.ERROR, "Unable to create BeanHelper for " + beanType
-          + " " + GwtSpecificValidator.class.getSimpleName()
-          + ".", null);
-      throw new UnableToCompleteException();
-    }
-
-    AbstractCreator creator = new GwtSpecificValidatorCreator(validatorType,
-        beanType, beanHelper, logger, context);
-    return creator.create();
-  }
-
-  private JClassType getBeanType(TreeLogger logger, JClassType validator,
-      JClassType gwtSpecificInterface) throws UnableToCompleteException {
-    if (gwtSpecificInterface instanceof JParameterizedType) {
-      JParameterizedType paramType = (JParameterizedType) gwtSpecificInterface;
-      return paramType.getTypeArgs()[0];
-    }
-    logger.log(TreeLogger.ERROR, validator.getQualifiedSourceName()
-        + " must implement " + GwtSpecificValidator.class.getCanonicalName()
-        + " with a one generic parameter.", null);
-    throw new UnableToCompleteException();
-  }
-
-  private JClassType getGwtSpecificValidator(TreeLogger logger,
-      JClassType validator) throws UnableToCompleteException {
-    for (JClassType interfaceType : validator.getImplementedInterfaces()) {
-      if (interfaceType.getQualifiedSourceName().endsWith(
-          GwtSpecificValidator.class.getCanonicalName())) {
-        return interfaceType;
-      }
-    }
-    logger.log(TreeLogger.ERROR, validator.getQualifiedSourceName()
-        + " must implement " + GwtSpecificValidator.class.getCanonicalName(),
-        null);
-    throw new UnableToCompleteException();
-  }
-}
diff --git a/user/src/com/google/gwt/validation/rebind/Util.java b/user/src/com/google/gwt/validation/rebind/Util.java
index 32e62a3..f24b653 100644
--- a/user/src/com/google/gwt/validation/rebind/Util.java
+++ b/user/src/com/google/gwt/validation/rebind/Util.java
@@ -30,9 +30,6 @@
 import java.util.Set;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Static utilities for the validation rebind package.
  */
 final class Util {
@@ -50,6 +47,7 @@
       final Iterable<T> source, final Function<T, Class<?>> toClass) {
     return new Predicate<T>() {
 
+      @Override
       public boolean apply(T input) {
         Class<?> inputClass = toClass.apply(input);
         for (Class<?> match : Iterables.transform(source, toClass)) {
diff --git a/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java b/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java
index a805ab3..3944e19 100644
--- a/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java
+++ b/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java
@@ -25,11 +25,11 @@
 import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
 import com.google.gwt.user.rebind.SourceWriter;
 import com.google.gwt.validation.client.GwtValidation;
-import com.google.gwt.validation.client.ValidationGroupsMetadata;
 import com.google.gwt.validation.client.impl.AbstractGwtValidator;
 import com.google.gwt.validation.client.impl.GwtBeanDescriptor;
 import com.google.gwt.validation.client.impl.GwtSpecificValidator;
 import com.google.gwt.validation.client.impl.GwtValidationContext;
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadata;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -43,10 +43,7 @@
 import javax.validation.metadata.BeanDescriptor;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
- * Class that creates the validator for the given input class.
+ * Creates the validator for the given input class.
  */
 public final class ValidatorCreator extends AbstractCreator {
 
@@ -59,8 +56,9 @@
   public ValidatorCreator(JClassType validatorType, //
       GwtValidation gwtValidation, //
       TreeLogger logger, //
-      GeneratorContext context) throws UnableToCompleteException {
-    super(context, logger, validatorType);
+      GeneratorContext context,
+      BeanHelperCache cache) throws UnableToCompleteException {
+    super(context, logger, validatorType, cache);
     this.gwtValidation = gwtValidation;
 
     List<BeanHelper> temp = Lists.newArrayList();
@@ -142,6 +140,9 @@
     // getMessageInterpolator(),
     sw.println("getMessageInterpolator(), ");
 
+    // getTraversableResolver(),
+    sw.println("getTraversableResolver(), ");
+
     // this);
     sw.println("this);");
     sw.outdent();
@@ -242,8 +243,7 @@
     sw.println("checkNotNull(groups, \"groups\");");
     sw.println("checkGroups(groups);");
 
-    for (BeanHelper bean : Util.sortMostSpecificFirst(
-        BeanHelper.getBeanHelpers().values(), BeanHelper.TO_CLAZZ)) {
+    for (BeanHelper bean : cache.getAllBeans()) {
       writeGwtValidate(sw, bean);
     }
 
diff --git a/user/src/com/google/gwt/validation/rebind/ValidatorGenerator.java b/user/src/com/google/gwt/validation/rebind/ValidatorGenerator.java
index 41e97c7..75727be 100644
--- a/user/src/com/google/gwt/validation/rebind/ValidatorGenerator.java
+++ b/user/src/com/google/gwt/validation/rebind/ValidatorGenerator.java
@@ -20,32 +20,73 @@
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.core.ext.typeinfo.JParameterizedType;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
 import com.google.gwt.validation.client.GwtValidation;
+import com.google.gwt.validation.client.impl.GwtSpecificValidator;
+
+import javax.validation.Validator;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
- * Generates the generic {@link javax.validation.Validator}. The generic
+ * Generates subclasses of {@link Validator} and {@link GwtSpecificValidator}. The generic
  * validator only handles the classes listed in the
  * {@link com.google.gwt.validation.client.GwtValidation} annotation. See
  * {@link com.google.gwt.validation.client.GwtValidation} for usage.
  */
 public final class ValidatorGenerator extends Generator {
 
+  private final BeanHelperCache cache;
+  private Class<?>[] validGroups;
+
+  // called by the compiler via reflection
+  public ValidatorGenerator() {
+    this.cache = new BeanHelperCache();
+    this.validGroups = new Class<?>[]{ };
+  }
+
+  // called from tests
+  public ValidatorGenerator(BeanHelperCache cache, Class<?>[] validGroups) {
+    this.cache = cache;
+    this.validGroups = validGroups;
+  }
+
   @Override
   public String generate(TreeLogger logger, GeneratorContext context,
       String typeName) throws UnableToCompleteException {
     TypeOracle typeOracle = context.getTypeOracle();
     assert (typeOracle != null);
 
-    JClassType validatorType = typeOracle.findType(typeName);
-    if (validatorType == null) {
+    JClassType validatorType = findType(logger, typeOracle, typeName);
+    JClassType genericType = findType(logger, typeOracle, Validator.class.getName());
+    JClassType gwtSpecificType =
+        findType(logger, typeOracle, GwtSpecificValidator.class.getName());
+
+    if (validatorType.isAssignableTo(genericType)) {
+      return generateGenericValidator(logger, context, validatorType);
+    } else if (validatorType.isAssignableTo(gwtSpecificType)) {
+      return generateGwtSpecificValidator(logger, context, validatorType);
+    } else {
+      logger.log(TreeLogger.ERROR,
+          "type is not a ValidatorGenerator or GwtSpecificValidatorGenerator: '" + typeName + "'",
+          null);
+      throw new UnableToCompleteException();
+    }
+  }
+
+  private JClassType findType(TreeLogger logger, TypeOracle typeOracle, String typeName)
+      throws UnableToCompleteException {
+    JClassType result = typeOracle.findType(typeName);
+    if (result == null) {
       logger.log(TreeLogger.ERROR, "Unable to find metadata for type '"
           + typeName + "'", null);
       throw new UnableToCompleteException();
     }
+    return result;
+  }
+
+  private String generateGenericValidator(TreeLogger logger, GeneratorContext context,
+      JClassType validatorType) throws UnableToCompleteException {
+    String typeName = validatorType.getName();
 
     GwtValidation gwtValidation = validatorType.findAnnotationInTypeHierarchy(GwtValidation.class);
 
@@ -69,13 +110,61 @@
       throw new UnableToCompleteException();
     }
 
+    this.validGroups = gwtValidation.groups();
+
     TreeLogger validatorLogger = logger.branch(TreeLogger.DEBUG,
         "Generating Validator for  '" + validatorType.getQualifiedSourceName()
             + "'", null);
     AbstractCreator creator = new ValidatorCreator(validatorType,
         gwtValidation,
         validatorLogger,
-        context);
+        context, cache);
     return creator.create();
   }
+
+  private String generateGwtSpecificValidator(TreeLogger logger, GeneratorContext context,
+      JClassType validatorType) throws UnableToCompleteException {
+
+    JClassType gwtSpecificInterface = getGwtSpecificValidator(logger, validatorType);
+    JClassType beanType = getBeanType(logger, validatorType, gwtSpecificInterface);
+
+    BeanHelper beanHelper = cache.createHelper(beanType, logger, context);
+
+    if (beanHelper == null) {
+      logger.log(TreeLogger.ERROR, "Unable to create BeanHelper for " + beanType
+          + " " + GwtSpecificValidator.class.getSimpleName()
+          + ".", null);
+      throw new UnableToCompleteException();
+    }
+
+    AbstractCreator creator = new GwtSpecificValidatorCreator(validatorType,
+        beanType, beanHelper, logger, context, cache, validGroups);
+    return creator.create();
+  }
+
+  private JClassType getBeanType(TreeLogger logger, JClassType validator,
+      JClassType gwtSpecificInterface) throws UnableToCompleteException {
+    if (gwtSpecificInterface instanceof JParameterizedType) {
+      JParameterizedType paramType = (JParameterizedType) gwtSpecificInterface;
+      return paramType.getTypeArgs()[0];
+    }
+    logger.log(TreeLogger.ERROR, validator.getQualifiedSourceName()
+        + " must implement " + GwtSpecificValidator.class.getCanonicalName()
+        + " with a one generic parameter.", null);
+    throw new UnableToCompleteException();
+  }
+
+  private JClassType getGwtSpecificValidator(TreeLogger logger,
+      JClassType validator) throws UnableToCompleteException {
+    for (JClassType interfaceType : validator.getImplementedInterfaces()) {
+      if (interfaceType.getQualifiedSourceName().endsWith(
+          GwtSpecificValidator.class.getCanonicalName())) {
+        return interfaceType;
+      }
+    }
+    logger.log(TreeLogger.ERROR, validator.getQualifiedSourceName()
+        + " must implement " + GwtSpecificValidator.class.getCanonicalName(),
+        null);
+    throw new UnableToCompleteException();
+  }
 }
diff --git a/user/src/com/google/gwt/validation/super/com/google/gwt/validation/client/GwtMessageInterpolator.java b/user/src/com/google/gwt/validation/super/com/google/gwt/validation/client/GwtMessageInterpolator.java
index e7a2c11..27f0c72 100644
--- a/user/src/com/google/gwt/validation/super/com/google/gwt/validation/client/GwtMessageInterpolator.java
+++ b/user/src/com/google/gwt/validation/super/com/google/gwt/validation/client/GwtMessageInterpolator.java
@@ -21,9 +21,6 @@
 import javax.validation.MessageInterpolator.Context;
 
 /**
- * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
- * production code.
- * <p>
  * Simple GWT {@link javax.validation.MessageInterpolator}.
  */
 public final class GwtMessageInterpolator extends BaseMessageInterpolator {
diff --git a/user/src/com/google/gwt/view/client/MultiSelectionModel.java b/user/src/com/google/gwt/view/client/MultiSelectionModel.java
index a782c0d..1beac98 100644
--- a/user/src/com/google/gwt/view/client/MultiSelectionModel.java
+++ b/user/src/com/google/gwt/view/client/MultiSelectionModel.java
@@ -27,7 +27,8 @@
  * 
  * @param <T> the data type of the items
  */
-public class MultiSelectionModel<T> extends AbstractSelectionModel<T> {
+public class MultiSelectionModel<T> extends AbstractSelectionModel<T>
+    implements SetSelectionModel<T> {
 
   /**
    * Stores an item and its pending selection state.
@@ -97,6 +98,7 @@
   /**
    * Deselect all selected values.
    */
+  @Override
   public void clear() {
     // Clear the current list of pending changes.
     selectionChanges.clear();
@@ -119,6 +121,7 @@
    * 
    * @return the set of selected items
    */
+  @Override
   public Set<T> getSelectedSet() {
     resolveChanges();
     return new HashSet<T>(selectedSet.values());
diff --git a/user/src/com/google/gwt/view/client/SelectionModel.java b/user/src/com/google/gwt/view/client/SelectionModel.java
index 9768b8f..026165a 100644
--- a/user/src/com/google/gwt/view/client/SelectionModel.java
+++ b/user/src/com/google/gwt/view/client/SelectionModel.java
@@ -61,15 +61,18 @@
       this.keyProvider = keyProvider;
     }
 
+    @Override
     public HandlerRegistration addSelectionChangeHandler(
         SelectionChangeEvent.Handler handler) {
       return handlerManager.addHandler(SelectionChangeEvent.getType(), handler);
     }
 
+    @Override
     public void fireEvent(GwtEvent<?> event) {
       handlerManager.fireEvent(event);
     }
 
+    @Override
     public Object getKey(T item) {
       return (keyProvider == null || item == null) ? item
           : keyProvider.getKey(item);
@@ -159,6 +162,7 @@
    * @param handler the handler
    * @return the registration for the event
    */
+  @Override
   HandlerRegistration addSelectionChangeHandler(SelectionChangeEvent.Handler handler);
 
   /**
diff --git a/user/src/com/google/gwt/view/client/SetSelectionModel.java b/user/src/com/google/gwt/view/client/SetSelectionModel.java
new file mode 100644
index 0000000..7149cbb
--- /dev/null
+++ b/user/src/com/google/gwt/view/client/SetSelectionModel.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.view.client;
+
+import java.util.Set;
+
+/**
+ * A model that allows getting all elements and clearing the selection.
+ *
+ * @param <T> the record data type
+ */
+public interface SetSelectionModel<T> extends SelectionModel<T> {
+  /**
+   * Clears the current selection.
+   */
+  void clear();
+
+  /**
+   * Get the set of selected items.
+   *
+   * @return the set of selected items
+   */
+  Set<T> getSelectedSet();
+}
diff --git a/user/src/com/google/gwt/view/client/SingleSelectionModel.java b/user/src/com/google/gwt/view/client/SingleSelectionModel.java
index b92aba6..c34c338 100644
--- a/user/src/com/google/gwt/view/client/SingleSelectionModel.java
+++ b/user/src/com/google/gwt/view/client/SingleSelectionModel.java
@@ -17,12 +17,16 @@
 
 import com.google.gwt.view.client.SelectionModel.AbstractSelectionModel;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * A simple selection model that allows only one item to be selected a a time.
  * 
  * @param <T> the record data type
  */
-public class SingleSelectionModel<T> extends AbstractSelectionModel<T> {
+public class SingleSelectionModel<T> extends AbstractSelectionModel<T>
+    implements SetSelectionModel<T> {
 
   private Object curKey;
   private T curSelection;
@@ -49,6 +53,11 @@
     super(keyProvider);
   }
 
+  @Override
+  public void clear() {
+    setSelected(getSelectedObject(), false);
+  }
+
   /**
    * Gets the currently-selected item.
    * 
@@ -60,6 +69,15 @@
   }
 
   @Override
+  public Set<T> getSelectedSet() {
+    Set<T> set = new HashSet<T>();
+    if (curSelection != null) {
+      set.add(curSelection);
+    }
+    return set;
+  }
+
+  @Override
   public boolean isSelected(T item) {
     resolveChanges();
     if (curSelection == null || curKey == null || item == null) {
diff --git a/user/src/com/google/gwt/widget/Widget.gwt.xml b/user/src/com/google/gwt/widget/Widget.gwt.xml
index 4807934..9e15320 100644
--- a/user/src/com/google/gwt/widget/Widget.gwt.xml
+++ b/user/src/com/google/gwt/widget/Widget.gwt.xml
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN"
-  "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2011 Google Inc.
 
diff --git a/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java b/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
index 925c33a..d3e4c95 100644
--- a/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
+++ b/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
@@ -56,12 +56,17 @@
     Text("text");
     */
 
-    protected final String responseTypeString;
+    private final String responseTypeString;
 
     private ResponseType(String responseTypeString) {
       this.responseTypeString = responseTypeString;
     }
+
+    public String getResponseTypeString() {
+      return responseTypeString;
+    }
   }
+
   /*
    * NOTE: Testing discovered that for some bizarre reason, on Mozilla, the
    * JavaScript <code>XmlHttpRequest.onreadystatechange</code> handler
@@ -116,27 +121,7 @@
    * 
    * @return the created object
    */
-  public static XMLHttpRequest create() {
-    return create(ResponseType.Default);
-  }
-
-  /**
-   * Creates an XMLHttpRequest object.
-   * 
-   * @param responseType the type of response desired.  See {@link ResponseType}
-   *     for limitations on using the different values
-   * @return the created object
-   */
-  public static XMLHttpRequest create(ResponseType responseType) {
-    return create(responseType.responseTypeString);
-  }
-
-  /**
-   * Creates an XMLHttpRequest object.
-   * 
-   * @return the created object
-   */
-  private static native XMLHttpRequest create(String responseType) /*-{
+  public static native XMLHttpRequest create() /*-{
     // Don't check window.XMLHttpRequest, because it can
     // cause cross-site problems on IE8 if window's URL
     // is javascript:'' .
@@ -150,9 +135,6 @@
         xhr = new $wnd.ActiveXObject("Microsoft.XMLHTTP");
       }
     }
-    if (xhr && responseType) {
-      xhr.responsetype = responseType;
-    }
     return xhr;
   }-*/;
 
@@ -162,8 +144,8 @@
   /**
    * Aborts the current request.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#abort"
-   * >http://www.w3.org/TR/XMLHttpRequest/#abort</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-abort-method"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-abort-method</a>.
    */
   public final native void abort() /*-{
     this.abort();
@@ -172,8 +154,8 @@
   /**
    * Clears the {@link ReadyStateChangeHandler}.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#onreadystatechange"
-   * >http://www.w3.org/TR/XMLHttpRequest/#onreadystatechange</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#handler-xhr-onreadystatechange"
+   * >http://www.w3.org/TR/XMLHttpRequest/#handler-xhr-onreadystatechange</a>.
    * 
    * @see #clearOnReadyStateChange()
    */
@@ -189,8 +171,8 @@
   /**
    * Gets all the HTTP response headers, as a single string.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#getallresponseheaders"
-   * >http://www.w3.org/TR/XMLHttpRequest/#getallresponseheaders</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders-method"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders-method</a>.
    * 
    * @return the response headers.
    */
@@ -201,8 +183,8 @@
   /**
    * Get's the current ready-state.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#readystate"
-   * >http://www.w3.org/TR/XMLHttpRequest/#readystate</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-readystate"
+   * >http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-state</a>.
    * 
    * @return the ready-state constant
    */
@@ -223,8 +205,8 @@
   /**
    * Gets an HTTP response header.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#getresponseheader"
-   * >http://www.w3.org/TR/XMLHttpRequest/#getresponseheader</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader-method"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader-method</a>.
    * 
    * @param header the response header to be retrieved
    * @return the header value
@@ -236,8 +218,8 @@
   /**
    * Gets the response text.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#responsetext"
-   * >http://www.w3.org/TR/XMLHttpRequest/#responsetext</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-responsetext-attribute"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-responsetext-attribute</a>.
    * 
    * @return the response text
    */
@@ -246,10 +228,22 @@
   }-*/;
 
   /**
+   * Gets the response type.
+   * <p>
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute</a>
+   *
+   * @return the response type
+   */
+  public final native String getResponseType() /*-{
+    return this.responseType || "";
+  }-*/;
+
+  /**
    * Gets the status code.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#status"
-   * >http://www.w3.org/TR/XMLHttpRequest/#status</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute</a>.
    * 
    * @return the status code
    */
@@ -260,8 +254,8 @@
   /**
    * Gets the status text.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#statustext"
-   * >http://www.w3.org/TR/XMLHttpRequest/#statustext</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-statustext-attribute"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-statustext-attribute</a>.
    * 
    * @return the status text
    */
@@ -272,8 +266,8 @@
   /**
    * Opens an asynchronous connection.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#open"
-   * >http://www.w3.org/TR/XMLHttpRequest/#open</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-open-method"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-open-method</a>.
    * 
    * @param httpMethod the HTTP method to use
    * @param url the URL to be opened
@@ -285,8 +279,8 @@
   /**
    * Opens an asynchronous connection.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#open"
-   * >http://www.w3.org/TR/XMLHttpRequest/#open</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-open-method"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-open-method</a>.
    * 
    * @param httpMethod the HTTP method to use
    * @param url the URL to be opened
@@ -299,8 +293,8 @@
   /**
    * Opens an asynchronous connection.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#open"
-   * >http://www.w3.org/TR/XMLHttpRequest/#open</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-open-method"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-open-method</a>.
    * 
    * @param httpMethod the HTTP method to use
    * @param url the URL to be opened
@@ -324,8 +318,8 @@
   /**
    * Initiates a request with data.  If there is no data, specify null.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#send"
-   * >http://www.w3.org/TR/XMLHttpRequest/#send</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-send-method"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-send-method</a>.
    * 
    * @param requestData the data to be sent with the request
    */
@@ -337,8 +331,8 @@
    * Sets the {@link ReadyStateChangeHandler} to be notified when the object's
    * ready-state changes.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#onreadystatechange"
-   * >http://www.w3.org/TR/XMLHttpRequest/#onreadystatechange</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#handler-xhr-onreadystatechange"
+   * >http://www.w3.org/TR/XMLHttpRequest/#handler-xhr-onreadystatechange</a>.
    * 
    * <p>
    * Note: Applications <em>must</em> call {@link #clearOnReadyStateChange()}
@@ -361,8 +355,8 @@
   /**
    * Sets a request header.
    * <p>
-   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#setrequestheader"
-   * >http://www.w3.org/TR/XMLHttpRequest/#setrequestheader</a>.
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method</a>.
    * 
    * @param header the header to be set
    * @param value the header's value
@@ -370,4 +364,30 @@
   public final native void setRequestHeader(String header, String value) /*-{
     this.setRequestHeader(header, value);
   }-*/;
+
+  /**
+   * Sets the response type.
+   * <p>
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute</a>
+   *
+   * @param responseType the type of response desired.  See {@link ResponseType}
+   *     for limitations on using the different values
+   */
+  public final void setResponseType(ResponseType responseType) {
+    this.setResponseType(responseType.getResponseTypeString());
+  }
+
+  /**
+   * Sets the response type.
+   * <p>
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute</a>
+   *
+   * @param responseType the type of response desired.  See {@link ResponseType}
+   *     for limitations on using the different values
+   */
+  public final native void setResponseType(String responseType) /*-{
+    this.responseType = responseType;
+  }-*/;
 }
diff --git a/user/src/com/google/web/bindery/autobean/shared/ValueCodexHelper.java b/user/src/com/google/web/bindery/autobean/shared/ValueCodexHelper.java
index fb9fcc9..82aef51 100644
--- a/user/src/com/google/web/bindery/autobean/shared/ValueCodexHelper.java
+++ b/user/src/com/google/web/bindery/autobean/shared/ValueCodexHelper.java
@@ -15,7 +15,7 @@
  */
 package com.google.web.bindery.autobean.shared;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 
 /**
  * Provides reflection-based operation for server (JVM) implementation. There is
diff --git a/user/src/com/google/web/bindery/autobean/shared/impl/AutoBeanCodexImpl.java b/user/src/com/google/web/bindery/autobean/shared/impl/AutoBeanCodexImpl.java
index 78b4f2e..5170f2b 100644
--- a/user/src/com/google/web/bindery/autobean/shared/impl/AutoBeanCodexImpl.java
+++ b/user/src/com/google/web/bindery/autobean/shared/impl/AutoBeanCodexImpl.java
@@ -515,16 +515,18 @@
   }
 
   public static Coder doCoderFor(AutoBean<?> bean, String propertyName) {
-    String key = key(bean, propertyName);
-    Coder toReturn = coderFor.get(key);
-    if (toReturn == null) {
-      bean.accept(new PropertyCoderCreator());
-      toReturn = coderFor.get(key);
+    synchronized (coderFor) {
+      String key = key(bean, propertyName);
+      Coder toReturn = coderFor.get(key);
       if (toReturn == null) {
-        throw new IllegalArgumentException(propertyName);
+        bean.accept(new PropertyCoderCreator());
+        toReturn = coderFor.get(key);
+        if (toReturn == null) {
+          throw new IllegalArgumentException(propertyName);
+        }
       }
+      return toReturn;
     }
-    return toReturn;
   }
 
   public static <T> AutoBean<T> doDecode(EncodeState state, Class<T> clazz, Splittable data) {
@@ -562,12 +564,14 @@
   }
 
   public static <E extends Enum<?>> Coder enumCoder(Class<E> type) {
-    Coder toReturn = coders.get(type);
-    if (toReturn == null) {
-      toReturn = new EnumCoder<E>(type);
-      coders.put(type, toReturn);
+    synchronized (coders) {
+      Coder toReturn = coders.get(type);
+      if (toReturn == null) {
+        toReturn = new EnumCoder<E>(type);
+        coders.put(type, toReturn);
+      }
+      return toReturn;
     }
-    return toReturn;
   }
 
   public static Coder mapCoder(Coder valueCoder, Coder keyCoder) {
@@ -575,12 +579,14 @@
   }
 
   public static Coder objectCoder(Class<?> type) {
-    Coder toReturn = coders.get(type);
-    if (toReturn == null) {
-      toReturn = new ObjectCoder(type);
-      coders.put(type, toReturn);
+    synchronized (coders) {
+      Coder toReturn = coders.get(type);
+      if (toReturn == null) {
+        toReturn = new ObjectCoder(type);
+        coders.put(type, toReturn);
+      }
+      return toReturn;
     }
-    return toReturn;
   }
 
   public static Coder splittableCoder() {
@@ -588,12 +594,14 @@
   }
 
   public static Coder valueCoder(Class<?> type) {
-    Coder toReturn = coders.get(type);
-    if (toReturn == null) {
-      toReturn = new ValueCoder(type);
-      coders.put(type, toReturn);
+    synchronized (coders) {
+      Coder toReturn = coders.get(type);
+      if (toReturn == null) {
+        toReturn = new ValueCoder(type);
+        coders.put(type, toReturn);
+      }
+      return toReturn;
     }
-    return toReturn;
   }
 
   static Splittable tryExtractSplittable(Object value) {
diff --git a/user/src/com/google/web/bindery/requestfactory/RequestFactory.gwt.xml b/user/src/com/google/web/bindery/requestfactory/RequestFactory.gwt.xml
index f55cc8d..583868a 100644
--- a/user/src/com/google/web/bindery/requestfactory/RequestFactory.gwt.xml
+++ b/user/src/com/google/web/bindery/requestfactory/RequestFactory.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractRequestFactoryEditorDriver.java b/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractRequestFactoryEditorDriver.java
index fa7aa35..330ec43 100644
--- a/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractRequestFactoryEditorDriver.java
+++ b/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractRequestFactoryEditorDriver.java
@@ -196,7 +196,7 @@
   @SuppressWarnings("deprecation")
   public boolean setViolations(
       Iterable<com.google.web.bindery.requestfactory.shared.Violation> violations) {
-    return doSetViolations(new ViolationIterable(violations));
+    return doSetViolations(violations == null ? null : new ViolationIterable(violations));
   }
 
   protected void checkSaveRequest() {
diff --git a/user/src/com/google/web/bindery/requestfactory/vm/impl/ClassComparator.java b/user/src/com/google/web/bindery/requestfactory/vm/impl/ClassComparator.java
new file mode 100644
index 0000000..a3f142b
--- /dev/null
+++ b/user/src/com/google/web/bindery/requestfactory/vm/impl/ClassComparator.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.web.bindery.requestfactory.vm.impl;
+
+import java.util.Comparator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Orders classes by assignability, with most-derived types ordered first, and then by name.
+ */
+class ClassComparator implements Comparator<String> {
+  private static final Logger log = Logger.getLogger(ClassComparator.class.getName());
+
+  private final ClassLoader resolveClassesWith;
+
+  public ClassComparator(ClassLoader resolveClassesWith) {
+    this.resolveClassesWith = resolveClassesWith;
+  }
+
+  @Override
+  public int compare(String className1, String className2) {
+    Class<?> class1 = forName(className1);
+    Class<?> class2 = forName(className2);
+    if (class1.equals(class2)) {
+      return 0;
+    } else if (class1.isAssignableFrom(class2)) {
+      return 1;
+    } else if (class2.isAssignableFrom(class1)) {
+      return -1;
+    }
+    return className1.compareTo(className2);
+  }
+
+  private Class<?> forName(String name) {
+    try {
+      return Class.forName(name, false, resolveClassesWith);
+    } catch (ClassNotFoundException e) {
+      String msg = "Could not locate class " + name;
+      log.log(Level.SEVERE, msg, e);
+      throw new RuntimeException(msg, e);
+    }
+  }
+};
diff --git a/user/src/com/google/web/bindery/requestfactory/vm/impl/Deobfuscator.java b/user/src/com/google/web/bindery/requestfactory/vm/impl/Deobfuscator.java
index 5c16de1..c70b63e 100644
--- a/user/src/com/google/web/bindery/requestfactory/vm/impl/Deobfuscator.java
+++ b/user/src/com/google/web/bindery/requestfactory/vm/impl/Deobfuscator.java
@@ -1,16 +1,14 @@
 /*
  * Copyright 2011 Google Inc.
  * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
  * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
 package com.google.web.bindery.requestfactory.vm.impl;
@@ -22,11 +20,11 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 /**
- * Provides access to payload deobfuscation services for server and JVM-based
- * clients. The deobfuscation data is baked into GWT-based clients by the
- * generator.
+ * Provides access to payload deobfuscation services for server and JVM-based clients. The
+ * deobfuscation data is baked into GWT-based clients by the generator.
  */
 public class Deobfuscator {
   /**
@@ -34,9 +32,8 @@
    */
   public static class Builder {
     /**
-     * Load a pre-computed Builder from the classpath. The builder
-     * implementation is expected to have been generated by the annotation
-     * processor as part of the build process.
+     * Load a pre-computed Builder from the classpath. The builder implementation is expected to
+     * have been generated by the annotation processor as part of the build process.
      * 
      * @see com.google.web.bindery.requestfactory.apt.DeobfuscatorBuilder
      * @see com.google.web.bindery.requestfactory.server.ResolverServiceLayer
@@ -54,6 +51,7 @@
         }
         Class<? extends Builder> builderClass = found.asSubclass(Builder.class);
         Builder builder = builderClass.newInstance();
+        builder.resolveClassesWith = resolveClassesWith;
         return builder;
       } catch (ClassNotFoundException e) {
         throw new RuntimeException("The RequestFactory ValidationTool must be run for the "
@@ -66,6 +64,8 @@
       throw new RuntimeException(ex);
     }
 
+    private ClassLoader resolveClassesWith;
+
     private Deobfuscator d = new Deobfuscator();
 
     {
@@ -86,7 +86,7 @@
     }
 
     public Builder merge(Deobfuscator existing) {
-      d.domainToClientType.putAll(existing.domainToClientType);
+      d.domainToClientType.putAll(merge(d.domainToClientType, existing.domainToClientType));
       d.operationData.putAll(existing.operationData);
       // referencedTypes recomputed in build()
       d.typeTokens.putAll(existing.typeTokens);
@@ -118,14 +118,51 @@
       d.typeTokens.put(token, binaryName);
       return this;
     }
+
+    /**
+     * Merges two domainToClientType into one. Merged map's values are still ordering by
+     * assignability, with most-derived types ordered first.
+     * 
+     * @see ClassComparator
+     */
+    private Map<String, List<String>> merge(Map<String, List<String>> domainToClientType1,
+        Map<String, List<String>> domainToClientType2) {
+      Map<String, List<String>> result = new HashMap<String, List<String>>();
+      Set<String> domains = new HashSet<String>();
+      domains.addAll(domainToClientType1.keySet());
+      domains.addAll(domainToClientType2.keySet());
+      for (String domain : domains) {
+        List<String> clientTypes1 = domainToClientType1.get(domain);
+        List<String> clientTypes2 = domainToClientType2.get(domain);
+        List<String> clientTypes = mergeClientTypes(clientTypes1, clientTypes2);
+        result.put(domain, clientTypes);
+      }
+      return result;
+    }
+
+    /**
+     * Merges two clientType lists into one. Merged values are still ordering by assignability, with
+     * most-derived types ordered first.
+     * 
+     * @see ClassComparator
+     */
+    private List<String> mergeClientTypes(List<String> clientTypes1, List<String> clientTypes2) {
+      Set<String> clientTypes = new TreeSet<String>(new ClassComparator(resolveClassesWith));
+      if (clientTypes1 != null) {
+        clientTypes.addAll(clientTypes1);
+      }
+      if (clientTypes2 != null) {
+        clientTypes.addAll(clientTypes2);
+      }
+      return Collections.unmodifiableList(new ArrayList<String>(clientTypes));
+    }
   }
 
   private static final String GENERATED_SUFFIX = "DeobfuscatorBuilder";
   private static final String GENERATED_SUFFIX_LITE = GENERATED_SUFFIX + "Lite";
 
   /**
-   * Maps domain types (e.g Foo) to client proxy types (e.g. FooAProxy,
-   * FooBProxy).
+   * Maps domain types (e.g Foo) to client proxy types (e.g. FooAProxy, FooBProxy).
    */
   private Map<String, List<String>> domainToClientType;
   private Map<OperationKey, OperationData> operationData;
@@ -139,9 +176,8 @@
   }
 
   /**
-   * Returns the client proxy types whose {@code @ProxyFor} is exactly
-   * {@code binaryTypeName}. Ordered such that the most-derived types will be
-   * iterated over first.
+   * Returns the client proxy types whose {@code @ProxyFor} is exactly {@code binaryTypeName}.
+   * Ordered such that the most-derived types will be iterated over first.
    */
   public List<String> getClientProxies(String binaryTypeName) {
     return domainToClientType.get(binaryTypeName);
diff --git a/user/src/javax/validation/Validation.gwt.xml b/user/src/javax/validation/Validation.gwt.xml
index 9eec257..8a22ce1 100644
--- a/user/src/javax/validation/Validation.gwt.xml
+++ b/user/src/javax/validation/Validation.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/src/javax/validation/super/javax/validation/Validation.java b/user/src/javax/validation/super/javax/validation/Validation.java
index b1c199e..88976e8 100644
--- a/user/src/javax/validation/super/javax/validation/Validation.java
+++ b/user/src/javax/validation/super/javax/validation/Validation.java
@@ -16,7 +16,7 @@
 package javax.validation;
 
 /**
- * Pass through to GWT version {@link com.google.gwt.validation.client.Validation}.
+ * Pass through to GWT version {@link com.google.gwt.validation.client.impl.Validation}.
  */
-public class Validation  extends com.google.gwt.validation.client.impl.Validation {
+public class Validation extends com.google.gwt.validation.client.impl.Validation {
 }
diff --git a/user/test-super/org/hibernate/jsr303/tck/super/org/hibernate/jsr303/tck/util/TestUtil.java b/user/test-super/org/hibernate/jsr303/tck/super/org/hibernate/jsr303/tck/util/TestUtil.java
index 0be399c..723847b 100644
--- a/user/test-super/org/hibernate/jsr303/tck/super/org/hibernate/jsr303/tck/util/TestUtil.java
+++ b/user/test-super/org/hibernate/jsr303/tck/super/org/hibernate/jsr303/tck/util/TestUtil.java
@@ -36,7 +36,7 @@
 import javax.validation.Validator;
 import javax.validation.ValidatorFactory;
 import javax.validation.Validation;
-import javax.validation.bootstrap.ProviderSpecificBootstrap;
+import javax.validation.bootstrap.GenericBootstrap;
 import javax.validation.metadata.ConstraintDescriptor;
 import javax.validation.metadata.ElementDescriptor;
 import javax.validation.metadata.PropertyDescriptor;
@@ -79,8 +79,7 @@
       instantiateValidationProviderUnderTest();
     }
 
-    ProviderSpecificBootstrap<?> bootstrap =
-    Validation.byProvider(validationProviderUnderTest.getClass());
+    GenericBootstrap bootstrap = Validation.byDefaultProvider();
     return bootstrap.configure();
   }
 
diff --git a/user/test/com/google/gwt/aria/client/AttributeTest.java b/user/test/com/google/gwt/aria/client/AttributeTest.java
index 4ab5a8e..8d8545c 100644
--- a/user/test/com/google/gwt/aria/client/AttributeTest.java
+++ b/user/test/com/google/gwt/aria/client/AttributeTest.java
@@ -27,6 +27,7 @@
   private Attribute<Boolean> attribute2;
   private Attribute<String> attribute3;
   private Attribute<RelevantValue> attribute4;
+  private Attribute<Id> attribute5;
 
   public void testSetGetRemove_booleanValue() {
     attribute2.setDefault(div);
@@ -58,6 +59,20 @@
     assertEquals(RelevantValue.REMOVALS.getAriaValue(), attribute4.get(div));
   }
 
+  public void testSetGetRemove_idrefValue() {
+    attribute5.set(div, Id.of("1"), Id.of("2"));
+    assertEquals("1 2", attribute5.get(div));
+    attribute5.remove(div);
+    assertEquals("", attribute5.get(div));
+
+    Element ref1 = Document.get().createDivElement();
+    ref1.setId("ref1");
+    Element ref2 = Document.get().createDivElement();
+    ref2.setId("ref2");
+    attribute5.set(div, Id.of(ref1), Id.of(ref2));
+    assertEquals("ref1 ref2", attribute5.get(div));
+  }
+
   public void testSetDefaultValue_noSet() {
     try {
       attribute3.setDefault(div);
@@ -82,6 +97,7 @@
     attribute2 = new PrimitiveValueAttribute<Boolean>("attr2", "true");
     attribute3 = new PrimitiveValueAttribute<String>("attr3");
     attribute4 = new AriaValueAttribute<RelevantValue>("attr4", "additions text");
+    attribute5 = new AriaValueAttribute<Id>("attr5", "");
   }
 
   @Override
diff --git a/user/test/com/google/gwt/aria/client/RoleImplTest.java b/user/test/com/google/gwt/aria/client/RoleImplTest.java
index 4fd88f2..79831b2 100644
--- a/user/test/com/google/gwt/aria/client/RoleImplTest.java
+++ b/user/test/com/google/gwt/aria/client/RoleImplTest.java
@@ -27,16 +27,22 @@
   private RegionRole regionRole;
 
   public void testSetGetRemoveRole() {
-    assertEquals("", regionRole.get(div));
+    assertEquals(null, Roles.roleOf(div));
     regionRole.set(div);
-    assertEquals(regionRole.getName(), regionRole.get(div));
+    assertEquals(regionRole, Roles.roleOf(div));
     regionRole.remove(div);
-    assertEquals("", regionRole.get(div));
+    assertEquals(null, Roles.roleOf(div));
+    div.setAttribute("role", "region fallback1 fallback2");
+    assertEquals(regionRole, Roles.roleOf(div));
+    div.setAttribute("role", "fallback1 region fallback2");
+    assertEquals(regionRole, Roles.roleOf(div));
+    div.setAttribute("role", "fallback1 fallback2 fallback3");
+    assertEquals(null, Roles.roleOf(div));
   }
 
   public void testSetGetRemoveProperty() {
     assertEquals("", regionRole.getAriaLabelledbyProperty(div));
-    regionRole.setAriaLabelledbyProperty(div, IdReference.of("test1"));
+    regionRole.setAriaLabelledbyProperty(div, Id.of("test1"));
     assertEquals("test1", regionRole.getAriaLabelledbyProperty(div));
     regionRole.removeAriaLabelledbyProperty(div);
     assertEquals("", regionRole.getAriaLabelledbyProperty(div));
diff --git a/user/test/com/google/gwt/core/client/ScriptInjectorTest.java b/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
index e86ee4b..7596688 100644
--- a/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
+++ b/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
@@ -118,7 +118,7 @@
    */
   public void testInjectUrlAbsolute() {
     delayTestFinish(TEST_DELAY);
-    final String scriptUrl = "http://www.google.com/jsapi?key=GWTUNITEST";
+    final String scriptUrl = GWT.getModuleBaseForStaticFiles() + "script_injector_test_absolute.js";
     assertFalse(nativeInjectUrlAbsoluteWorked());
     ScriptInjector.fromUrl(scriptUrl).setCallback(new Callback<Void, Exception>() {
 
@@ -142,7 +142,7 @@
    */
   public void testInjectUrlAbsoluteTop() {
     delayTestFinish(TEST_DELAY);
-    final String scriptUrl = "http://www.google.com/jsapi?key=GWTUNITEST_ABSOLUTE";
+    final String scriptUrl = GWT.getModuleBaseForStaticFiles() + "script_injector_test_absolute_top.js";
     assertFalse(nativeAbsoluteTopUrlIsLoaded());
     ScriptInjector.fromUrl(scriptUrl).setWindow(ScriptInjector.TOP_WINDOW).setCallback(
         new Callback<Void, Exception>() {
@@ -368,7 +368,7 @@
   }
 
   private native boolean nativeAbsoluteTopUrlIsLoaded() /*-{
-    return !!$wnd.google && !!$wnd.google.load;
+    return !!$wnd["__tiabsolutetop_var__"] && $wnd["__tiabsolutetop_var__"] == 102;
   }-*/;
 
   private native JavaScriptObject nativeFindScriptText(JavaScriptObject wnd, String text) /*-{
@@ -395,7 +395,7 @@
   }-*/;
 
   private native boolean nativeInjectUrlAbsoluteWorked() /*-{
-    return !!window.google && !!window.google.load;
+    return !!window["__tiabsolute_var__"] && window["__tiabsolute_var__"] == 101;
   }-*/;
 
   private native boolean nativeTest1Worked() /*-{
diff --git a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
index cd7e41d..e4bfe0d 100644
--- a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
+++ b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
@@ -193,4 +193,12 @@
     assertEquals("functionName@@file.js:1:2",
         c.extractName(" at Type.functionName [as methodName] (file.js:1:2)"));
   }
+
+  public void testFirefox14ExtractName() {
+    StackTraceCreator.CollectorMoz c = new StackTraceCreator.CollectorMoz();
+
+    assertEquals("anonymous", c.extractName("@file.js:1"));
+    assertEquals("functionName",
+        c.extractName("functionName@file.js:1"));
+  }
 }
diff --git a/user/test/com/google/gwt/core/public/script_injector_test_absolute.js b/user/test/com/google/gwt/core/public/script_injector_test_absolute.js
new file mode 100644
index 0000000..c35d964
--- /dev/null
+++ b/user/test/com/google/gwt/core/public/script_injector_test_absolute.js
@@ -0,0 +1 @@
+__tiabsolute_var__ = 101;
\ No newline at end of file
diff --git a/user/test/com/google/gwt/core/public/script_injector_test_absolute_top.js b/user/test/com/google/gwt/core/public/script_injector_test_absolute_top.js
new file mode 100644
index 0000000..6314fab
--- /dev/null
+++ b/user/test/com/google/gwt/core/public/script_injector_test_absolute_top.js
@@ -0,0 +1 @@
+__tiabsolutetop_var__ = 102;
\ No newline at end of file
diff --git a/user/test/com/google/gwt/dev/jjs/test/CoverageTest.java b/user/test/com/google/gwt/dev/jjs/test/CoverageTest.java
index 2ba5ddd..4feb3f7 100644
--- a/user/test/com/google/gwt/dev/jjs/test/CoverageTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/CoverageTest.java
@@ -154,6 +154,7 @@
     }
 
     private void testArrayReference() {
+      ia = new int[] {i, j};
       // ArrayReference
       i = ia[0];
       assertEquals(ia[0], i);
@@ -415,6 +416,7 @@
     }
 
     private void testForeachStatement() {
+      ia = new int[] {i, j};
       // Array of primitive.
       for (int q : ia) {
         i = q;
@@ -557,12 +559,14 @@
 
     private void testPostfixExpression() {
       // PostfixExpression
+      i = 1;
       assertEquals(1, i++);
       assertEquals(2, i--);
     }
 
     private void testPrefixExpression() {
       // PrefixExpression
+      i = 1;
       assertEquals(2, ++i);
       assertEquals(1, --i);
     }
@@ -822,6 +826,23 @@
     return false;
   }
 
+  @Override
+  public void gwtSetUp() throws Exception {
+    super.gwtSetUp();
+    x = 3;
+    d = 0;
+    f = 0;
+    i = 1 + 2 + 3;
+    ia = null;
+    iaa = null;
+    iaaa = null;
+    l = 0;
+    o = null;
+    s = "foo";
+    sa = new String[]{"foo", "bar", "bar"};
+    z = false;
+  }
+  
   protected static void sfoo() {
   }
 
diff --git a/user/test/com/google/gwt/dev/js/CoverageTestModule.gwt.xml b/user/test/com/google/gwt/dev/js/CoverageTestModule.gwt.xml
new file mode 100644
index 0000000..83e975c
--- /dev/null
+++ b/user/test/com/google/gwt/dev/js/CoverageTestModule.gwt.xml
@@ -0,0 +1,4 @@
+<module>
+  <inherits name="com.google.gwt.user.User"/>
+  <inherits name="com.google.gwt.json.JSON"/>
+</module>
\ No newline at end of file
diff --git a/user/test/com/google/gwt/dev/js/client/CoverageTest.java b/user/test/com/google/gwt/dev/js/client/CoverageTest.java
new file mode 100644
index 0000000..77edb5b
--- /dev/null
+++ b/user/test/com/google/gwt/dev/js/client/CoverageTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.js.client;
+
+import com.google.gwt.json.client.JSONNumber;
+import com.google.gwt.json.client.JSONObject;
+import com.google.gwt.json.client.JSONParser;
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.storage.client.Storage;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Tests coverage instrumentation.
+ */
+public class CoverageTest extends GWTTestCase {
+  private static final Map<String, Double> EXPECTED_COVERAGE = new HashMap<String, Double>() { {
+      put("25", 1.0);
+      put("26", 1.0);
+      put("27", 1.0);
+      put("29", 1.0);
+      put("31", 0.0);
+  }};
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.dev.js.CoverageTestModule";
+  }
+
+  /*
+   * Trigger the onbeforeunload handler. It would be nice to do this by refreshing the page or
+   * something, but that causes the test to fail.
+   */
+  private static native void fireOnBeforeUnloadEvent() /*-{
+    for (var i = 0; i < $wnd.frames.length; i++) {
+      if (typeof $wnd.frames[i].onbeforeunload === 'function') {
+        $wnd.frames[i].onbeforeunload();
+      }
+    }
+  }-*/;
+
+  public void testCoverageDataIsFlushedToLocalStorageOnBeforeUnload() {
+    Storage localStorage = Storage.getLocalStorageIfSupported();
+    assertNotNull("Test browser does not support localStorage", localStorage);
+    // No coverage initially
+    assertNull("Found unexpected initial coverage", localStorage.getItem("gwt_coverage"));
+
+    CoverageTestModule.method();
+
+    // Trigger the onbeforeunload handler to flush the coverage information to localStorage.
+    fireOnBeforeUnloadEvent();
+    String coverageAsJson = localStorage.getItem("gwt_coverage");
+    assertNotNull("No coverage data found", coverageAsJson);
+    JSONObject coverage = JSONParser.parseStrict(coverageAsJson).isObject();
+    assertNotNull("Coverage data was not valid JSON", coverage);
+
+    JSONObject fileCoverage =
+        coverage.get("com/google/gwt/dev/js/client/CoverageTestModule.java").isObject();
+    assertNotNull(fileCoverage);
+    for (Map.Entry<String, Double> lineCoverage : EXPECTED_COVERAGE.entrySet()) {
+      assertTrue(fileCoverage.containsKey(lineCoverage.getKey()));
+      JSONNumber value = fileCoverage.get(lineCoverage.getKey()).isNumber();
+      assertNotNull(value);
+      assertEquals(lineCoverage.getValue(), value.doubleValue(), 0.0001);
+    }
+  }
+}
diff --git a/user/test/com/google/gwt/dev/js/client/CoverageTestModule.java b/user/test/com/google/gwt/dev/js/client/CoverageTestModule.java
new file mode 100644
index 0000000..bf6d2fc
--- /dev/null
+++ b/user/test/com/google/gwt/dev/js/client/CoverageTestModule.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.dev.js.client;
+
+import com.google.gwt.core.client.GWT;
+
+/**
+ * Dummy class used to verify that coverage is sane.
+ */
+public class CoverageTestModule {
+  public static void method() {
+    Integer x = new Integer(42);
+    int y = x + 10;
+    if (x < y) {
+      // This comment will be ignored
+      GWT.log("This line should be covered");
+    } else {
+      GWT.log("This line should not be covered");
+    }
+  }
+}
diff --git a/user/test/com/google/gwt/dom/client/StyleInjectorTest.java b/user/test/com/google/gwt/dom/client/StyleInjectorTest.java
index be61d38..0edca0a 100644
--- a/user/test/com/google/gwt/dom/client/StyleInjectorTest.java
+++ b/user/test/com/google/gwt/dom/client/StyleInjectorTest.java
@@ -24,7 +24,7 @@
  */
 public class StyleInjectorTest extends GWTTestCase {
 
-  private static final int TEST_DELAY = 500;
+  private static final int TEST_DELAY = 1000;
 
   @Override
   public String getModuleName() {
diff --git a/user/test/com/google/gwt/editor/client/EditorErrorTest.java b/user/test/com/google/gwt/editor/client/EditorErrorTest.java
index 8900d5f..755ebef 100644
--- a/user/test/com/google/gwt/editor/client/EditorErrorTest.java
+++ b/user/test/com/google/gwt/editor/client/EditorErrorTest.java
@@ -23,6 +23,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
@@ -193,6 +194,22 @@
     driver.edit(p);
     driver.flush();
     assertEquals(0, editor.errors.size());
+    assertFalse(driver.hasErrors());
+    assertNotNull(driver.getErrors());
+    assertEquals(0, driver.getErrors().size());
+
+    assertFalse(driver.setConstraintViolations(Collections.<ConstraintViolation<?>>emptyList()));
+    assertEquals(0, editor.errors.size());
+    assertFalse(driver.hasErrors());
+    assertNotNull(driver.getErrors());
+    assertEquals(0, driver.getErrors().size());
+
+    // Test no NPE is thrown; see issue 6578
+    assertFalse(driver.setConstraintViolations(null));
+    assertEquals(0, editor.errors.size());
+    assertFalse(driver.hasErrors());
+    assertNotNull(driver.getErrors());
+    assertEquals(0, driver.getErrors().size());
   }
 
   public void testSimpleError() {
diff --git a/user/test/com/google/gwt/jsonp/client/JsonpRequestTest.java b/user/test/com/google/gwt/jsonp/client/JsonpRequestTest.java
index ff99107..5435717 100644
--- a/user/test/com/google/gwt/jsonp/client/JsonpRequestTest.java
+++ b/user/test/com/google/gwt/jsonp/client/JsonpRequestTest.java
@@ -301,7 +301,7 @@
   }
 
   public void testTimeout() {
-    delayTestFinish(jsonp.getTimeout() + 500);
+    delayTestFinish(jsonp.getTimeout() + 1000);
     jsonp.requestString(echoTimeout(),
         new AssertTimeoutExceptionCallback<String>());
   }
diff --git a/user/test/com/google/gwt/place/PlaceSuite.gwt.xml b/user/test/com/google/gwt/place/PlaceSuite.gwt.xml
index 44c1d91..845bc3f 100644
--- a/user/test/com/google/gwt/place/PlaceSuite.gwt.xml
+++ b/user/test/com/google/gwt/place/PlaceSuite.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 0.0.999//EN" "http://google-web-toolkit.googlecode.com/svn/tags/0.0.999/distro-source/core/src/gwt-module.dtd">
 <module>
   <inherits name='com.google.gwt.place.Place'/>
 
diff --git a/user/test/com/google/gwt/text/TextSuite.gwt.xml b/user/test/com/google/gwt/text/TextSuite.gwt.xml
index de4eae9..b2de8b1 100644
--- a/user/test/com/google/gwt/text/TextSuite.gwt.xml
+++ b/user/test/com/google/gwt/text/TextSuite.gwt.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Could not determine the version of your GWT SDK; using the module DTD from GWT 1.6.4. You may want to change this. -->
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.6.4//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.6.4/distro-source/core/src/gwt-module.dtd">
 <module>
 	<inherits name="com.google.gwt.text.Text" />
 	<source path="client"/>
diff --git a/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java b/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
index 0474a0e..b5a5ef5 100644
--- a/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
+++ b/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
@@ -256,6 +256,12 @@
     assertEquals(renderer.getUiStyle().disabled(), nameSpan.getClassName());
   }
 
+  public void testGetStyleBeforeRender() {
+    HtmlRenderer renderer = GWT.create(HtmlRenderer.class);
+    assertNotNull(renderer.getUiStyle().enabled());
+    assertNotNull(renderer.getUiStyle2().ok());
+  }
+
   @Override
   protected void gwtTearDown() {
     docDiv.removeFromParent();
diff --git a/user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java b/user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java
index 12a6ebd..c745519 100644
--- a/user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java
+++ b/user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java
@@ -86,10 +86,19 @@
   }
 
   /**
+   * Another style defined within the UiBinder file.
+   */
+  public interface UiStyle2 extends CssResource {
+    String ok();
+    String bad();
+  }
+
+  /**
    * A UiRinder Cell renderer.
    */
   public interface HtmlRenderer extends UiRenderer {
     UiStyle getUiStyle();
+    UiStyle2 getUiStyle2();
     SpanElement getNameSpan(Element owner);
     TableColElement getNarrowColumn(Element owner);
     DivElement getRoot(Element owner);
diff --git a/user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml b/user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml
index e0eb3ba..8c1ca5c 100644
--- a/user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml
+++ b/user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml
@@ -21,6 +21,10 @@
     .enabled { color:black; }
     .disabled { color:gray; }
   </ui:style>
+  <ui:style field="uiStyle2" type="com.google.gwt.uibinder.test.client.UiRendererUi.UiStyle2">
+    .ok { color:blue; }
+    .bad { color:red; }
+  </ui:style>
 
   <div ui:field='root' class="{res.style.bodyColor} {res.style.bodyFont}"
       title="The title of this div is localizable">
diff --git a/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java b/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
index 7dfffd0..3e1177e 100644
--- a/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
+++ b/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
@@ -27,6 +27,7 @@
 import com.google.gwt.dom.client.TableCellElement;
 import com.google.gwt.dom.client.TableRowElement;
 import com.google.gwt.dom.client.TableSectionElement;
+import com.google.gwt.event.dom.client.KeyCodes;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.user.cellview.client.AbstractHasData.DefaultKeyboardSelectionHandler;
 import com.google.gwt.user.cellview.client.HasKeyboardPagingPolicy.KeyboardPagingPolicy;
@@ -1173,6 +1174,24 @@
     assertFalse(sortList.get(0).isAscending());
     assertEquals(1, lastSorted.size());
     lastSorted.clear();
+    
+    // Sort the same column again, this time using the Enter key.
+    NativeEvent enter = Document.get().createKeyDownEvent(false, false, false, false,
+        KeyCodes.KEY_ENTER);
+    getHeaderElement(table, 0).dispatchEvent(enter);
+    assertEquals(1, sortList.size());
+    assertEquals(table.getColumn(0), sortList.get(0).getColumn());
+    assertTrue(sortList.get(0).isAscending());
+    assertEquals(1, lastSorted.size());
+    lastSorted.clear();
+
+    // Sort the same column using the Enter key again.
+    getHeaderElement(table, 0).dispatchEvent(enter);
+    assertEquals(1, sortList.size());
+    assertEquals(table.getColumn(0), sortList.get(0).getColumn());
+    assertFalse(sortList.get(0).isAscending());
+    assertEquals(1, lastSorted.size());
+    lastSorted.clear();
 
     // Sort a column that is not sortable.
     getHeaderElement(table, 1).dispatchEvent(click);
diff --git a/user/test/com/google/gwt/user/cellview/client/CellTreeTest.java b/user/test/com/google/gwt/user/cellview/client/CellTreeTest.java
index 222888d..990abbf 100644
--- a/user/test/com/google/gwt/user/cellview/client/CellTreeTest.java
+++ b/user/test/com/google/gwt/user/cellview/client/CellTreeTest.java
@@ -159,6 +159,33 @@
     assertEquals("new", newNodeImpl.getCellParent().getInnerText());
   }
 
+  public void testAriaSelectedAndExpanded() {
+    CellTree cellTree = (CellTree) tree;
+    TreeNode root = cellTree.getRootTreeNode();
+
+    TreeNode newNode = root.setChildOpen(1, true);
+    cellTree.rootNode.getChildNode(1).setSelected(true);
+    model.getRootDataProvider().refresh();
+    model.getRootDataProvider().flush();
+    root.setChildOpen(1, true);
+    CellTreeNodeView<?> newNodeImpl = cellTree.rootNode.getChildNode(1);
+    assertEquals("true", newNodeImpl.getElement().getAttribute("aria-selected"));
+    // Check aria-expanded on open
+    assertEquals("true", newNodeImpl.getElement().getAttribute("aria-expanded"));
+
+    // Check aria-expanded on close
+    root.setChildOpen(1, false);
+    newNodeImpl = cellTree.rootNode.getChildNode(1);
+    assertEquals("false", newNodeImpl.getElement().getAttribute("aria-expanded"));
+
+    cellTree.rootNode.getChildNode(1).setSelected(false);
+    model.getRootDataProvider().refresh();
+    model.getRootDataProvider().flush();
+    root.setChildOpen(1, true);
+    newNodeImpl = cellTree.rootNode.getChildNode(1);
+    assertEquals("false", newNodeImpl.getElement().getAttribute("aria-selected"));
+  }
+
   public void testSetDefaultNodeSize() {
     CellTree cellTree = (CellTree) tree;
     TreeNode root = cellTree.getRootTreeNode();
@@ -175,6 +202,68 @@
     assertEquals(5, d.getChildCount());
   }
 
+  public void testAriaAttributes() {
+    CellTree cellTree = (CellTree) tree;
+    TreeNode rootNode = cellTree.getRootTreeNode();
+
+    // Open a child node.
+    TreeNode aNode = rootNode.setChildOpen(0, true);
+
+    // Check role="tree"
+    assertEquals("tree", cellTree.rootNode.getElement().getAttribute("role"));
+
+    // Check 1st level
+    CellTreeNodeView<?> aView = cellTree.rootNode.getChildNode(0);
+    CellTreeNodeView<?> bView = cellTree.rootNode.getChildNode(1);
+
+    // Check treeitem role, level, posinset, and setsize
+    assertEquals("treeitem", aView.getElement().getAttribute("role"));
+    assertEquals("1", aView.getElement().getAttribute("aria-level"));
+    assertEquals("1", aView.getElement().getAttribute("aria-posinset"));
+    assertEquals("10", aView.getElement().getAttribute("aria-setsize"));
+
+    assertEquals("treeitem", bView.getElement().getAttribute("role"));
+    assertEquals("1", bView.getElement().getAttribute("aria-level"));
+    assertEquals("2", bView.getElement().getAttribute("aria-posinset"));
+    assertEquals("10", bView.getElement().getAttribute("aria-setsize"));
+
+    // Check 2nd level
+    assertTrue(aNode.getChildCount() != 0);
+    assertEquals(aNode, aView.getTreeNode());
+    assertTrue(aView.getChildCount() != 0);
+    CellTreeNodeView<?> aViewChild = aView.getChildNode(0);
+
+    // Check treeitem role, level, posinset, and setsize
+    assertEquals("treeitem", aViewChild.getElement().getAttribute("role"));
+    assertEquals("2", aViewChild.getElement().getAttribute("aria-level"));
+    assertEquals("1", aViewChild.getElement().getAttribute("aria-posinset"));
+    assertEquals("10", aViewChild.getElement().getAttribute("aria-setsize"));
+
+    // Check aria-expanded
+    assertEquals("true", aView.getElement().getAttribute("aria-expanded"));
+    assertEquals("false", aViewChild.getElement().getAttribute("aria-expanded"));
+    while (!aNode.isChildLeaf(0)) {
+      aNode = aNode.setChildOpen(0, true);
+      aView = aView.getChildNode(0);
+    }
+    assertEquals(aNode, aView.getTreeNode());
+    assertEquals("", aView.getChildNode(0).getElement().getAttribute("aria-expanded"));
+
+    // Change default size and check aria-setsize and aria-posinset
+    cellTree.setDefaultNodeSize(5);
+    TreeNode cNode = rootNode.setChildOpen(3, true);
+    CellTreeNodeView<?> cView = cellTree.rootNode.getChildNode(3);
+    assertEquals(5, cNode.getChildCount());
+
+    CellTreeNodeView<?> cViewChildFirst = cView.getChildNode(0);
+    assertEquals("1", cViewChildFirst.getElement().getAttribute("aria-posinset"));
+    assertEquals("5", cViewChildFirst.getElement().getAttribute("aria-setsize"));
+
+    CellTreeNodeView<?> cViewChildLast = cView.getChildNode(cView.getChildCount() - 1);
+    assertEquals("5", cViewChildLast.getElement().getAttribute("aria-posinset"));
+    assertEquals("5", cViewChildLast.getElement().getAttribute("aria-setsize"));
+  }
+
   @Override
   protected <T> CellTree createAbstractCellTree(TreeViewModel model, T rootValue) {
     return new CellTree(model, rootValue);
diff --git a/user/test/com/google/gwt/user/client/WindowTest.java b/user/test/com/google/gwt/user/client/WindowTest.java
index 51c798c..085a91d 100644
--- a/user/test/com/google/gwt/user/client/WindowTest.java
+++ b/user/test/com/google/gwt/user/client/WindowTest.java
@@ -221,7 +221,7 @@
     final Label largeDOM = new Label();
     largeDOM.setPixelSize(oldClientWidth + 100, oldClientHeight + 100);
     RootPanel.get().add(largeDOM);
-    delayTestFinish(200);
+    delayTestFinish(1000);
     DeferredCommand.addCommand(new Command() {
       public void execute() {
         int newClientHeight = Window.getClientHeight();
diff --git a/user/test/com/google/gwt/user/client/ui/SuggestBoxTest.java b/user/test/com/google/gwt/user/client/ui/SuggestBoxTest.java
index 6492f18..503c96e 100644
--- a/user/test/com/google/gwt/user/client/ui/SuggestBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/SuggestBoxTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -26,6 +26,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -66,7 +67,7 @@
 
     /**
      * Get the suggestion at the specified index.
-     * 
+     *
      * @param index the index
      * @return the {@link Suggestion} at the index
      */
@@ -77,7 +78,7 @@
     /**
      * Get the number of suggestions that are currently showing. Used for
      * testing.
-     * 
+     *
      * @return the number of suggestions currently showing, 0 if there are none
      */
     public int getSuggestionCount() {
@@ -172,7 +173,7 @@
     box.showSuggestionList();
     assertTrue(display.isSuggestionListShowing());
     assertEquals(3, display.getSuggestionCount());
-    assertEquals("<strong>Hark</strong>, Shark and <strong>Herald</strong>", 
+    assertEquals("<strong>Hark</strong>, Shark and <strong>Herald</strong>",
         display.getSuggestion(0).getDisplayString());
     assertEquals("<strong>Hark</strong>! The <strong>Herald</strong> Angels Sing",
         display.getSuggestion(1).getDisplayString());
@@ -180,6 +181,29 @@
         display.getSuggestion(2).getDisplayString());
   }
 
+  public void testMatchCustomSort() {
+    MultiWordSuggestOracle oracle = new MultiWordSuggestOracle(",! ");
+    oracle.add("Hark, Shark and Herald");
+    oracle.add("Hark! The Herald Angels Sing");
+    oracle.add("Heraldings and Harkings");
+    oracle.add("Send my regards to Herald");
+    oracle.setComparator(Collections.<String>reverseOrder());
+
+    TestSuggestionDisplay display = new TestSuggestionDisplay();
+    SuggestBox box = new SuggestBox(oracle, new TextBox(), display);
+    RootPanel.get().add(box);
+    box.setText("Herald! Hark");
+    box.showSuggestionList();
+    assertTrue(display.isSuggestionListShowing());
+    assertEquals(3, display.getSuggestionCount());
+    assertEquals("<strong>Herald</strong>ings and <strong>Hark</strong>ings",
+        display.getSuggestion(0).getDisplayString());
+    assertEquals("<strong>Hark</strong>! The <strong>Herald</strong> Angels Sing",
+        display.getSuggestion(1).getDisplayString());
+    assertEquals("<strong>Hark</strong>, Shark and <strong>Herald</strong>",
+        display.getSuggestion(2).getDisplayString());
+  }
+
   @SuppressWarnings("deprecation")
   public void testShowAndHide() {
     SuggestBox box = createSuggestBox();
@@ -275,7 +299,7 @@
     assertEquals("A", display.getSuggestion(0).getReplacementString());
     assertEquals("B", display.getSuggestion(1).getReplacementString());
   }
-  
+
   public void testSuggestionSelection() {
     MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();
     oracle.setDefaultSuggestionsFromText(Arrays.asList("A", "B"));
@@ -289,7 +313,7 @@
     assertNull(display.getCurrentSelection());
     display.moveSelectionDown();
     assertEquals("A", display.getCurrentSelection().getReplacementString());
-    
+
     // Once something is selected, selections are made as expected, but we do
     // not move outside the box
     display.moveSelectionDown();
@@ -300,12 +324,12 @@
     assertEquals("A", display.getCurrentSelection().getReplacementString());
     display.moveSelectionUp();
     assertEquals("A", display.getCurrentSelection().getReplacementString());
-    
+
     // Reset the suggestions so that nothing is selected again
     display.hideSuggestions();
     box.showSuggestionList();
     assertNull(display.getCurrentSelection());
-    
+
     // If nothing is selected, moving up will select the last item
     display.moveSelectionUp();
     assertEquals("B", display.getCurrentSelection().getReplacementString());
diff --git a/user/test/com/google/gwt/user/client/ui/impl/ClippedImagePrototypeTest.java b/user/test/com/google/gwt/user/client/ui/impl/ClippedImagePrototypeTest.java
index 15cadeb..4d4d1d4 100644
--- a/user/test/com/google/gwt/user/client/ui/impl/ClippedImagePrototypeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/impl/ClippedImagePrototypeTest.java
@@ -44,6 +44,7 @@
       return onloadEventFireCount;
     }
 
+    @Override
     public void onLoad(LoadEvent event) {
       onloadEventFireCount++;
     }
@@ -93,6 +94,7 @@
     };
     image.addLoadHandler(handler);
     image.addErrorHandler(new ErrorHandler() {
+      @Override
       public void onError(ErrorEvent event) {
         fail("The image " + image.getUrl() + " failed to load.");
       }
@@ -177,4 +179,23 @@
     assertEquals("counting-forwards.png", image.getUrl());
     assertEquals("clipped", ImageTest.getCurrentImageStateName(image));
   }
+
+  /**
+   * Tests that making clipped images draggable works as intended.
+   */
+  public void testMakingClippedImagesDraggable() {
+    ClippedImagePrototype clippedImage = new ClippedImagePrototype(
+        UriUtils.fromString("test.png"), 0, 0, 0, 0);
+
+    // check that at first the outputted HTML does not contain draggable='true'
+    assertFalse(clippedImage.getSafeHtml().asString().contains("draggable"));
+
+    // set the image to draggable and check that the outputted HTML now contains draggable='true'
+    clippedImage.setDraggable(true);
+    assertTrue(clippedImage.getSafeHtml().asString().contains("draggable"));
+
+    // revert it to non-draggable and check that draggable='true' is gone
+    clippedImage.setDraggable(false);
+    assertFalse(clippedImage.getSafeHtml().asString().contains("draggable"));
+  }
 }
diff --git a/user/test/com/google/gwt/validation/ValidationClientJreSuite.java b/user/test/com/google/gwt/validation/ValidationClientJreSuite.java
index 5522679..72f166d 100644
--- a/user/test/com/google/gwt/validation/ValidationClientJreSuite.java
+++ b/user/test/com/google/gwt/validation/ValidationClientJreSuite.java
@@ -15,9 +15,9 @@
  */
 package com.google.gwt.validation;
 
-import com.google.gwt.validation.client.ValidationGroupsMetadataTest;
 import com.google.gwt.validation.client.impl.NodeImplTest;
 import com.google.gwt.validation.client.impl.PathImplTest;
+import com.google.gwt.validation.client.impl.metadata.ValidationGroupsMetadataTest;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
diff --git a/user/test/com/google/gwt/validation/ValidationTest.gwt.xml b/user/test/com/google/gwt/validation/ValidationTest.gwt.xml
index 357d3ed..d496b50 100644
--- a/user/test/com/google/gwt/validation/ValidationTest.gwt.xml
+++ b/user/test/com/google/gwt/validation/ValidationTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/com/google/gwt/validation/client/impl/GwtValidatorContextTest.java b/user/test/com/google/gwt/validation/client/impl/GwtValidatorContextTest.java
index f286ebb..248f272 100644
--- a/user/test/com/google/gwt/validation/client/impl/GwtValidatorContextTest.java
+++ b/user/test/com/google/gwt/validation/client/impl/GwtValidatorContextTest.java
@@ -18,7 +18,7 @@
 import com.google.gwt.validation.client.AbstractGwtValidatorFactory;
 import com.google.gwt.validation.client.GwtConstraintValidatorFactory;
 import com.google.gwt.validation.client.GwtMessageInterpolator;
-import com.google.gwt.validation.client.GwtTraversableResolver;
+import com.google.gwt.validation.client.DefaultTraversableResolver;
 import com.google.gwt.validation.client.ValidationClientGwtTestCase;
 
 import java.util.Set;
@@ -96,7 +96,7 @@
   private ValidatorContext validatorContext;
 
   public void testCustom() throws Exception {
-    final TraversableResolver traversableResolver = new GwtTraversableResolver();
+    final TraversableResolver traversableResolver = new DefaultTraversableResolver();
     final ConstraintValidatorFactory constraintValidatorFactory = new GwtConstraintValidatorFactory();
     final MessageInterpolator messageInterpolator = new GwtMessageInterpolator();
 
@@ -125,7 +125,7 @@
   }
 
   public void testReset() throws Exception {
-    final TraversableResolver traversableResolver = new GwtTraversableResolver();
+    final TraversableResolver traversableResolver = new DefaultTraversableResolver();
     final ConstraintValidatorFactory constraintValidatorFactory = new GwtConstraintValidatorFactory();
     final MessageInterpolator messageInterpolator = new GwtMessageInterpolator();
 
diff --git a/user/test/com/google/gwt/validation/client/ValidationGroupsMetadataTest.java b/user/test/com/google/gwt/validation/client/impl/metadata/ValidationGroupsMetadataTest.java
similarity index 98%
rename from user/test/com/google/gwt/validation/client/ValidationGroupsMetadataTest.java
rename to user/test/com/google/gwt/validation/client/impl/metadata/ValidationGroupsMetadataTest.java
index f5d7e39..cfa944d 100644
--- a/user/test/com/google/gwt/validation/client/ValidationGroupsMetadataTest.java
+++ b/user/test/com/google/gwt/validation/client/impl/metadata/ValidationGroupsMetadataTest.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.validation.client;
+package com.google.gwt.validation.client.impl.metadata;
 
 import junit.framework.TestCase;
 
diff --git a/user/test/com/google/gwt/validation/example/ExampleValidationClientGwtSuite.java b/user/test/com/google/gwt/validation/example/ExampleValidationClientGwtSuite.java
index 8ec3640..31dcc50 100644
--- a/user/test/com/google/gwt/validation/example/ExampleValidationClientGwtSuite.java
+++ b/user/test/com/google/gwt/validation/example/ExampleValidationClientGwtSuite.java
@@ -18,6 +18,7 @@
 import com.google.gwt.junit.tools.GWTTestSuite;
 import com.google.gwt.validation.example.client.AuthorTest;
 import com.google.gwt.validation.example.client.BookTest;
+import com.google.gwt.validation.example.client.NotSpecifiedGroupsTest;
 
 import junit.framework.Test;
 
@@ -30,6 +31,7 @@
         "Validation Example tests that require GWT");
     suite.addTestSuite(AuthorTest.class);
     suite.addTestSuite(BookTest.class);
+    suite.addTestSuite(NotSpecifiedGroupsTest.class);
     return suite;
   }
 
diff --git a/user/test/com/google/gwt/validation/example/ValidationExample.gwt.xml b/user/test/com/google/gwt/validation/example/ValidationExample.gwt.xml
index fe7f629..3fea5b5 100644
--- a/user/test/com/google/gwt/validation/example/ValidationExample.gwt.xml
+++ b/user/test/com/google/gwt/validation/example/ValidationExample.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/com/google/gwt/validation/example/client/ExampleValidatorFactory.java b/user/test/com/google/gwt/validation/example/client/ExampleValidatorFactory.java
index 4aae839..0b926a5 100644
--- a/user/test/com/google/gwt/validation/example/client/ExampleValidatorFactory.java
+++ b/user/test/com/google/gwt/validation/example/client/ExampleValidatorFactory.java
@@ -41,7 +41,7 @@
    * client.
    */
   @GwtValidation(
-      value = {Author.class, Book.class},
+      value = {Author.class, Book.class, NotSpecifiedGroupsTest.MyClass.class},
       groups = {Default.class, ClientGroup.class})
   public interface GwtValidator extends Validator {
   }
diff --git a/user/test/com/google/gwt/validation/example/client/NotSpecifiedGroupsTest.java b/user/test/com/google/gwt/validation/example/client/NotSpecifiedGroupsTest.java
new file mode 100644
index 0000000..0c67824
--- /dev/null
+++ b/user/test/com/google/gwt/validation/example/client/NotSpecifiedGroupsTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.example.client;
+
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.validation.example.client.ExampleValidatorFactory.ServerGroup;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.constraints.NotNull;
+
+/**
+ * Tests used to verify that constraints belonging to a group which is not specified in the
+ * {@link com.google.gwt.validation.client.GwtValidation &#064;GwtValidation}
+ * are not considered (and are not compiled).
+ */
+public class NotSpecifiedGroupsTest extends GWTTestCase {
+
+  private Validator validator;
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.validation.example.ValidationExample";
+  }
+
+  public void testConstraintsNotInSpecifiedGroupsAreNotConsidered() {
+    MyClass obj = new MyClass();
+    Set<ConstraintViolation<MyClass>> violations = validator.validate(obj);
+    assertEquals(1, violations.size());
+  }
+
+  @Override
+  protected final void gwtSetUp() throws Exception {
+    super.gwtSetUp();
+    validator = Validation.buildDefaultValidatorFactory().getValidator();
+  }
+
+  /**
+   * Used for testing client/server constraints via groups.
+   */
+  @ServerConstraint(groups = ServerGroup.class)
+  public static class MyClass {
+    @NotNull
+    public String name;
+  }
+}
diff --git a/user/test/com/google/gwt/validation/example/client/ServerConstraint.java b/user/test/com/google/gwt/validation/example/client/ServerConstraint.java
new file mode 100644
index 0000000..65f7c95
--- /dev/null
+++ b/user/test/com/google/gwt/validation/example/client/ServerConstraint.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.example.client;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+/**
+ * A constraint which should not compile in client-side GWT validation.
+ */
+@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE})
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = {ServerValidator.class})
+public @interface ServerConstraint {
+  String message() default "Not valid at the server";
+
+  Class<?>[] groups() default {};
+
+  Class<? extends Payload>[] payload() default {};
+}
\ No newline at end of file
diff --git a/user/test/com/google/gwt/validation/example/client/ServerValidator.java b/user/test/com/google/gwt/validation/example/client/ServerValidator.java
new file mode 100644
index 0000000..7fb497f
--- /dev/null
+++ b/user/test/com/google/gwt/validation/example/client/ServerValidator.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.validation.example.client;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+/**
+ * Validates server-side constraints. Will not compile on GWT.
+ */
+public class ServerValidator
+    implements ConstraintValidator<ServerConstraint, NotSpecifiedGroupsTest.MyClass> {
+
+  @Override
+  public void initialize(ServerConstraint constraintAnnotation) {
+    // Here I do something that will not compile on GWT
+    @SuppressWarnings("unused")
+    Method[] methods = constraintAnnotation.getClass().getMethods();
+  }
+
+  @Override
+  public boolean isValid(NotSpecifiedGroupsTest.MyClass obj, ConstraintValidatorContext context) {
+    @SuppressWarnings("unused")
+    Field[] fields = obj.getClass().getDeclaredFields();
+    return false;
+  }
+}
diff --git a/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java b/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java
index fda80ff..5ab75f1 100644
--- a/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java
+++ b/user/test/com/google/gwt/view/client/SingleSelectionModelTest.java
@@ -38,9 +38,11 @@
 
     model.setSelected("test", true);
     assertEquals("test", model.getSelectedObject());
+    assertEquals("test", model.getSelectedSet().iterator().next());
 
     model.setSelected("test", false);
     assertNull(model.getSelectedObject());
+    assertEquals(0, model.getSelectedSet().size());
   }
 
   public void testSelectedChangeEvent() {
@@ -91,14 +93,18 @@
 
     model.setSelected("test0", true);
     assertTrue(model.isSelected("test0"));
+    assertEquals("test0", model.getSelectedSet().iterator().next());
 
     model.setSelected("test1", true);
     assertTrue(model.isSelected("test1"));
     assertFalse(model.isSelected("test0"));
+    assertEquals("test1", model.getSelectedSet().iterator().next());
+    assertEquals(1, model.getSelectedSet().size());
 
     model.setSelected("test1", false);
     assertFalse(model.isSelected("test1"));
     assertFalse(model.isSelected("test0"));
+    assertEquals(0, model.getSelectedSet().size());
   }
 
   public void testSetSelectedNull() {
@@ -112,6 +118,7 @@
     assertNull(model.getSelectedObject());
     assertFalse(model.isSelected("test"));
     assertFalse(model.isSelected(null));
+    assertEquals(0, model.getSelectedSet().size());
   }
 
   public void testSetSelectedWithKeyProvider() {
diff --git a/user/test/com/google/web/bindery/requestfactory/apt/ExpectCollector.java b/user/test/com/google/web/bindery/requestfactory/apt/ExpectCollector.java
index 09d8917..e34ca1c 100644
--- a/user/test/com/google/web/bindery/requestfactory/apt/ExpectCollector.java
+++ b/user/test/com/google/web/bindery/requestfactory/apt/ExpectCollector.java
@@ -118,4 +118,4 @@
     scanner.scan(roundEnv.getElementsAnnotatedWith(Expected.class), null);
     return false;
   }
-}
+}
\ No newline at end of file
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactoryExceptionHandlerTest.gwt.xml b/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactoryExceptionHandlerTest.gwt.xml
index 32645c8..1290b5a 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactoryExceptionHandlerTest.gwt.xml
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactoryExceptionHandlerTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.gwt.xml b/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.gwt.xml
index 51a99f4..ea327a1 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.gwt.xml
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.java b/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.java
index fb0f93b..0d4db18 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/RequestFactorySuite.java
@@ -16,8 +16,8 @@
 package com.google.web.bindery.requestfactory.gwt;
 
 import com.google.gwt.junit.tools.GWTTestSuite;
-import com.google.web.bindery.requestfactory.gwt.client.RequestBatcherTest;
 import com.google.web.bindery.requestfactory.gwt.client.FindServiceTest;
+import com.google.web.bindery.requestfactory.gwt.client.RequestBatcherTest;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryChainedContextTest;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryExceptionHandlerTest;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryExceptionPropagationTest;
@@ -29,6 +29,7 @@
 import com.google.web.bindery.requestfactory.shared.ComplexKeysTest;
 import com.google.web.bindery.requestfactory.shared.FanoutReceiverTest;
 import com.google.web.bindery.requestfactory.shared.LocatorTest;
+import com.google.web.bindery.requestfactory.shared.MultipleFactoriesTest;
 import com.google.web.bindery.requestfactory.shared.ServiceInheritanceTest;
 import com.google.web.bindery.requestfactory.shared.impl.RequestPayloadTest;
 
@@ -48,6 +49,7 @@
     suite.addTestSuite(FanoutReceiverTest.class);
     suite.addTestSuite(FindServiceTest.class);
     suite.addTestSuite(LocatorTest.class);
+    suite.addTestSuite(MultipleFactoriesTest.class);
     suite.addTestSuite(RequestFactoryTest.class);
     suite.addTestSuite(RequestFactoryChainedContextTest.class);
     suite.addTestSuite(RequestFactoryExceptionHandlerTest.class);
diff --git a/user/test/com/google/web/bindery/requestfactory/server/MultipleFactoriesJreTest.java b/user/test/com/google/web/bindery/requestfactory/server/MultipleFactoriesJreTest.java
new file mode 100644
index 0000000..4da66a7
--- /dev/null
+++ b/user/test/com/google/web/bindery/requestfactory/server/MultipleFactoriesJreTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.web.bindery.requestfactory.server;
+
+import com.google.web.bindery.requestfactory.shared.MultipleFactoriesTest;
+
+/**
+ * A JRE version of {@link MultipleFactoriesTest}.
+ */
+public class MultipleFactoriesJreTest extends MultipleFactoriesTest {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @Override
+  protected Factory1 createFactory1() {
+    return RequestFactoryJreTest.createInProcess(Factory1.class);
+  }
+
+  @Override
+  protected Factory2 createFactory2() {
+    return RequestFactoryJreTest.createInProcess(Factory2.class);
+  }
+}
diff --git a/user/test/com/google/web/bindery/requestfactory/shared/MultipleFactoriesTest.java b/user/test/com/google/web/bindery/requestfactory/shared/MultipleFactoriesTest.java
new file mode 100644
index 0000000..481aa4e
--- /dev/null
+++ b/user/test/com/google/web/bindery/requestfactory/shared/MultipleFactoriesTest.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.web.bindery.requestfactory.shared;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.web.bindery.event.shared.SimpleEventBus;
+
+/**
+ * Contains a set of checks of using multiple request factories simultaneously.
+ */
+public class MultipleFactoriesTest extends GWTTestCase {
+
+  /**
+   * The domain type.
+   */
+  protected static class Entity {
+    static final Entity SINGLETON = new Entity();
+
+    public String getString1() {
+      return EXPECTED_STRING_1;
+    }
+
+    public String getString2() {
+      return EXPECTED_STRING_2;
+    }
+  }
+
+  /**
+   * The first RequestFactory.
+   */
+  protected interface Factory1 extends RequestFactory {
+    Context1 context();
+  }
+
+  /**
+   * The second RequestFactory.
+   */
+  protected interface Factory2 extends RequestFactory {
+    Context2 context();
+  }
+
+  /**
+   * The service method implementations.
+   */
+  protected static class ServiceImpl {
+    public static Entity getEntity() {
+      return Entity.SINGLETON;
+    }
+  }
+
+  @Service(ServiceImpl.class)
+  interface Context1 extends RequestContext {
+    Request<Proxy1> getEntity();
+  }
+
+  @Service(ServiceImpl.class)
+  interface Context2 extends RequestContext {
+    Request<Proxy2> getEntity();
+  }
+
+  @ProxyFor(Entity.class)
+  interface Proxy1 extends ValueProxy {
+    String getString1();
+  }
+  @ProxyFor(Entity.class)
+  interface Proxy2 extends ValueProxy {
+    String getString2();
+  }
+
+  static abstract class TestReceiver<T> extends Receiver<T> {
+    @Override
+    public void onFailure(ServerFailure error) {
+      fail(error.getMessage());
+    }
+  }
+
+  private static final String EXPECTED_STRING_1 = "hello world 1";
+  private static final String EXPECTED_STRING_2 = "hello world 2";
+  private static final int TEST_DELAY = 5000;
+
+  private Factory1 factory1;
+  private Factory2 factory2;
+
+  @Override
+  public String getModuleName() {
+    return "com.google.web.bindery.requestfactory.gwt.RequestFactorySuite";
+  }
+
+  /**
+   * Tests that the 2 calls with 2 RequestFactory with 2 differents Proxy on the same domain class
+   * succeed.
+   */
+  public void test() {
+    delayTestFinish(TEST_DELAY);
+    context1().getEntity().fire(new TestReceiver<Proxy1>() {
+      @Override
+      public void onSuccess(Proxy1 response) {
+        assertEquals(EXPECTED_STRING_1, response.getString1());
+
+        // test 2
+        context2().getEntity().to(new TestReceiver<Proxy2>() {
+          @Override
+          public void onSuccess(Proxy2 response) {
+            assertEquals(EXPECTED_STRING_2, response.getString2());
+          }
+        }).fire(new TestReceiver<Void>() {
+          @Override
+          public void onSuccess(Void response) {
+            finishTest();
+          }
+        });
+      }
+    });
+  }
+
+  protected Factory1 createFactory1() {
+    Factory1 toReturn = GWT.create(Factory1.class);
+    toReturn.initialize(new SimpleEventBus());
+    return toReturn;
+  }
+
+  protected Factory2 createFactory2() {
+    Factory2 toReturn = GWT.create(Factory2.class);
+    toReturn.initialize(new SimpleEventBus());
+    return toReturn;
+  }
+
+  @Override
+  protected void gwtSetUp() {
+    factory1 = createFactory1();
+    factory2 = createFactory2();
+  }
+
+  private Context1 context1() {
+    return factory1.context();
+  }
+
+  private Context2 context2() {
+    return factory2.context();
+  }
+}
diff --git a/user/test/com/google/web/bindery/requestfactory/vm/RequestFactoryJreSuite.java b/user/test/com/google/web/bindery/requestfactory/vm/RequestFactoryJreSuite.java
index 503d026..e928579 100644
--- a/user/test/com/google/web/bindery/requestfactory/vm/RequestFactoryJreSuite.java
+++ b/user/test/com/google/web/bindery/requestfactory/vm/RequestFactoryJreSuite.java
@@ -20,6 +20,7 @@
 import com.google.web.bindery.requestfactory.server.FanoutReceiverJreTest;
 import com.google.web.bindery.requestfactory.server.FindServiceJreTest;
 import com.google.web.bindery.requestfactory.server.LocatorJreTest;
+import com.google.web.bindery.requestfactory.server.MultipleFactoriesJreTest;
 import com.google.web.bindery.requestfactory.server.RequestFactoryChainedContextJreTest;
 import com.google.web.bindery.requestfactory.server.RequestFactoryExceptionPropagationJreTest;
 import com.google.web.bindery.requestfactory.server.RequestFactoryJreTest;
@@ -47,6 +48,7 @@
     suite.addTestSuite(FanoutReceiverJreTest.class);
     suite.addTestSuite(FindServiceJreTest.class);
     suite.addTestSuite(LocatorJreTest.class);
+    suite.addTestSuite(MultipleFactoriesJreTest.class);
     suite.addTestSuite(RequestFactoryChainedContextJreTest.class);
     suite.addTestSuite(RequestFactoryExceptionPropagationJreTest.class);
     suite.addTestSuite(RequestFactoryJreTest.class);
diff --git a/user/test/com/google/web/bindery/requestfactory/vm/impl/ClassComparatorTest.java b/user/test/com/google/web/bindery/requestfactory/vm/impl/ClassComparatorTest.java
new file mode 100644
index 0000000..2732997
--- /dev/null
+++ b/user/test/com/google/web/bindery/requestfactory/vm/impl/ClassComparatorTest.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.web.bindery.requestfactory.vm.impl;
+
+import junit.framework.TestCase;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.TreeSet;
+
+/**
+ * Tests class comparison used to merge {@link Deobfuscator}.
+ */
+public class ClassComparatorTest extends TestCase {
+  public void testCompare() {
+    List<Class<?>> classes = new ArrayList<Class<?>>();
+    classes.add(String.class);
+    classes.add(Integer.class);
+    classes.add(Object.class);
+    classes.add(CharSequence.class);
+    classes.add(Object.class);
+    classes.add(Number.class);
+    classes.add(Long.class);
+    classes.add(Number.class);
+
+    // add class names to treeset
+    ClassLoader classLoader = this.getClass().getClassLoader();
+    TreeSet<String> orderedClasses = new TreeSet<String>(new ClassComparator(classLoader));
+    for (Class<?> clazz : classes) {
+      orderedClasses.add(clazz.getName());
+    }
+
+    // check ordering and duplication
+    assertEquals(6, orderedClasses.size());
+    Iterator<String> it = orderedClasses.iterator();
+    assertEquals(Integer.class.getName(), it.next());
+    assertEquals(Long.class.getName(), it.next());
+    assertEquals(Number.class.getName(), it.next());
+    assertEquals(String.class.getName(), it.next());
+    assertEquals(CharSequence.class.getName(), it.next());
+    assertEquals(Object.class.getName(), it.next());
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/ValidationTck.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/ValidationTck.gwt.xml
index a7a1bf9..a871e43 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/ValidationTck.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/ValidationTck.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ConfigurationGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ConfigurationGwtTest.java
index 504e2da..f6762d8 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ConfigurationGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ConfigurationGwtTest.java
@@ -17,8 +17,9 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
 import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
 
 /**
  * Wraps {@link ConfigurationTest} .
@@ -30,9 +31,9 @@
     return "org.hibernate.jsr303.tck.tests.bootstrap.TckTest";
   }
 
-  @Failing(issue = 6663)
+  @NotSupported(reason = Reason.CUSTOM_PROVIDERS)
   public void testProviderUnderTestDefinesSubInterfaceOfConfiguration() {
-    fail("TODO(nchalko) figure out how to test this in GWT");
+    fail("Custom validation providers are not supported and thus this does not need to be checked");
   }
 
   @NonTckTest
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/TckTest.gwt.xml
index 5e69439..599eaef 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ValidationProviderGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ValidationProviderGwtTest.java
index d2771f5..16682e4 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ValidationProviderGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ValidationProviderGwtTest.java
@@ -17,8 +17,9 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
 import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
 
 /**
  * Wraps {@link ValidationProviderTest} .
@@ -30,26 +31,26 @@
     return "org.hibernate.jsr303.tck.tests.bootstrap.TckTest";
   }
 
-  @Failing(issue = 6663)
+  @NotSupported(reason = Reason.CUSTOM_PROVIDERS)
   public void testByDefaultProviderUsesTheFirstProviderReturnedByValidationProviderResolver() {
-    fail("TODO(nchalko) figure out how to test this in GWT");
+    fail("Custom validation providers are not supported");
   }
 
-  @Failing(issue = 6663)
+  @NotSupported(reason = Reason.CUSTOM_PROVIDERS)
   public void testFirstMatchingValidationProviderResolverIsReturned() {
-    fail("TODO(nchalko) figure out how to test this in GWT");
+    fail("Custom validation providers are not supported");
   }
 
   @NonTckTest
   public void testThereMustBeOnePassingTest(){}
 
-  @Failing(issue = 6663)
+  @NotSupported(reason = Reason.CUSTOM_PROVIDERS)
   public void testValidationExceptionIsThrownInCaseValidatorFactoryCreationFails() {
-    fail("TODO(nchalko) figure out how to test this in GWT");
+    fail("Custom validation providers are not supported");
   }
 
-  @Failing(issue = 6663)
+  @NotSupported(reason = Reason.CUSTOM_PROVIDERS)
   public void testValidationProviderContainsNoArgConstructor() {
-    fail("TODO(nchalko) figure out how to test this in GWT");
+    fail("Custom validation providers are not supported");
   }
 }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ValidationProviderResolverGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ValidationProviderResolverGwtTest.java
index a399f41..4298c65 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ValidationProviderResolverGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/ValidationProviderResolverGwtTest.java
@@ -17,8 +17,9 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
 import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
 
 /**
  * Wraps {@link ValidationProviderResolverTest} .
@@ -30,9 +31,9 @@
     return "org.hibernate.jsr303.tck.tests.bootstrap.TckTest";
   }
 
-  @Failing(issue = 6663)
+  @NotSupported(reason = Reason.IO)
   public void testServiceFileExists() {
-    fail("TODO(nchalko) figure out how to test this in GWT");
+    fail("Customization via a file is not possible in GWT");
   }
 
   @NonTckTest
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapCustomProviderDefinedInServiceFileGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapCustomProviderDefinedInServiceFileGwtTest.java
index 14adb08..b6dfa6e 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapCustomProviderDefinedInServiceFileGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapCustomProviderDefinedInServiceFileGwtTest.java
@@ -17,8 +17,9 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
 import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
 
 /**
  * Wraps {@link BootstrapCustomProviderDefinedInServiceFileTest} .
@@ -31,14 +32,14 @@
     return "org.hibernate.jsr303.tck.tests.bootstrap.customprovider.TckTest";
   }
 
-  @Failing(issue = 6663)
+  @NotSupported(reason = Reason.CUSTOM_PROVIDERS)
   public void testGetFactoryByProviderSpecifiedProgrammatically() {
-    fail("TODO(nchalko) figure out how to test this in GWT");
+    fail("Custom validation providers are not supported");
   }
 
-  @Failing(issue = 6663)
+  @NotSupported(reason = Reason.CUSTOM_PROVIDERS)
   public void testProviderResolverReturnsListOfAvailableProviders() {
-    fail("TODO(nchalko) figure out how to test this in GWT");
+    fail("Custom validation providers are not supported");
   }
 
   @NonTckTest
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/TckTest.gwt.xml
index 054e740..3f04e46 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2011 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/application/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/application/TckTest.gwt.xml
index 920c549..f2198a4 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/application/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/application/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/BuiltinValidatorOverrideGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/BuiltinValidatorOverrideGwtTest.java
index b512308..827d06e 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/BuiltinValidatorOverrideGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/BuiltinValidatorOverrideGwtTest.java
@@ -17,7 +17,8 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
 
 /**
  * Test wrapper for {@link BuiltinValidatorOverrideTest}.
@@ -30,8 +31,8 @@
     return "org.hibernate.jsr303.tck.tests.constraints.builtinconstraints.TckTest";
   }
 
-  @Failing(issue = 6285)
+  @NotSupported(reason = Reason.XML)
   public void testXmlConfiguredValidatorConfigurationHasPrecedence() {
-    fail("TODO(nchalko): Pass the overrides to hibernate at gwt compile time fromthe GWT module.");
+    fail("XML configuration is not supported");
   }
 }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/TckTest.gwt.xml
index 1009a69..dc2abe6 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/builtinconstraints/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/TckTest.gwt.xml
index f3c9ac1..fffe745 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/nestedconstraintcomposition/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/nestedconstraintcomposition/TckTest.gwt.xml
index 00310d5..6900862 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/nestedconstraintcomposition/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/nestedconstraintcomposition/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintdefinition/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintdefinition/TckTest.gwt.xml
index 5d35b77..689f7d5 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintdefinition/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintdefinition/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/customconstraint/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/customconstraint/TckTest.gwt.xml
index 37c38b9..c47f5e8 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/customconstraint/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/customconstraint/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupSequenceContainingDefaultValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupSequenceContainingDefaultValidatorFactory.java
index bf18bb5..d958005 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupSequenceContainingDefaultValidatorFactory.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupSequenceContainingDefaultValidatorFactory.java
@@ -23,6 +23,7 @@
 import org.hibernate.jsr303.tck.tests.constraints.groups.DefaultGroupRedefinitionTest.AddressWithDefaultInGroupSequence;
 
 import javax.validation.Validator;
+import javax.validation.groups.Default;
 
 /**
  * ValidatorFactory for
@@ -35,7 +36,8 @@
    * Validator for
    * {@link DefaultGroupRedefinitionTest#testGroupSequenceContainingDefault()}
    */
-  @GwtValidation(value = {AddressWithDefaultInGroupSequence.class})
+  @GwtValidation(value = {AddressWithDefaultInGroupSequence.class},
+      groups = {Default.class, Address.HighLevelCoherence.class, Address.Complete.class})
   public static interface GroupSequenceContainingDefaultValidator extends
       Validator {
   }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupSequenceWithNoImplicitDefaultGroupValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupSequenceWithNoImplicitDefaultGroupValidatorFactory.java
index 6dc43ce..15acfd6 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupSequenceWithNoImplicitDefaultGroupValidatorFactory.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/GroupSequenceWithNoImplicitDefaultGroupValidatorFactory.java
@@ -23,6 +23,7 @@
 import org.hibernate.jsr303.tck.tests.constraints.groups.DefaultGroupRedefinitionTest.AddressWithDefaultInGroupSequence;
 
 import javax.validation.Validator;
+import javax.validation.groups.Default;
 
 /**
  * ValidatorFactory for
@@ -35,7 +36,8 @@
    * Validator for
    * {@link DefaultGroupRedefinitionTest#testGroupSequenceWithNoImplicitDefaultGroup()}
    */
-  @GwtValidation(value = {AddressWithDefaultInGroupSequence.class})
+  @GwtValidation(value = {AddressWithDefaultInGroupSequence.class},
+      groups = {Default.class, Address.HighLevelCoherence.class, Address.Complete.class})
   public static interface TestValidator extends Validator {
   }
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/TckTest.gwt.xml
index 7078a23..5f34eed 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/TckTestValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/TckTestValidatorFactory.java
index 9db324a..6bfe8e5 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/TckTestValidatorFactory.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/TckTestValidatorFactory.java
@@ -35,8 +35,8 @@
       Address.class, Animal.class, Book.class, Car.class, Order.class,
         User.class},
       groups = {Default.class, User.Billable.class, User.BuyInOneClick.class, User.Optional.class, 
-        CyclicGroupSequence.class, Auditable.class, 
-        First.class, Second.class, Last.class, Book.All.class})
+        CyclicGroupSequence.class, Auditable.class, First.class, Second.class, Last.class,
+        Book.All.class, Address.HighLevelCoherence.class, Address.Complete.class, Car.Test.class})
   public static interface GwtValidator extends Validator {
   }
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequence/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequence/TckTest.gwt.xml
index 2412935..488ac8d 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequence/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequence/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTest.gwt.xml
index 3ea0047..ff5fa17 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTestValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTestValidatorFactory.java
index 58764fe..ef8e7af 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTestValidatorFactory.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/groupsequenceisolation/TckTestValidatorFactory.java
@@ -31,7 +31,7 @@
    * Marker Interface to {@link GWT#create(Class)}.
    */
   @GwtValidation(value = {B1.class, B2.class, B3.class, C.class, E.class},
-      groups = {Heavy.class, Minimal.class})
+      groups = {Heavy.class, Minimal.class, Later.class})
   public static interface GwtValidator extends Validator {
   }
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/inheritance/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/inheritance/TckTest.gwt.xml
index 2f86e8a..3be43d6 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/inheritance/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/groups/inheritance/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/inheritance/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/inheritance/TckTest.gwt.xml
index 0246c75..35bbcf6 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/inheritance/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/inheritance/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/invalidconstraintdefinitions/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/invalidconstraintdefinitions/TckTest.gwt.xml
index 678091e..968ddd6 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/invalidconstraintdefinitions/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/invalidconstraintdefinitions/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/AmbiguousValidatorFactory.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/AmbiguousValidatorFactory.gwt.xml
index c827904..6237571 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/AmbiguousValidatorFactory.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/AmbiguousValidatorFactory.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/TckTest.gwt.xml
index 52be2f1..51562ce 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/constraints/validatorresolution/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/messageinterpolation/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/messageinterpolation/TckTest.gwt.xml
index 8f8f063..c879842 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/messageinterpolation/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/messageinterpolation/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/messageinterpolation/TckTest_de.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/messageinterpolation/TckTest_de.gwt.xml
index f53fb5f..2d08803 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/messageinterpolation/TckTest_de.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/messageinterpolation/TckTest_de.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTest.gwt.xml
index cddeb2b..db2ccc1 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTestValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTestValidatorFactory.java
index f7a1d6d..e512a49 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTestValidatorFactory.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/metadata/TckTestValidatorFactory.java
@@ -20,6 +20,8 @@
 import com.google.gwt.validation.client.GwtValidation;
 import com.google.gwt.validation.client.impl.AbstractGwtValidator;
 
+import org.hibernate.jsr303.tck.tests.metadata.Person.PersonValidation;
+
 import javax.validation.Validator;
 import javax.validation.groups.Default;
 
@@ -35,7 +37,7 @@
         Account.class, Customer.class, Man.class, Order.class, Person.class,
         SubClass.class, SuperClass.class, UnconstraintEntity.class},
       groups = {Default.class, SubClass.DefaultGroup.class, SuperClass.BasicGroup.class,
-        SuperClass.InheritedGroup.class, SuperClass.UnusedGroup.class})
+        SuperClass.InheritedGroup.class, SuperClass.UnusedGroup.class, PersonValidation.class})
   public static interface GwtValidator extends Validator {
   }
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/traversableresolver/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/traversableresolver/TckTest.gwt.xml
index a3273e7..f5b81cb 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/traversableresolver/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/traversableresolver/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/traversableresolver/TraversableResolverGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/traversableresolver/TraversableResolverGwtTest.java
index 1fc39c4..0c3bdc1 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/traversableresolver/TraversableResolverGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/traversableresolver/TraversableResolverGwtTest.java
@@ -17,7 +17,7 @@
 
 import com.google.gwt.junit.client.GWTTestCase;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
+import javax.validation.ValidationException;
 
 /**
  * Test wrapper for {@link TraversableResolverTest}.
@@ -30,18 +30,23 @@
     return "org.hibernate.jsr303.tck.tests.traversableresolver.TckTest";
   }
 
-  @Failing(issue = 6544)
   public void testCorrectNumberOfCallsToIsReachableAndIsCascadable() {
     delegate.testCorrectNumberOfCallsToIsReachableAndIsCascadable();
   }
 
-  @Failing(issue = 6544)
   public void testCustomTraversableResolverViaConfiguration() {
     delegate.testCustomTraversableResolverViaConfiguration();
   }
 
   public void testResolverExceptionsGetWrappedInValidationException() {
-    delegate.testResolverExceptionsGetWrappedInValidationException();
+    try {
+      delegate.testResolverExceptionsGetWrappedInValidationException();
+    } catch (ValidationException expected) {
+      Throwable cause = expected.getCause();
+      assertEquals(RuntimeException.class, cause.getClass());
+      assertTrue("isReachable failed".equals(cause.getMessage()) || 
+          "isCascadable failed".equals(cause.getMessage()));
+    }
   }
 
 }
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validation/PropertyPathGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/validation/PropertyPathGwtTest.java
index 93c8ddf..7355c9d 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validation/PropertyPathGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/validation/PropertyPathGwtTest.java
@@ -15,8 +15,6 @@
  */
 package org.hibernate.jsr303.tck.tests.validation;
 
-import org.hibernate.jsr303.tck.util.client.Failing;
-
 /**
  * Test wrapper for {@link PropertyPathTest}.
  */
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validation/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/validation/TckTest.gwt.xml
index ea01d16..a61d136 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validation/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/validation/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validation/UnknownProviderBootstrapCompileTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/validation/UnknownProviderBootstrapCompileTest.gwt.xml
index 87ee45e..a4916dd 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validation/UnknownProviderBootstrapCompileTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/validation/UnknownProviderBootstrapCompileTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validation/UnknownProviderBootstrapCompileTest.java b/user/test/org/hibernate/jsr303/tck/tests/validation/UnknownProviderBootstrapCompileTest.java
index 2f2678f..42b2110 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validation/UnknownProviderBootstrapCompileTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/validation/UnknownProviderBootstrapCompileTest.java
@@ -16,10 +16,9 @@
 package org.hibernate.jsr303.tck.tests.validation;
 
 import org.hibernate.jsr303.tck.util.TckCompileTestCase;
-import org.hibernate.jsr303.tck.util.client.Failing;
 import org.hibernate.jsr303.tck.util.client.NonTckTest;
-
-import javax.validation.ValidationException;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
 
 /**
  * Test wrapper for {@link UnknownProviderBootstrapTest} methods that are
@@ -30,10 +29,8 @@
   @NonTckTest
   public void testThereMustBeOnePassingTest() {}
 
-  @Failing(issue = 6573)
+  @NotSupported(reason = Reason.CUSTOM_PROVIDERS)
   public void testUnknownProviderThrowsValidationException() {
-    assertValidatorFailsToCompile(TckTestValidatorFactory.GwtValidator.class,
-        ValidationException.class,
-        "TODO(nchalko): get this to actually fail in the test.");
+    fail("Custom validation providers are not supported so an unknown provider should never occur");
   }
 }
\ No newline at end of file
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validation/ValidationGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/validation/ValidationGwtTest.java
index e78aaff..055893b 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validation/ValidationGwtTest.java
+++ b/user/test/org/hibernate/jsr303/tck/tests/validation/ValidationGwtTest.java
@@ -15,8 +15,9 @@
  */
 package org.hibernate.jsr303.tck.tests.validation;
 
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
 import org.hibernate.jsr303.tck.util.client.TestNotCompatible;
-import org.hibernate.jsr303.tck.util.client.TestNotCompatible.Reason;
 
 /**
  * Test wrapper for {@link ValidationTest}.
@@ -29,15 +30,17 @@
     delegate.testBuildDefaultValidatorFactory();
   }
 
+  @NotSupported(reason = Reason.CUSTOM_PROVIDERS)
   public void testCustomValidationProviderResolution() {
-    delegate.testCustomValidationProviderResolution();
+    fail("Custom validation providers are not supported");
   }
 
+  @NotSupported(reason = Reason.CUSTOM_PROVIDERS)
   public void testSpecificValidationProvider() {
-    delegate.testSpecificValidationProvider();
+    fail("Custom validation providers are not supported");
   }
 
-  @TestNotCompatible(reason = Reason.REFLECTION, 
+  @TestNotCompatible(reason = TestNotCompatible.Reason.REFLECTION, 
       whereTested = "This test checks the methods of the API itself, it does not need to be tested here also.")
   public void testVerifyMethodsOfValidationObjects() {
     // This method is excluded because it does not compile.
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/TckTest.gwt.xml
index 29ee564..ada2c5b 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/validation/graphnavigation/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validation/validatorcontext/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/validation/validatorcontext/TckTest.gwt.xml
index 3142b82..a356395 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validation/validatorcontext/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/validation/validatorcontext/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/validatorfactory/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/validatorfactory/TckTest.gwt.xml
index d562da5..d342ea0 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/validatorfactory/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/validatorfactory/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2010 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TckTest.gwt.xml
index 1b9f361..12b64a0 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2011 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/TckTest.gwt.xml
index 579c66d..d2db34b 100644
--- a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/TckTest.gwt.xml
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/TckTest.gwt.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
 <!--
   Copyright 2011 Google Inc.
 
diff --git a/user/test/org/hibernate/jsr303/tck/util/TckCompileTestCase.java b/user/test/org/hibernate/jsr303/tck/util/TckCompileTestCase.java
index 7264867..8303e1e 100644
--- a/user/test/org/hibernate/jsr303/tck/util/TckCompileTestCase.java
+++ b/user/test/org/hibernate/jsr303/tck/util/TckCompileTestCase.java
@@ -14,22 +14,21 @@
  * the License.
  */package org.hibernate.jsr303.tck.util;
 
+import static org.hibernate.jsr303.tck.util.TckGeneratorTestUtils.createFailOnErrorLogger;
+import static org.hibernate.jsr303.tck.util.TckGeneratorTestUtils.createGeneratorContext;
+import static org.hibernate.jsr303.tck.util.TckGeneratorTestUtils.createTestLogger;
+import static org.hibernate.jsr303.tck.util.TckGeneratorTestUtils.getFullyQualifiedModuleName;
+
 import com.google.gwt.core.ext.Generator;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.dev.javac.StandardGeneratorContext;
 import com.google.gwt.dev.util.UnitTestTreeLogger;
-import com.google.gwt.junit.client.GWTTestCase;
-import com.google.gwt.validation.rebind.BeanHelper;
-import com.google.gwt.validation.rebind.GwtSpecificValidatorGenerator;
+import com.google.gwt.validation.rebind.BeanHelperCache;
 import com.google.gwt.validation.rebind.ValidatorGenerator;
 
 import junit.framework.Assert;
-
-import static org.hibernate.jsr303.tck.util.TckGeneratorTestUtils.createFailOnErrorLogger;
-import static org.hibernate.jsr303.tck.util.TckGeneratorTestUtils.createGeneratorContext;
-import static org.hibernate.jsr303.tck.util.TckGeneratorTestUtils.createTestLogger;
-import static org.hibernate.jsr303.tck.util.TckGeneratorTestUtils.getFullyQualifiedModuleName;
+import junit.framework.TestCase;
 
 import javax.validation.ValidationException;
 import javax.validation.Validator;
@@ -37,31 +36,24 @@
 /**
  * Abstract TestCase for TCK tests that are expected to fail to compile.
  */
-public abstract class TckCompileTestCase extends GWTTestCase {
+public abstract class TckCompileTestCase extends TestCase {
 
+  private BeanHelperCache cache;
   private StandardGeneratorContext context;
   private TreeLogger failOnErrorLogger;
-
-  protected TckCompileTestCase() {
-    super();
-  }
-
-  @Override
-  public final String getModuleName() {
-    return null; // Run as JRE tests
-  }
+  private Class<?>[] validGroups;
 
   protected void assertBeanValidatorFailsToCompile(
       Class<? extends Validator> validatorClass, Class<?> beanType,
       Class<? extends ValidationException> expectedException,
       String expectedMessage) throws UnableToCompleteException {
-    ValidatorGenerator generator = new ValidatorGenerator();
+    ValidatorGenerator generator = new ValidatorGenerator(cache, validGroups);
     generator.generate(failOnErrorLogger, context,
         validatorClass.getCanonicalName());
     context.finish(failOnErrorLogger);
 
     // Now create the validator that is going to fail
-    GwtSpecificValidatorGenerator specificGenerator = new GwtSpecificValidatorGenerator();
+    ValidatorGenerator specificGenerator = new ValidatorGenerator(cache, validGroups);
     String beanHelperName = createBeanHelper(beanType);
     assertUnableToComplete(expectedException, expectedMessage,
         specificGenerator, beanHelperName);
@@ -71,23 +63,18 @@
       Class<? extends Validator> validatorClass,
       Class<? extends ValidationException> expectedException,
       String expectedMessage) {
-    ValidatorGenerator generator = new ValidatorGenerator();
+    ValidatorGenerator generator = new ValidatorGenerator(cache, validGroups);
     assertUnableToComplete(expectedException, expectedMessage, generator,
         validatorClass.getCanonicalName());
   }
 
   @Override
-  protected void gwtSetUp() throws Exception {
-    super.gwtSetUp();
-    BeanHelper.clearBeanHelpersForTests();
+  protected void setUp() throws Exception {
+    super.setUp();
+    cache = new BeanHelperCache();
     failOnErrorLogger = createFailOnErrorLogger();
     context = createGeneratorContext(getTckTestModuleName(), failOnErrorLogger);
-  }
-
-  @Override
-  protected void gwtTearDown() throws Exception {
-    BeanHelper.clearBeanHelpersForTests();
-    super.gwtTearDown();
+    validGroups = new Class<?>[]{ };
   }
 
   private void assertUnableToComplete(
@@ -107,7 +94,7 @@
 
   private String createBeanHelper(Class<?> beanType)
       throws UnableToCompleteException {
-    return BeanHelper.createBeanHelper(beanType, failOnErrorLogger, context)
+    return cache.createHelper(beanType, failOnErrorLogger, context)
         .getFullyQualifiedValidatorName();
   }
 
diff --git a/user/test/org/hibernate/jsr303/tck/util/client/NotSupported.java b/user/test/org/hibernate/jsr303/tck/util/client/NotSupported.java
index 13d8593..f32ef0d 100644
--- a/user/test/org/hibernate/jsr303/tck/util/client/NotSupported.java
+++ b/user/test/org/hibernate/jsr303/tck/util/client/NotSupported.java
@@ -37,7 +37,7 @@
    * Constants for why a test is not supported.
    */
   public enum Reason {
-    XML, IO, CALENDAR, CONSTRAINT_VALIDATOR_FACTORY
+    XML, IO, CALENDAR, CONSTRAINT_VALIDATOR_FACTORY, CUSTOM_PROVIDERS
   }
 
   /**