diff --git a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
index dd019a9..861091c 100644
--- a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
@@ -18,6 +18,8 @@
 
 import com.google.gwt.core.ext.LinkerContext;
 import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.linker.ArtifactSet;
 import com.google.gwt.core.ext.linker.CompilationResult;
 import com.google.gwt.core.ext.linker.LinkerOrder;
 import com.google.gwt.core.ext.linker.Shardable;
@@ -28,6 +30,9 @@
 import com.google.gwt.dev.util.DefaultTextOutput;
 import com.google.gwt.dev.util.TextOutput;
 import com.google.gwt.dev.util.Util;
+import com.google.gwt.util.tools.Utility;
+
+import java.io.IOException;
 
 /**
  * This linker uses an iframe to hold the code and a script tag to download the
@@ -38,6 +43,20 @@
 @LinkerOrder(Order.PRIMARY)
 @Shardable
 public class CrossSiteIframeLinker extends SelectionScriptLinker {
+  // TODO(unnurg): For each of the following properties, decide whether to make
+  // it a gwt.xml configuration property, a constant which can be overridden
+  // by subclasses, or not configurable at all.
+  private static final String installLocationJsProperty = 
+    "com/google/gwt/core/ext/linker/impl/installLocationIframe.js";
+  private static final boolean processMetasProperty = true;
+  private static final String scriptBaseProperty = "";
+  private static final boolean startDownloadImmediatelyProperty = true;
+  
+  private static final String WAIT_FOR_BODY_LOADED_JS =
+    "com/google/gwt/core/ext/linker/impl/waitForBodyLoaded.js";
+  
+  private static final boolean waitForBodyLoadedProperty = true;
+
   @Override
   public String getDescription() {
     return "Cross-Site-Iframe";
@@ -46,23 +65,88 @@
   @Override
   protected byte[] generatePrimaryFragment(TreeLogger logger,
       LinkerContext context, CompilationResult result, String[] js) {
-    // Wrap the script code with its prefix and suffix
     TextOutput script = new DefaultTextOutput(context.isOutputCompact());
     script.print(getModulePrefix(context, result.getStrongName(), js.length > 1));
     script.print(js[0]);
     script.print(getModuleSuffix(logger, context));
-
-    // Rewrite the code so it can be installed with
-    // __MODULE_FUNC__.onScriptDownloaded
-
     StringBuffer out = new StringBuffer();
-    out.append(context.getModuleFunctionName());
-    out.append(".onScriptDownloaded(");
-    out.append(JsToStringGenerationVisitor.javaScriptString(script.toString()));
-    out.append(")");
+
+    if (startDownloadImmediatelyProperty) {
+      // Rewrite the code so it can be installed with
+      // __MODULE_FUNC__.onScriptDownloaded
+      out.append(context.getModuleFunctionName());
+      out.append(".onScriptDownloaded(");
+      out.append(JsToStringGenerationVisitor.javaScriptString(script.toString()));
+      out.append(")");
+    } else {
+      out.append(script.toString());
+    }
 
     return Util.getBytes(out.toString());
   }
+  
+  @Override
+  protected String generateSelectionScript(TreeLogger logger,
+      LinkerContext context, ArtifactSet artifacts) throws UnableToCompleteException {
+    StringBuffer selectionScript = getSelectionScriptStringBuffer(logger, context);
+    
+    String waitForBodyLoadedJs;
+    String installLocationJs;
+    String computeScriptBase;
+    String processMetas;
+
+    try {
+      waitForBodyLoadedJs = Utility.getFileFromClassPath(WAIT_FOR_BODY_LOADED_JS);
+      processMetas = Utility.getFileFromClassPath(PROCESS_METAS_JS);
+      installLocationJs = Utility.getFileFromClassPath(installLocationJsProperty);
+      computeScriptBase = Utility.getFileFromClassPath(COMPUTE_SCRIPT_BASE_JS);
+    } catch (IOException e) {
+      logger.log(TreeLogger.ERROR, "Unable to read selection script template",
+          e);
+      throw new UnableToCompleteException();
+    }
+    
+    replaceAll(selectionScript, "__INSTALL_LOCATION__", installLocationJs);
+
+    if (waitForBodyLoadedProperty) {
+      replaceAll(selectionScript, "__WAIT_FOR_BODY_LOADED__", waitForBodyLoadedJs);
+    } else {
+      String waitForBodyLoadedNullImpl = 
+      "function setupWaitForBodyLoad(callback) { callback(); }";
+      replaceAll(selectionScript, "__WAIT_FOR_BODY_LOADED__", waitForBodyLoadedNullImpl);
+    }
+
+    if (startDownloadImmediatelyProperty) {
+      replaceAll(selectionScript, "__START_DOWNLOAD_IMMEDIATELY__", "true");
+    } else {
+      replaceAll(selectionScript, "__START_DOWNLOAD_IMMEDIATELY__", "false");
+    }
+    
+    if (processMetasProperty) {
+      replaceAll(selectionScript, "__PROCESS_METAS__", processMetas);
+    } else {
+      String processMetasNullImpl =
+        "function processMetas() { }";
+      replaceAll(selectionScript, "__PROCESS_METAS__", processMetasNullImpl);
+    }
+    
+    String scriptBase = scriptBaseProperty;
+    if ("".equals(scriptBase)) {
+      replaceAll(selectionScript, "__COMPUTE_SCRIPT_BASE__", computeScriptBase);
+    } else {
+      String computeScriptBaseNullImpl =
+        "function computeScriptBase() { return '" + scriptBase + "';}";
+      replaceAll(selectionScript, "__COMPUTE_SCRIPT_BASE__", computeScriptBaseNullImpl);
+    }
+
+    // This method needs to be called after all of the .js files have been
+    // swapped into the selectionScript since it will fill in __MODULE_NAME__
+    // and many of the .js files contain that template variable
+    selectionScript =
+      processSelectionScriptCommon(selectionScript, logger, context);
+
+    return selectionScript.toString();
+  }
 
   @Override
   protected String getCompilationExtension(TreeLogger logger,
@@ -72,7 +156,7 @@
 
   @Override
   protected String getHostedFilename() {
-    return "hosted.js";
+    return "devmode.js";
   }
   
   @Override
@@ -91,17 +175,15 @@
   protected String getModuleSuffix(TreeLogger logger, LinkerContext context) {
     DefaultTextOutput out = new DefaultTextOutput(context.isOutputCompact());
 
-    out.print("$stats && $stats({moduleName:'" + context.getModuleName()
-        + "',sessionId:$sessionId"
-        + ",subSystem:'startup',evtGroup:'moduleStartup'"
-        + ",millis:(new Date()).getTime(),type:'moduleEvalEnd'});");
-
-    // Generate the call to tell the bootstrap code that we're ready to go.
+    out.print("$sendStats('moduleStartup', 'moduleEvalEnd');");
     out.newlineOpt();
-    out.print("if ($wnd." + context.getModuleFunctionName() + " && $wnd."
-        + context.getModuleFunctionName() + ".onScriptInstalled) $wnd."
-        + context.getModuleFunctionName() + ".onScriptInstalled(gwtOnLoad);");
+    out.print("gwtOnLoad("
+        + "__gwtModuleFunction.__errFn, "
+        + "__gwtModuleFunction.__moduleName, "
+        + "__gwtModuleFunction.__moduleBase, "
+        + "__gwtModuleFunction.__softPermutationId);");
     out.newlineOpt();
+    out.print("$sendStats('moduleStartup', 'end');");
 
     return out.toString();
   }
@@ -115,35 +197,27 @@
   private String getModulePrefix(LinkerContext context, String strongName,
       boolean supportRunAsync) {
     TextOutput out = new DefaultTextOutput(context.isOutputCompact());
-
+    out.print("var __gwtModuleFunction = $wnd." + context.getModuleFunctionName() + ";");
+    out.newlineOpt();
+    out.print("var $sendStats = __gwtModuleFunction.__sendStats;");
+    out.newlineOpt();
+    out.print("$sendStats('moduleStartup', 'moduleEvalStart');");
+    out.newlineOpt();
     out.print("var $gwt_version = \"" + About.getGwtVersionNum() + "\";");
     out.newlineOpt();
-    out.print("var $wnd = window.parent;");
-    out.newlineOpt();
-    out.print("var $doc = $wnd.document;");
-    out.newlineOpt();
-    out.print("var $moduleName, $moduleBase;");
-    out.newlineOpt();
     out.print("var $strongName = '" + strongName + "';");
     out.newlineOpt();
+    out.print("var $doc = $wnd.document;");
+
+    // Even though we call the $sendStats function in the code written in this
+    // linker, some of the compilation code still needs the $stats and $sessionId
+    // variables to be available.
     out.print("var $stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null;");
     out.newlineOpt();
     out.print("var $sessionId = $wnd.__gwtStatsSessionId ? $wnd.__gwtStatsSessionId : null;");
     out.newlineOpt();
 
-    out.print("$stats && $stats({moduleName:'" + context.getModuleName()
-        + "',sessionId:$sessionId"
-        + ",subSystem:'startup',evtGroup:'moduleStartup'"
-        + ",millis:(new Date()).getTime(),type:'moduleEvalStart'});");
-    out.newlineOpt();
-
-    if (supportRunAsync) {
-      out.print("var __gwtModuleFunction = $wnd.");
-      out.print(context.getModuleFunctionName());
-      out.print(";");
-      out.newlineOpt();
-    }
-
     return out.toString();
   }
+  
 }
diff --git a/dev/core/src/com/google/gwt/dev/Precompile.java b/dev/core/src/com/google/gwt/dev/Precompile.java
index 88f64ab..5b11870 100644
--- a/dev/core/src/com/google/gwt/dev/Precompile.java
+++ b/dev/core/src/com/google/gwt/dev/Precompile.java
@@ -40,8 +40,8 @@
 import com.google.gwt.dev.jjs.JsOutputOption;
 import com.google.gwt.dev.jjs.UnifiedAst;
 import com.google.gwt.dev.shell.CheckForUpdates;
-import com.google.gwt.dev.shell.StandardRebindOracle;
 import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult;
+import com.google.gwt.dev.shell.StandardRebindOracle;
 import com.google.gwt.dev.util.CollapsedPropertyKey;
 import com.google.gwt.dev.util.Memory;
 import com.google.gwt.dev.util.Util;
@@ -57,6 +57,7 @@
 import com.google.gwt.dev.util.arg.ArgHandlerEnableAssertions;
 import com.google.gwt.dev.util.arg.ArgHandlerGenDir;
 import com.google.gwt.dev.util.arg.ArgHandlerMaxPermsPerPrecompile;
+import com.google.gwt.dev.util.arg.ArgHandlerOptimize;
 import com.google.gwt.dev.util.arg.ArgHandlerScriptStyle;
 import com.google.gwt.dev.util.arg.ArgHandlerSoyc;
 import com.google.gwt.dev.util.arg.ArgHandlerSoycDetailed;
@@ -119,6 +120,7 @@
       registerHandler(new ArgHandlerDisableUpdateCheck(options));
       registerHandler(new ArgHandlerDumpSignatures());
       registerHandler(new ArgHandlerMaxPermsPerPrecompile(options));
+      registerHandler(new ArgHandlerOptimize(options));
       registerHandler(new ArgHandlerCompileReport(options));
       registerHandler(new ArgHandlerSoyc(options));
       registerHandler(new ArgHandlerSoycDetailed(options));
@@ -167,6 +169,10 @@
       return maxPermsPerPrecompile;
     }
 
+    public int getOptimizationLevel() {
+      return jjsOptions.getOptimizationLevel();
+    }
+
     public JsOutputOption getOutput() {
       return jjsOptions.getOutput();
     }
@@ -239,10 +245,6 @@
       disableUpdateCheck = disabled;
     }
 
-    public void setDraftCompile(boolean draft) {
-      jjsOptions.setDraftCompile(draft);
-    }
-
     public void setEnableAssertions(boolean enableAssertions) {
       jjsOptions.setEnableAssertions(enableAssertions);
     }
@@ -259,6 +261,10 @@
       this.maxPermsPerPrecompile = maxPermsPerPrecompile;
     }
 
+    public void setOptimizationLevel(int level) {
+      jjsOptions.setOptimizationLevel(level);
+    }
+
     public void setOptimizePrecompile(boolean optimize) {
       jjsOptions.setOptimizePrecompile(optimize);
     }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
index 9df0ce8..88dae70 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.dev.jjs;
 
+import com.google.gwt.dev.util.arg.OptionOptimize;
+
 import java.io.Serializable;
 
 /**
@@ -25,7 +27,6 @@
   private boolean aggressivelyOptimize = true;
   private boolean disableCastChecking = false;
   private boolean disableClassMetadata = false;
-  private boolean draftCompile = false;
   private boolean enableAssertions;
   private boolean optimizePrecompile = false;
   private JsOutputOption output = JsOutputOption.OBFUSCATED;
@@ -33,6 +34,7 @@
   private boolean soycEnabled = false;
   private boolean soycExtra = false;
   private boolean strict = false;
+  private int optimizationLevel = OptionOptimize.OPTIMIZE_LEVEL_MAX;
 
   public JJSOptionsImpl() {
   }
@@ -42,11 +44,11 @@
   }
 
   public void copyFrom(JJSOptions other) {
-    setAggressivelyOptimize(other.isAggressivelyOptimize());
     setCastCheckingDisabled(other.isCastCheckingDisabled());
     setClassMetadataDisabled(other.isClassMetadataDisabled());
-    setDraftCompile(other.isDraftCompile());
     setEnableAssertions(other.isEnableAssertions());
+    setAggressivelyOptimize(other.isAggressivelyOptimize());
+    setOptimizationLevel(other.getOptimizationLevel());
     setOutput(other.getOutput());
     setRunAsyncEnabled(other.isRunAsyncEnabled());
     setSoycEnabled(other.isSoycEnabled());
@@ -54,6 +56,10 @@
     setStrict(other.isStrict());
   }
 
+  public int getOptimizationLevel() {
+    return optimizationLevel;
+  }
+  
   public JsOutputOption getOutput() {
     return output;
   }
@@ -71,7 +77,7 @@
   }
 
   public boolean isDraftCompile() {
-    return draftCompile;
+    return optimizationLevel == OptionOptimize.OPTIMIZE_LEVEL_DRAFT;
   }
 
   public boolean isEnableAssertions() {
@@ -110,14 +116,14 @@
     disableClassMetadata = disabled;
   }
 
-  public void setDraftCompile(boolean draft) {
-    this.draftCompile = draft;
-  }
-
   public void setEnableAssertions(boolean enableAssertions) {
     this.enableAssertions = enableAssertions;
   }
 
+  public void setOptimizationLevel(int level) {
+    optimizationLevel = level;
+  }
+
   public void setOptimizePrecompile(boolean optimize) {
     optimizePrecompile = optimize;
   }
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 f34e6c8..804b279 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -126,6 +126,7 @@
 import com.google.gwt.dev.util.Memory;
 import com.google.gwt.dev.util.TextOutput;
 import com.google.gwt.dev.util.Util;
+import com.google.gwt.dev.util.arg.OptionOptimize;
 import com.google.gwt.dev.util.collect.Maps;
 import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
@@ -273,7 +274,8 @@
       ResolveRebinds.exec(jprogram, permutation.getOrderedRebindAnswers());
 
       // (4) Optimize the normalized Java AST for each permutation.
-      if (options.isDraftCompile()) {
+      int optimizationLevel = options.getOptimizationLevel();
+      if (optimizationLevel == OptionOptimize.OPTIMIZE_LEVEL_DRAFT) {
         draftOptimize(jprogram);
       } else {
         optimize(options, jprogram);
@@ -311,8 +313,8 @@
       EvalFunctionsAtTopScope.exec(jsProgram, map);
 
       // (9) Optimize the JS AST.
-      if (!options.isDraftCompile()) {
-        optimizeJs(jsProgram);
+      if (optimizationLevel > OptionOptimize.OPTIMIZE_LEVEL_DRAFT) {
+        optimizeJs(options, jsProgram);
       }
 
       /*
@@ -578,7 +580,7 @@
        * Don't optimizing early if this is a draft compile, or if there's only
        * one permutation.
        */
-      if (!options.isDraftCompile() && !singlePermutation) {
+      if (options.getOptimizationLevel() > OptionOptimize.OPTIMIZE_LEVEL_DRAFT && !singlePermutation) {
         if (options.isOptimizePrecompile()) {
           /*
            * Go ahead and optimize early, so that each permutation will run
@@ -619,35 +621,17 @@
    * succeeds.
    */
   protected static void draftOptimize(JProgram jprogram) {
+    Event draftOptimizeEvent = SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE);
     /*
      * Record the beginning of optimizations; this turns on certain checks that
      * guard against problematic late construction of things like class
      * literals.
      */
     jprogram.beginOptimizations();
-
-    Event draftOptimizeEvent = SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE);
-
-    Event draftFinalizerEvent = SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
-        "finalizer");
     Finalizer.exec(jprogram);
-    draftFinalizerEvent.end();
-
-    Event draftMakeCallsStaticEvent =
-        SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase", "makeCallsStatic");
     MakeCallsStatic.exec(jprogram);
-    draftMakeCallsStaticEvent.end();
-
-    Event draftRecomputeEvent = SpeedTracerLogger.start(
-        CompilerEventType.DRAFT_OPTIMIZE, "phase", "recomputeAfterOptimizations");
     jprogram.typeOracle.recomputeAfterOptimizations();
-    draftRecomputeEvent.end();
-
-    Event draftDeadCode = SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
-        "deadCodeElimination");
     DeadCodeElimination.exec(jprogram);
-    draftDeadCode.end();
-
     draftOptimizeEvent.end();
   }
 
@@ -664,8 +648,12 @@
 
     List<OptimizerStats> allOptimizerStats = new ArrayList<OptimizerStats>();
     int counter = 0;
+    int optimizationLevel = options.getOptimizationLevel();    
     while (true) {
       counter++;
+      if (optimizationLevel < OptionOptimize.OPTIMIZE_LEVEL_MAX && counter > optimizationLevel) {
+        break;
+      }
       if (Thread.interrupted()) {
         optimizeEvent.end();
         throw new InterruptedException();
@@ -695,7 +683,7 @@
     optimizeEvent.end();
   }
 
-  protected static void optimizeJs(JsProgram jsProgram) throws InterruptedException {
+  protected static void optimizeJs(JJSOptions options, JsProgram jsProgram) throws InterruptedException {
     List<OptimizerStats> allOptimizerStats = new ArrayList<OptimizerStats>();
     int counter = 0;
     while (true) {
@@ -718,8 +706,9 @@
       allOptimizerStats.add(stats);
       
       optimizeJsEvent.end();
-      
-      if (!stats.didChange()) {
+      int optimizationLevel = options.getOptimizationLevel();
+      if ((optimizationLevel < OptionOptimize.OPTIMIZE_LEVEL_MAX && counter > optimizationLevel) 
+          || !stats.didChange()) {
         break;
       }
     }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JsFunctionClusterer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JsFunctionClusterer.java
index 8f86eec..f18cda9 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/JsFunctionClusterer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JsFunctionClusterer.java
@@ -16,13 +16,13 @@
 package com.google.gwt.dev.jjs.impl;
 
 import com.google.gwt.core.ext.linker.StatementRanges;
+import com.google.gwt.dev.util.editdistance.GeneralEditDistance;
+import com.google.gwt.dev.util.editdistance.GeneralEditDistances;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.List;
 import java.util.LinkedList;
-import java.util.Iterator;
 import java.util.regex.Pattern;
 
 /**
@@ -33,19 +33,33 @@
  */
 public class JsFunctionClusterer extends JsAbstractTextTransformer {
 
-  private static Pattern functionPattern =
-      Pattern.compile("^(function |[A-Za-z0-9_$]+=function)");
+  /**
+   * Used by isFunctionDeclaration to check a statement is a function
+   * declaration or not. This should match standard declarations,
+   * such as "function a() { ... }" and "jslink.a=function() { ... }".
+   * The latter form is typically emitted by the cross-site linker.
+   */
+  private static final Pattern functionDeclarationPattern =
+      Pattern.compile("function |[a-zA-Z][.$_a-zA-Z0-9]*=function");
 
   /**
-   * Limit edit-distance search to MAX_DIST.
+   * Functions which have an edit-distance greater than this limit are
+   * considered equally different.
    */
-  private static final int MAX_DIST = 10;
-
   private static final int MAX_DISTANCE_LIMIT = 100;
 
-  private int[] clusteredIndices;
+  /**
+   * Maximum number of functions to search for minimal edit-distance
+   * before giving up.
+   */
+  private static final int SEARCH_LIMIT = 10;
 
-  private List<Integer> functionIndices;
+  /**
+   * Tells whether a statement is a function declaration or not.
+   */
+  private static boolean isFunctionDeclaration(String code) {
+    return functionDeclarationPattern.matcher(code).lookingAt();
+  }
 
   public JsFunctionClusterer(JsAbstractTextTransformer xformer) {
     super(xformer);
@@ -57,12 +71,12 @@
 
   @Override
   public void exec() {
-    functionIndices = new LinkedList<Integer>();
+    LinkedList<Integer> functionIndices = new LinkedList<Integer>();
 
     // gather up all of the indices of function decl statements
     for (int i = 0; i < statementRanges.numStatements(); i++) {
       String code = getJsForRange(i);
-      if (functionPattern.matcher(code).find()) {
+      if (isFunctionDeclaration(code)) {
         functionIndices.add(i);
       }
     }
@@ -75,29 +89,29 @@
     });
 
     // used to hold the new output order
-    clusteredIndices = new int[functionIndices.size()];
+    int[] clusteredIndices = new int[functionIndices.size()];
     int currentFunction = 0;
 
     // remove the first function and stick it in the output array
     clusteredIndices[currentFunction] = functionIndices.get(0);
     functionIndices.remove(0);
-
     while (!functionIndices.isEmpty()) {
-
       // get the last outputted function to match against
       String currentCode = getJsForRange(clusteredIndices[currentFunction]);
-      int bestDistance = 99999;
-      int bestIndex = 0;
-      int bestFunction = 0;
+      final GeneralEditDistance editDistance =
+        GeneralEditDistances.getLevenshteinDistance(currentCode);
 
-      Iterator<Integer> it = functionIndices.iterator();
+      int bestIndex = 0;
+      int bestFunction = functionIndices.getFirst();
+      int bestDistance = MAX_DISTANCE_LIMIT;
+
       int count = 0;
-      // search up to MAX_DIST functions for the best match
-      while (it.hasNext() && count < Math.min(MAX_DIST, functionIndices.size())) {
-        int functionIndex = it.next();
+      for (int functionIndex : functionIndices) {
+        if (count >= SEARCH_LIMIT) {
+          break;
+        }
         String testCode = getJsForRange(functionIndex);
-        int distanceLimit = Math.min(bestDistance, MAX_DISTANCE_LIMIT);
-        int dist = levdist(currentCode, testCode, distanceLimit);
+        int dist = editDistance.getDistance(testCode, bestDistance);
         if (dist < bestDistance) {
           bestDistance = dist;
           bestIndex = count;
@@ -120,73 +134,13 @@
     // Then output everything else that is not a function.
     for (int i = 0; i < statementRanges.numStatements(); i++) {
       String code = getJsForRange(i);
-      if (!code.startsWith("function")) {
+      if (!isFunctionDeclaration(code)) {
         addStatement(code, newJs, starts, ends);
       }
     }
     super.endStatements(newJs, starts, ends);
   }
 
-  /**
-   * Compute the Levenshtein distance between two strings, up to a distance
-   * limit.
-   */
-  private int levdist(String str1, String str2, int limit) {
-    if (str1.length() > str2.length()) {
-      return levdist(str2, str1, limit);
-    }
-    if (str1.length() == 0) {
-      return str2.length();
-    }
-    if (Math.abs(str1.length() - str2.length()) >= limit) {
-      return limit;
-    }
-
-    int str1len = str1.length();
-    int str2len = str2.length();
-
-    int lastRow[] = new int[str2len + 1];
-    int nextRow[] = new int[str2len + 1];
-
-    for (int j = 0; j <= Math.min(str2len, limit + 1); j++) {
-      lastRow[j] = j;
-    }
-
-    for (int i = 1; i <= str1len; i++) {
-      nextRow[0] = i;
-
-      if (i >= limit) {
-        nextRow[i - limit] = limit;
-      }
-      if (i >= limit + 1) {
-        nextRow[i - limit - 1] = limit;
-      }
-      if (i + limit <= str2len) {
-        nextRow[i + limit] = limit;
-      }
-      if (i + limit + 1 <= str2len) {
-        nextRow[i + limit + 1] = limit;
-      }
-
-      char c1 = str1.charAt(i - 1);
-
-      int j = Math.max(1, (i - limit + 1));
-      int jmax = Math.min(str2len, (i + limit - 1));
-
-      while (j <= jmax) {
-        char c2 = str2.charAt(j - 1);
-        int costSwap = c1 == c2 ? 0 : 1;
-        nextRow[j] =
-            Math.min(Math.min(lastRow[j] + 1, nextRow[j - 1] + 1), lastRow[j - 1] + costSwap);
-        j = j + 1;
-      }
-      int tmpRow[] = nextRow;
-      nextRow = lastRow;
-      lastRow = tmpRow;
-    }
-    return lastRow[Math.min(str2len, limit)];
-  }
-
   private int stmtSize(int index1) {
     return statementRanges.end(index1) - statementRanges.start(index1);
   }
diff --git a/plugins/webkit/English.lproj/InfoPlist.strings b/plugins/webkit/English.lproj/InfoPlist.strings
index 92beb1a..6260754 100644
--- a/plugins/webkit/English.lproj/InfoPlist.strings
+++ b/plugins/webkit/English.lproj/InfoPlist.strings
Binary files differ
diff --git a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/request/EmployeeProxy.java b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/request/EmployeeProxy.java
index 0728e9d..8cb3a09 100644
--- a/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/request/EmployeeProxy.java
+++ b/samples/expenses/src/main/java/com/google/gwt/sample/expenses/client/request/EmployeeProxy.java
@@ -1,12 +1,12 @@
 /*
  * 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
@@ -32,15 +32,13 @@
   String getDisplayName();
 
   Long getId();
-  
+
   String getPassword();
 
   EmployeeProxy getSupervisor();
 
   String getUserName();
 
-  boolean isChanged();
-
   void setDepartment(String department);
 
   void setDisplayName(String displayName);
@@ -50,6 +48,6 @@
   void setSupervisor(EmployeeProxy supervisor);
 
   void setUserName(String userName);
-  
+
   EntityProxyId<EmployeeProxy> stableId();
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_am.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_am.java
index 9ed1410..8df33ed 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_am.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_am.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "am".
+ * Implementation of DateTimeFormatInfo for the "am" locale.
  */
 public class DateTimeFormatInfoImpl_am extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "ጡዋት",
         "ከሳዓት"
     };
@@ -32,35 +32,35 @@
 
   @Override
   public String dateFormatFull() {
-    return "EEEE፣ dd MMMM ቀን y G";
+    return "EEEE, d MMMM y";
   }
 
   @Override
   public String dateFormatLong() {
-    return "dd MMMM y";
+    return "d MMMM y";
   }
 
   @Override
   public String dateFormatMedium() {
-    return "MMM d y";
+    return "d MMM y";
   }
 
   @Override
   public String dateFormatShort() {
-    return "dd/MM/yy";
+    return "dd/MM/yyyy";
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
-        "ዓ/ዓ",
-        "ዓ/ም"
+    return new String[] {
+        "ዓመተ ዓለም",
+        "ዓመተ ምሕረት"
     };
   }
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ዓ/ዓ",
         "ዓ/ም"
     };
@@ -128,7 +128,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "ጃንዩወሪ",
         "ፌብሩወሪ",
         "ማርች",
@@ -145,13 +145,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ጃ",
         "ፌ",
         "ማ",
@@ -168,13 +163,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ጃንዩ",
         "ፌብሩ",
         "ማርች",
@@ -191,13 +181,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -207,17 +192,27 @@
 
   @Override
   public String timeFormatFull() {
-    return "hh:mm:ss a zzzz";
+    return "h:mm:ss a zzzz";
   }
 
   @Override
   public String timeFormatLong() {
-    return "hh:mm:ss a z";
+    return "h:mm:ss a z";
+  }
+
+  @Override
+  public String timeFormatMedium() {
+    return "h:mm:ss a";
+  }
+
+  @Override
+  public String timeFormatShort() {
+    return "h:mm a";
   }
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "እሑድ",
         "ሰኞ",
         "ማክሰኞ",
@@ -229,13 +224,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "እ",
         "ሰ",
         "ማ",
@@ -247,13 +237,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "እሑድ",
         "ሰኞ",
         "ማክሰ",
@@ -263,9 +248,4 @@
         "ቅዳሜ"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_OM.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_OM.java
index 1e30156..108ffea 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_OM.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_OM.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ar_OM".
+ * Implementation of DateTimeFormatInfo for the "ar_OM" locale.
  */
 public class DateTimeFormatInfoImpl_ar_OM extends DateTimeFormatInfoImpl_ar {
 
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_QA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_QA.java
index 2080b58..bb326dc 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_QA.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_QA.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ar_QA".
+ * Implementation of DateTimeFormatInfo for the "ar_QA" locale.
  */
 public class DateTimeFormatInfoImpl_ar_QA extends DateTimeFormatInfoImpl_ar {
 
   @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "الأحد",
         "الاثنين",
         "الثلاثاء",
@@ -34,9 +34,4 @@
         "السبت"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_TN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_TN.java
index f7f06ec..44e248f 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_TN.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_TN.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,14 +15,24 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ar_TN".
+ * Implementation of DateTimeFormatInfo for the "ar_TN" locale.
  */
 public class DateTimeFormatInfoImpl_ar_TN extends DateTimeFormatInfoImpl_ar {
 
   @Override
+  public String dateFormatMedium() {
+    return "yyyy/MM/dd";
+  }
+
+  @Override
+  public String dateFormatShort() {
+    return "yyyy/M/d";
+  }
+
+  @Override
   public String formatMonthNumDay() {
     return "M/d";
   }
@@ -39,7 +49,7 @@
 
   @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "الأحد",
         "الاثنين",
         "الثلاثاء",
@@ -49,9 +59,4 @@
         "السبت"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_as.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_as.java
index e9c6c7d..1c0cd45 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_as.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_as.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,18 +15,18 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "as".
+ * Implementation of DateTimeFormatInfo for the "as" locale.
  */
 public class DateTimeFormatInfoImpl_as extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
-        "পূৰ্বা",
-        "অপ"
+    return new String[] {
+        "পূৰ্বাহ্ণ",
+        "অপৰাহ্ণ"
     };
   }
 
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -60,38 +60,38 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String[] monthsFull() {
-    return new String[] { 
-        "জানুয়াৰী",
-        "ফেব্ৰুয়াৰী",
+    return new String[] {
+        "জানুৱাৰী",
+        "ফেব্ৰুৱাৰী",
         "মাৰ্চ",
         "এপ্ৰিল",
         "মে",
         "জুন",
         "জুলাই",
         "আগষ্ট",
-        "সেপ্টেম্বৰ",
+        "ছেপ্তেম্বৰ",
         "অক্টোবৰ",
-        "নভেম্বৰ",
-        "ডিসেম্বৰ"
+        "নৱেম্বৰ",
+        "ডিচেম্বৰ"
     };
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -108,13 +108,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "জানু",
         "ফেব্ৰু",
         "মাৰ্চ",
@@ -131,17 +126,22 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
+  public String[] quartersFull() {
+    return new String[] {
+        "প্ৰথম প্ৰহৰ",
+        "দ্বিতীয় প্ৰহৰ",
+        "তৃতীয় প্ৰহৰ",
+        "চতুৰ্থ প্ৰহৰ"
+    };
   }
 
   @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
+  public String[] quartersShort() {
+    return new String[] {
+        "প্ৰথম প্ৰহৰ",
+        "দ্বিতীয় প্ৰহৰ",
+        "তৃতীয় প্ৰহৰ",
+        "চতুৰ্থ প্ৰহৰ"
     };
   }
 
@@ -167,7 +167,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "দেওবাৰ",
         "সোমবাৰ",
         "মঙ্গলবাৰ",
@@ -179,13 +179,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -197,13 +192,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "ৰবি",
         "সোম",
         "মঙ্গল",
@@ -215,11 +205,6 @@
   }
 
   @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
   public int weekendStart() {
     return 0;
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bo.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bo.java
index a655f4e..d7f5ba0 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bo.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bo.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,27 +15,22 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "bo".
+ * Implementation of DateTimeFormatInfo for the "bo" locale.
  */
 public class DateTimeFormatInfoImpl_bo extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "སྔ་དྲོ་",
         "ཕྱི་དྲོ་"
     };
   }
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
   public String dateFormatLong() {
     return "སྦྱི་ལོ་y MMMMའི་ཙེས་dད";
   }
@@ -46,13 +41,8 @@
   }
 
   @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "སྤྱི་ལོ་སྔོན།",
         "སྤྱི་ལོ།"
     };
@@ -60,13 +50,18 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "སྤྱི་ལོ་སྔོན།",
         "སྤྱི་ལོ།"
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatYearMonthAbbrevDay() {
     return "སྦྱི་ལོ་y MMMའི་ཙེས་dད";
   }
@@ -78,7 +73,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "ཟླ་བ་དང་པོ་",
         "ཟླ་བ་གཉིས་པ་",
         "ཟླ་བ་སུམ་པ་",
@@ -95,13 +90,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -118,13 +108,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ཟླ་༡",
         "ཟླ་༢",
         "ཟླ་༣",
@@ -141,13 +126,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "དུས་ཚིགས་དང་པོ།",
         "དུས་ཚིགས་གཉིས་པ།",
         "་དུས་ཚིགས་གསུམ་པ།",
@@ -157,7 +137,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "དུས་ཚིགས་དང་པོ།",
         "དུས་ཚིགས་གཉིས་པ།",
         "་དུས་ཚིགས་གསུམ་པ།",
@@ -166,28 +146,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "གཟའ་ཉི་མ་",
         "གཟའ་ཟླ་བ་",
         "གཟའ་མིག་དམར་",
@@ -199,13 +159,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "ཉི",
         "ཟླ",
         "མི",
@@ -217,13 +172,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "ཉི་མ་",
         "ཟླ་བ་",
         "མིག་དམར་",
@@ -233,9 +183,4 @@
         "སྤེན་པ་"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_byn.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_byn.java
index 587bd9b..a0120f4 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_byn.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_byn.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "byn".
+ * Implementation of DateTimeFormatInfo for the "byn" locale.
  */
 public class DateTimeFormatInfoImpl_byn extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "ፋዱስ ጃብ",
         "ፋዱስ ደምቢ"
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ይጅ",
         "ኣድ"
     };
@@ -60,7 +60,7 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ይጅ",
         "ኣድ"
     };
@@ -68,7 +68,7 @@
 
   @Override
   public int firstDayOfTheWeek() {
-    return 1;
+    return 6;
   }
 
   @Override
@@ -128,7 +128,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "ልደትሪ",
         "ካብኽብቲ",
         "ክብላ",
@@ -145,13 +145,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ል",
         "ካ",
         "ክ",
@@ -168,13 +163,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ልደት",
         "ካብኽ",
         "ክብላ",
@@ -191,13 +181,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -206,8 +191,28 @@
   }
 
   @Override
+  public String timeFormatFull() {
+    return "h:mm:ss a zzzz";
+  }
+
+  @Override
+  public String timeFormatLong() {
+    return "h:mm:ss a z";
+  }
+
+  @Override
+  public String timeFormatMedium() {
+    return "h:mm:ss a";
+  }
+
+  @Override
+  public String timeFormatShort() {
+    return "h:mm a";
+  }
+
+  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "ሰንበር ቅዳዅ",
         "ሰኑ",
         "ሰሊጝ",
@@ -219,13 +224,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "ሰ",
         "ሰ",
         "ሰ",
@@ -237,13 +237,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "ሰ/ቅ",
         "ሰኑ",
         "ሰሊጝ",
@@ -253,9 +248,4 @@
         "ሰ/ሽ"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ca.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ca.java
index 407cf3f..e79d1f7 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ca.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ca.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ca".
+ * Implementation of DateTimeFormatInfo for the "ca" locale.
  */
 public class DateTimeFormatInfoImpl_ca extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "a.m.",
         "p.m."
     };
@@ -52,26 +52,21 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
-        "aC",
-        "dC"
+    return new String[] {
+        "abans de Crist",
+        "després de Crist"
     };
   }
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "aC",
         "dC"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatHour24Minute() {
     return "H:mm";
   }
@@ -113,7 +108,7 @@
 
   @Override
   public String formatYearMonthFull() {
-    return "LLLL y";
+    return "LLLL 'del' y";
   }
 
   @Override
@@ -148,7 +143,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "de gener",
         "de febrer",
         "de març",
@@ -166,7 +161,7 @@
 
   @Override
   public String[] monthsFullStandalone() {
-    return new String[] { 
+    return new String[] {
         "gener",
         "febrer",
         "març",
@@ -184,7 +179,25 @@
 
   @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
+        "G",
+        "F",
+        "M",
+        "A",
+        "M",
+        "J",
+        "J",
+        "A",
+        "S",
+        "O",
+        "N",
+        "D"
+    };
+  }
+
+  @Override
+  public String[] monthsNarrowStandalone() {
+    return new String[] {
         "g",
         "f",
         "m",
@@ -201,13 +214,26 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
+  public String[] monthsShort() {
+    return new String[] {
+        "de gen.",
+        "de febr.",
+        "de març",
+        "d’abr.",
+        "de maig",
+        "de juny",
+        "de jul.",
+        "d’ag.",
+        "de set.",
+        "d’oct.",
+        "de nov.",
+        "de des."
+    };
   }
 
   @Override
-  public String[] monthsShort() {
-    return new String[] { 
+  public String[] monthsShortStandalone() {
+    return new String[] {
         "gen.",
         "febr.",
         "març",
@@ -224,13 +250,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1r trimestre",
         "2n trimestre",
         "3r trimestre",
@@ -240,7 +261,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "1T",
         "2T",
         "3T",
@@ -270,7 +291,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "diumenge",
         "dilluns",
         "dimarts",
@@ -283,12 +304,33 @@
 
   @Override
   public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
+    return new String[] {
+        "Diumenge",
+        "Dilluns",
+        "Dimarts",
+        "Dimecres",
+        "Dijous",
+        "Divendres",
+        "dissabte"
+    };
   }
 
   @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
+        "G",
+        "l",
+        "T",
+        "C",
+        "J",
+        "V",
+        "S"
+    };
+  }
+
+  @Override
+  public String[] weekdaysNarrowStandalone() {
+    return new String[] {
         "g",
         "l",
         "t",
@@ -300,13 +342,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "dg.",
         "dl.",
         "dt.",
@@ -319,7 +356,7 @@
 
   @Override
   public String[] weekdaysShortStandalone() {
-    return new String[] { 
+    return new String[] {
         "dg",
         "dl",
         "dt",
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_dz.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_dz.java
index 110526d..3c047e8 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_dz.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_dz.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "dz".
+ * Implementation of DateTimeFormatInfo for the "dz" locale.
  */
 public class DateTimeFormatInfoImpl_dz extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "སྔ་ཆ་",
         "ཕྱི་ཆ་"
     };
@@ -46,13 +46,8 @@
   }
 
   @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -60,18 +55,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -128,7 +118,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "སྤྱི་ཟླཝ་དངཔ་",
         "སྤྱི་ཟླཝ་གཉིས་པ་",
         "སྤྱི་ཟླཝ་གསུམ་པ་",
@@ -145,13 +135,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -168,13 +153,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ཟླ་ ༡",
         "ཟླ་ ༢",
         "ཟླ་ ༣",
@@ -191,13 +171,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "བཞི་དཔྱ་དང་པ་",
         "བཞི་དཔྱ་གཉིས་པ་",
         "བཞི་དཔྱ་གསུམ་པ་",
@@ -207,7 +182,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "བཞི་དཔྱ་༡",
         "བཞི་དཔྱ་༢",
         "བཞི་དཔྱ་༣",
@@ -216,6 +191,11 @@
   }
 
   @Override
+  public String timeFormat() {
+    return timeFormatLong();
+  }
+
+  @Override
   public String timeFormatFull() {
     return "ཆུ་ཚོད་ h སྐར་མ་ mm སྐར་ཆཱ་ ss a zzzz";
   }
@@ -237,7 +217,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "གཟའ་ཟླ་བ་",
         "གཟའ་མིག་དམར་",
         "གཟའ་ལྷག་པ་",
@@ -249,13 +229,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -267,13 +242,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "ཟླ་",
         "མིར་",
         "ལྷག་",
@@ -283,9 +253,4 @@
         "ཉི་"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en.java
index 38b4bc1..7b47002 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,14 +15,39 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "en".
+ * Implementation of DateTimeFormatInfo for the "en" locale.
  */
 public class DateTimeFormatInfoImpl_en extends DateTimeFormatInfoImpl {
 
   @Override
+  public String dateFormatFull() {
+    return "EEEE, MMMM d, y";
+  }
+
+  @Override
+  public String dateFormatLong() {
+    return "MMMM d, y";
+  }
+
+  @Override
+  public String dateFormatMedium() {
+    return "MMM d, y";
+  }
+
+  @Override
+  public String dateFormatShort() {
+    return "M/d/yy";
+  }
+
+  @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -76,4 +101,24 @@
   public String formatYearQuarterShort() {
     return "Q y";
   }
+
+  @Override
+  public String timeFormatFull() {
+    return "h:mm:ss a zzzz";
+  }
+
+  @Override
+  public String timeFormatLong() {
+    return "h:mm:ss a z";
+  }
+
+  @Override
+  public String timeFormatMedium() {
+    return "h:mm:ss a";
+  }
+
+  @Override
+  public String timeFormatShort() {
+    return "h:mm a";
+  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_MT.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_MT.java
index 5903483..554d873 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_MT.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_MT.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "en_MT".
+ * Implementation of DateTimeFormatInfo for the "en_MT" locale.
  */
 public class DateTimeFormatInfoImpl_en_MT extends DateTimeFormatInfoImpl_en {
 
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_NZ.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_NZ.java
index 85433ae..769be2a 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_NZ.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_NZ.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "en_NZ".
+ * Implementation of DateTimeFormatInfo for the "en_NZ" locale.
  */
 public class DateTimeFormatInfoImpl_en_NZ extends DateTimeFormatInfoImpl_en {
 
@@ -43,11 +43,6 @@
   }
 
   @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
   public String formatMonthFullDay() {
     return "d MMMM";
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_AR.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_AR.java
index 7de9ea3..3825aed 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_AR.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_AR.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,14 +15,19 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "es_AR".
+ * Implementation of DateTimeFormatInfo for the "es_AR" locale.
  */
 public class DateTimeFormatInfoImpl_es_AR extends DateTimeFormatInfoImpl_es {
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatYearMonthNum() {
     return "M-yyyy";
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_CO.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_CO.java
index c420522..f8e15db 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_CO.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_CO.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "es_CO".
+ * Implementation of DateTimeFormatInfo for the "es_CO" locale.
  */
 public class DateTimeFormatInfoImpl_es_CO extends DateTimeFormatInfoImpl_es {
 
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PA.java
index 0f2f7d8..ba1aa6c 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PA.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PA.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "es_PA".
+ * Implementation of DateTimeFormatInfo for the "es_PA" locale.
  */
 public class DateTimeFormatInfoImpl_es_PA extends DateTimeFormatInfoImpl_es {
 
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PR.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PR.java
index 1ddbf2a..df794f2 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PR.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PR.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "es_PR".
+ * Implementation of DateTimeFormatInfo for the "es_PR" locale.
  */
 public class DateTimeFormatInfoImpl_es_PR extends DateTimeFormatInfoImpl_es {
 
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa.java
index dc90aee..b3c5f34 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,44 +15,69 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "fa".
+ * Implementation of DateTimeFormatInfo for the "fa" locale.
  */
 public class DateTimeFormatInfoImpl_fa extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "قبل از ظهر",
         "بعد از ظهر"
     };
   }
 
   @Override
+  public String dateFormat() {
+    return dateFormatLong();
+  }
+
+  @Override
   public String dateFormatFull() {
-    return "EEEE d MMMM y";
+    return "EEEE, MMMM d, y";
   }
 
   @Override
   public String dateFormatLong() {
-    return "d MMMM y";
+    return "MMMM d, y";
   }
 
   @Override
   public String dateFormatMedium() {
-    return "yyyy/M/d";
+    return "MMM d, y";
   }
 
   @Override
   public String dateFormatShort() {
-    return "yy/M/d";
+    return "M/d/yy";
+  }
+
+  @Override
+  public String dateTimeFull(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append("، ساعت ").append(timePattern).toString();
+  }
+
+  @Override
+  public String dateTimeLong(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append("، ساعت ").append(timePattern).toString();
+  }
+
+  @Override
+  public String dateTimeMedium(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append("،‏ ").append(timePattern).toString();
+  }
+
+  @Override
+  public String dateTimeShort(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append("،‏ ").append(timePattern).toString();
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "قبل از میلاد",
         "میلادی"
     };
@@ -60,9 +85,9 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ق.م.",
-        "م."
+        "ب. م."
     };
   }
 
@@ -148,15 +173,15 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "ژانویهٔ",
         "فوریهٔ",
         "مارس",
         "آوریل",
-        "مهٔ",
-        "ژوئن",
-        "ژوئیهٔ",
-        "اوت",
+        "می",
+        "جون",
+        "جولای",
+        "آگوست",
         "سپتامبر",
         "اکتبر",
         "نوامبر",
@@ -166,7 +191,7 @@
 
   @Override
   public String[] monthsFullStandalone() {
-    return new String[] { 
+    return new String[] {
         "ژانویه",
         "فوریه",
         "مارس",
@@ -184,12 +209,12 @@
 
   @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ژ",
         "ف",
         "م",
         "آ",
-        "م",
+        "می",
         "ژ",
         "ژ",
         "ا",
@@ -201,38 +226,15 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ژانویهٔ",
         "فوریهٔ",
         "مارس",
         "آوریل",
-        "مهٔ",
-        "ژوئن",
-        "ژوئیهٔ",
-        "اوت",
-        "سپتامبر",
-        "اکتبر",
-        "نوامبر",
-        "دسامبر"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return new String[] { 
-        "ژانویه",
-        "فوریه",
-        "مارس",
-        "آوریل",
-        "مه",
-        "ژوئن",
-        "ژوئیه",
+        "می",
+        "جون",
+        "جولای",
         "اوت",
         "سپتامبر",
         "اکتبر",
@@ -243,7 +245,7 @@
 
   @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "سه‌ماههٔ اول",
         "سه‌ماههٔ دوم",
         "سه‌ماههٔ سوم",
@@ -253,7 +255,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "س‌م۱",
         "س‌م۲",
         "س‌م۳",
@@ -283,7 +285,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "یکشنبه",
         "دوشنبه",
         "سه‌شنبه",
@@ -295,13 +297,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "ی",
         "د",
         "س",
@@ -313,13 +310,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "یکشنبه",
         "دوشنبه",
         "سه‌شنبه",
@@ -331,11 +323,6 @@
   }
 
   @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
   public int weekendEnd() {
     return 5;
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa_AF.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa_AF.java
index 3f1119e..3d41e61 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa_AF.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa_AF.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "fa_AF".
+ * Implementation of DateTimeFormatInfo for the "fa_AF" locale.
  */
 public class DateTimeFormatInfoImpl_fa_AF extends DateTimeFormatInfoImpl_fa {
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "جنوری",
         "فبروری",
         "مارچ",
@@ -42,7 +42,7 @@
 
   @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ج",
         "ف",
         "م",
@@ -59,13 +59,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "جنو",
         "فوریهٔ",
         "مارس",
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fi.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fi.java
index 6611c93..5a9cfe8 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fi.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fi.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "fi".
+ * Implementation of DateTimeFormatInfo for the "fi" locale.
  */
 public class DateTimeFormatInfoImpl_fi extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "ap.",
         "ip."
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ennen Kristuksen syntymää",
         "jälkeen Kristuksen syntymän"
     };
@@ -60,18 +60,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "eKr.",
         "jKr."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatHour12Minute() {
     return "h.mm a";
   }
@@ -163,7 +158,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "tammikuuta",
         "helmikuuta",
         "maaliskuuta",
@@ -181,7 +176,7 @@
 
   @Override
   public String[] monthsFullStandalone() {
-    return new String[] { 
+    return new String[] {
         "tammikuu",
         "helmikuu",
         "maaliskuu",
@@ -199,7 +194,7 @@
 
   @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "T",
         "H",
         "M",
@@ -216,13 +211,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "tammikuuta",
         "helmikuuta",
         "maaliskuuta",
@@ -240,7 +230,7 @@
 
   @Override
   public String[] monthsShortStandalone() {
-    return new String[] { 
+    return new String[] {
         "tammi",
         "helmi",
         "maalis",
@@ -258,7 +248,7 @@
 
   @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1. neljännes",
         "2. neljännes",
         "3. neljännes",
@@ -268,7 +258,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "1. nelj.",
         "2. nelj.",
         "3. nelj.",
@@ -298,7 +288,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "sunnuntaina",
         "maanantaina",
         "tiistaina",
@@ -311,7 +301,7 @@
 
   @Override
   public String[] weekdaysFullStandalone() {
-    return new String[] { 
+    return new String[] {
         "sunnuntai",
         "maanantai",
         "tiistai",
@@ -324,7 +314,7 @@
 
   @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "S",
         "M",
         "T",
@@ -336,13 +326,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "su",
         "ma",
         "ti",
@@ -352,9 +337,4 @@
         "la"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fo.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fo.java
index 79ccf51..3de33fe 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fo.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fo.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,14 +15,22 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "fo".
+ * Implementation of DateTimeFormatInfo for the "fo" locale.
  */
 public class DateTimeFormatInfoImpl_fo extends DateTimeFormatInfoImpl {
 
   @Override
+  public String[] ampms() {
+    return new String[] {
+        "f.p.",
+        "s.p."
+    };
+  }
+
+  @Override
   public String dateFormatFull() {
     return "EEEE dd MMMM y";
   }
@@ -44,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "fyrir Krist",
         "eftir Krist"
     };
@@ -52,13 +60,18 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "f.Kr.",
         "e.Kr."
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatYearMonthAbbrevDay() {
     return "d. MMM y";
   }
@@ -80,7 +93,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "januar",
         "februar",
         "mars",
@@ -97,36 +110,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "jan",
         "feb",
         "mar",
@@ -143,13 +128,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1. kvartal",
         "2. kvartal",
         "3. kvartal",
@@ -159,7 +139,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "K1",
         "K2",
         "K3",
@@ -168,28 +148,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "sunnudagur",
         "mánadagur",
         "týsdagur",
@@ -201,31 +161,21 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
+    return new String[] {
+        "S",
+        "M",
+        "T",
+        "M",
+        "H",
+        "F",
+        "L"
     };
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "sun",
         "mán",
         "týs",
@@ -235,9 +185,4 @@
         "ley"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gl.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gl.java
index 5b57e0e..59feacc 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gl.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gl.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "gl".
+ * Implementation of DateTimeFormatInfo for the "gl" locale.
  */
 public class DateTimeFormatInfoImpl_gl extends DateTimeFormatInfoImpl {
 
@@ -44,7 +44,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "antes de Cristo",
         "despois de Cristo"
     };
@@ -52,18 +52,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "a.C.",
         "d.C."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthAbbrevDay() {
     return "d MMM";
   }
@@ -130,7 +125,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Xaneiro",
         "Febreiro",
         "Marzo",
@@ -147,13 +142,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "X",
         "F",
         "M",
@@ -170,13 +160,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Xan",
         "Feb",
         "Mar",
@@ -193,13 +178,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1o trimestre",
         "2o trimestre",
         "3o trimestre",
@@ -209,7 +189,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "T1",
         "T2",
         "T3",
@@ -218,28 +198,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Domingo",
         "Luns",
         "Martes",
@@ -251,13 +211,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "D",
         "L",
         "M",
@@ -269,13 +224,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Dom",
         "Lun",
         "Mar",
@@ -285,9 +235,4 @@
         "Sáb"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gu.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gu.java
index 5ec5432..0559d3d 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gu.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gu.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,18 +15,18 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "gu".
+ * Implementation of DateTimeFormatInfo for the "gu" locale.
  */
 public class DateTimeFormatInfoImpl_gu extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
-        "am",
-        "pm"
+    return new String[] {
+        "પૂર્વ મધ્યાહ્ન",
+        "ઉત્તર મધ્યાહ્ન"
     };
   }
 
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ઈસવીસન પૂર્વે",
         "ઇસવીસન"
     };
@@ -60,13 +60,18 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
+    return new String[] {
+        "ઈલુના જન્મ પહેસાં",
+        "ઇસવીસન"
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatHour12Minute() {
     return "hh:mm a";
   }
@@ -138,7 +143,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "જાન્યુઆરી",
         "ફેબ્રુઆરી",
         "માર્ચ",
@@ -155,13 +160,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "જા",
         "ફે",
         "મા",
@@ -178,13 +178,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "જાન્યુ",
         "ફેબ્રુ",
         "માર્ચ",
@@ -201,27 +196,22 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
-        "પહલી ત્રિમાસિક",
-        "બીજી ત્રિમાસિક",
-        "ત્રીજી ત્રિમાસિક",
-        "ચૌથી ત્રિમાસિક"
+    return new String[] {
+        "પેહલા હંત 1",
+        "ડૂસઋા હંત 2",
+        "તીસઋા હંત 3",
+        "ચૌતા હંત 4"
     };
   }
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
-        "ત્રિમાસિક ૧",
+    return new String[] {
+        "પેહલા હંત 1",
         "ત્રિમાસિક ૨",
         "ત્રિમાસિક ૩",
-        "ત્રિમાસિક ૪"
+        "ચૌતા હંત 4"
     };
   }
 
@@ -247,7 +237,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "રવિવાર",
         "સોમવાર",
         "મંગળવાર",
@@ -259,13 +249,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "ર",
         "સો",
         "મં",
@@ -277,13 +262,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "રવિ",
         "સોમ",
         "મંગળ",
@@ -295,11 +275,6 @@
   }
 
   @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
   public int weekendStart() {
     return 0;
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_he.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_he.java
index 22e8538..bb5c9e4 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_he.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_he.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,18 +15,18 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "he".
+ * Implementation of DateTimeFormatInfo for the "he" locale.
  */
 public class DateTimeFormatInfoImpl_he extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
-        "לפנה\"צ",
-        "אחה\"צ"
+    return new String[] {
+        "לפנה״צ",
+        "אחה״צ"
     };
   }
 
@@ -42,7 +42,7 @@
 
   @Override
   public String dateFormatMedium() {
-    return "dd/MM/yyyy";
+    return "d בMMM yyyy";
   }
 
   @Override
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "לפני הספירה",
         "לספירה"
     };
@@ -60,13 +60,18 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "לפנה״ס",
         "לסה״נ"
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatMonthAbbrevDay() {
     return "d בMMM";
   }
@@ -133,7 +138,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "ינואר",
         "פברואר",
         "מרס",
@@ -150,13 +155,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -173,13 +173,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ינו",
         "פבר",
         "מרס",
@@ -197,12 +192,25 @@
 
   @Override
   public String[] monthsShortStandalone() {
-    return monthsShort();
+    return new String[] {
+        "ינו׳",
+        "פבר׳",
+        "מרס",
+        "אפר׳",
+        "מאי",
+        "יונ׳",
+        "יול׳",
+        "אוג׳",
+        "ספט׳",
+        "אוק׳",
+        "נוב׳",
+        "דצמ׳"
+    };
   }
 
   @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "רבעון 1",
         "רבעון 2",
         "רבעון 3",
@@ -212,7 +220,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "רבעון 1",
         "רבעון 2",
         "רבעון 3",
@@ -221,28 +229,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "יום ראשון",
         "יום שני",
         "יום שלישי",
@@ -254,13 +242,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "א",
         "ב",
         "ג",
@@ -272,29 +255,19 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
-        "יום א'",
-        "יום ב'",
-        "יום ג'",
-        "יום ד'",
-        "יום ה'",
-        "יום ו'",
+    return new String[] {
+        "יום א׳",
+        "יום ב׳",
+        "יום ג׳",
+        "יום ד׳",
+        "יום ה׳",
+        "יום ו׳",
         "שבת"
     };
   }
 
   @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
   public int weekendEnd() {
     return 6;
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hi.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hi.java
index 454cc7f..625a7ad 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hi.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hi.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,14 +15,22 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "hi".
+ * Implementation of DateTimeFormatInfo for the "hi" locale.
  */
 public class DateTimeFormatInfoImpl_hi extends DateTimeFormatInfoImpl {
 
   @Override
+  public String[] ampms() {
+    return new String[] {
+        "पूर्वाह्न",
+        "अपराह्न"
+    };
+  }
+
+  @Override
   public String dateFormatFull() {
     return "EEEE, d MMMM y";
   }
@@ -44,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ईसापूर्व",
         "सन"
     };
@@ -52,13 +60,18 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ईसापूर्व",
         "सन"
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatMonthAbbrevDay() {
     return "d MMM";
   }
@@ -115,7 +128,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "जनवरी",
         "फरवरी",
         "मार्च",
@@ -132,13 +145,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ज",
         "फ़",
         "मा",
@@ -155,13 +163,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "जनवरी",
         "फरवरी",
         "मार्च",
@@ -178,51 +181,61 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
-        "प्रथम चौथाई",
-        "द्वितीय चौथाई",
-        "तृतीय चौथाई",
-        "चतुर्थ चौथाई"
+    return new String[] {
+        "तिमाही",
+        "दूसरी तिमाही",
+        "तीसरी तिमाही",
+        "चौथी तिमाही"
     };
   }
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
-        "प्रथम चौथाई",
-        "द्वितीय चौथाई",
-        "तृतीय चौथाई",
-        "चतुर्थ चौथाई"
+    return new String[] {
+        "तिमाही",
+        "दूसरी तिमाही",
+        "तीसरी तिमाही",
+        "चौथी तिमाही"
     };
   }
 
   @Override
+  public String timeFormatFull() {
+    return "h:mm:ss a zzzz";
+  }
+
+  @Override
+  public String timeFormatLong() {
+    return "h:mm:ss a z";
+  }
+
+  @Override
+  public String timeFormatMedium() {
+    return "h:mm:ss a";
+  }
+
+  @Override
+  public String timeFormatShort() {
+    return "h:mm a";
+  }
+
+  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "रविवार",
         "सोमवार",
         "मंगलवार",
         "बुधवार",
-        "गुरुवार",
+        "बृहस्पतिवार",
         "शुक्रवार",
         "शनिवार"
     };
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "र",
         "सो",
         "मं",
@@ -234,29 +247,19 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
-        "रवि",
-        "सोम",
-        "मंगल",
-        "बुध",
-        "गुरु",
-        "शुक्र",
-        "शनि"
+    return new String[] {
+        "रवि.",
+        "सोम.",
+        "मंगल.",
+        "बुध.",
+        "बृह.",
+        "शुक्र.",
+        "शनि."
     };
   }
 
   @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
   public int weekendStart() {
     return 0;
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hu.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hu.java
index 3e19d46..fc6476c 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hu.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hu.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "hu".
+ * Implementation of DateTimeFormatInfo for the "hu" locale.
  */
 public class DateTimeFormatInfoImpl_hu extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "de.",
         "du."
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "időszámításunk előtt",
         "időszámításunk szerint"
     };
@@ -60,18 +60,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "i. e.",
         "i. sz."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatHour24Minute() {
     return "H:mm";
   }
@@ -143,7 +138,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "január",
         "február",
         "március",
@@ -160,13 +155,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "J",
         "F",
         "M",
@@ -183,13 +173,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "jan.",
         "febr.",
         "márc.",
@@ -206,13 +191,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "I. negyedév",
         "II. negyedév",
         "III. negyedév",
@@ -222,7 +202,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "N1",
         "N2",
         "N3",
@@ -252,7 +232,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "vasárnap",
         "hétfő",
         "kedd",
@@ -264,13 +244,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "V",
         "H",
         "K",
@@ -282,13 +257,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "V",
         "H",
         "K",
@@ -298,9 +268,4 @@
         "Szo"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ia.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ia.java
index b3619f8..bfeabb2 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ia.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ia.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,44 +15,29 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ia".
+ * Implementation of DateTimeFormatInfo for the "ia" locale.
  */
 public class DateTimeFormatInfoImpl_ia extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "a.m.",
         "p.m."
     };
   }
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
   public String dateFormatShort() {
     return "yy/MM/dd";
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ante Christo",
         "post Christo"
     };
@@ -60,18 +45,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "a.Chr.",
         "p.Chr."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -128,7 +108,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "januario",
         "februario",
         "martio",
@@ -145,13 +125,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -168,13 +143,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "jan",
         "feb",
         "mar",
@@ -191,13 +161,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1-me trimestre",
         "2-nde trimestre",
         "3-tie trimestre",
@@ -207,7 +172,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "T1",
         "T2",
         "T3",
@@ -216,28 +181,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "dominica",
         "lunedi",
         "martedi",
@@ -249,13 +194,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -267,13 +207,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "dom",
         "lun",
         "mar",
@@ -283,9 +218,4 @@
         "sab"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_id.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_id.java
index 1a3269a..4e1d310 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_id.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_id.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "id".
+ * Implementation of DateTimeFormatInfo for the "id" locale.
  */
 public class DateTimeFormatInfoImpl_id extends DateTimeFormatInfoImpl {
 
@@ -44,26 +44,21 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
+    return new String[] {
+        "SM",
+        "M"
     };
   }
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
+    return new String[] {
+        "SM",
+        "M"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatHour24Minute() {
     return "HH.mm";
   }
@@ -125,7 +120,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Januari",
         "Februari",
         "Maret",
@@ -142,36 +137,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Jan",
         "Feb",
         "Mar",
@@ -188,13 +155,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "kuartal pertama",
         "kuartal kedua",
         "kuartal ketiga",
@@ -204,7 +166,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "K1",
         "K2",
         "K3",
@@ -214,27 +176,27 @@
 
   @Override
   public String timeFormatFull() {
-    return "H:mm:ss zzzz";
+    return "H.mm.ss zzzz";
   }
 
   @Override
   public String timeFormatLong() {
-    return "HH:mm:ss z";
+    return "HH.mm.ss z";
   }
 
   @Override
   public String timeFormatMedium() {
-    return "HH:mm:ss";
+    return "HH.mm.ss";
   }
 
   @Override
   public String timeFormatShort() {
-    return "HH:mm";
+    return "HH.mm";
   }
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Minggu",
         "Senin",
         "Selasa",
@@ -246,31 +208,21 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
+    return new String[] {
+        "M",
+        "S",
+        "S",
+        "R",
+        "K",
+        "J",
+        "S"
     };
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Min",
         "Sen",
         "Sel",
@@ -280,9 +232,4 @@
         "Sab"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ig.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ig.java
index 0ad72ea..dc87036 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ig.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ig.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ig".
+ * Implementation of DateTimeFormatInfo for the "ig" locale.
  */
 public class DateTimeFormatInfoImpl_ig extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "A.M.",
         "P.M."
     };
@@ -32,27 +32,27 @@
 
   @Override
   public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
+    return "EEEE, d MMMM y";
   }
 
   @Override
   public String dateFormatLong() {
-    return "y MMMM d";
+    return "d MMMM y";
   }
 
   @Override
   public String dateFormatMedium() {
-    return "y MMM d";
+    return "d MMM y";
   }
 
   @Override
   public String dateFormatShort() {
-    return "yy/MM/dd";
+    return "dd/MM/yyyy";
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "Tupu Kristi",
         "Afọ Kristi"
     };
@@ -60,18 +60,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "T.K.",
         "A.K."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -128,7 +123,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Jenụwarị",
         "Febrụwarị",
         "Maachị",
@@ -145,13 +140,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -168,13 +158,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Jen",
         "Feb",
         "Maa",
@@ -191,43 +176,48 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
+  public String[] quartersFull() {
+    return new String[] {
+        "Ọkara 1",
+        "Ọkara 2",
+        "Ọkara 3",
+        "Ọkara 4"
+    };
   }
 
   @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
+  public String[] quartersShort() {
+    return new String[] {
+        "Ọ1",
+        "Ọ2",
+        "Ọ3",
+        "Ọ4"
     };
   }
 
   @Override
   public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
+    return "h:mm:ss a zzzz";
   }
 
   @Override
   public String timeFormatLong() {
-    return "HH:mm:ss z";
+    return "h:mm:ss a z";
   }
 
   @Override
   public String timeFormatMedium() {
-    return "HH:mm:ss";
+    return "h:mm:ss a";
   }
 
   @Override
   public String timeFormatShort() {
-    return "HH:mm";
+    return "h:mm a";
   }
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Mbọsị Ụka",
         "Mọnde",
         "Tiuzdee",
@@ -239,13 +229,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -257,13 +242,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Ụka",
         "Mọn",
         "Tiu",
@@ -273,9 +253,4 @@
         "Sat"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_it.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_it.java
index e8c6cc9..7662420 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_it.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_it.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "it".
+ * Implementation of DateTimeFormatInfo for the "it" locale.
  */
 public class DateTimeFormatInfoImpl_it extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "m.",
         "p."
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "a.C.",
         "d.C"
     };
@@ -60,18 +60,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "aC",
         "dC"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatHour12Minute() {
     return "hh:mm a";
   }
@@ -148,7 +143,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "gennaio",
         "febbraio",
         "marzo",
@@ -166,7 +161,7 @@
 
   @Override
   public String[] monthsFullStandalone() {
-    return new String[] { 
+    return new String[] {
         "Gennaio",
         "Febbraio",
         "Marzo",
@@ -184,7 +179,7 @@
 
   @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "G",
         "F",
         "M",
@@ -201,13 +196,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "gen",
         "feb",
         "mar",
@@ -224,13 +214,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1o trimestre",
         "2o trimestre",
         "3o trimestre",
@@ -240,7 +225,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "T1",
         "T2",
         "T3",
@@ -249,28 +234,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH.mm.ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH.mm.ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH.mm.ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH.mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "domenica",
         "lunedì",
         "martedì",
@@ -283,7 +248,7 @@
 
   @Override
   public String[] weekdaysFullStandalone() {
-    return new String[] { 
+    return new String[] {
         "Domenica",
         "Lunedì",
         "Martedì",
@@ -296,7 +261,7 @@
 
   @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "D",
         "L",
         "M",
@@ -308,13 +273,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "dom",
         "lun",
         "mar",
@@ -324,9 +284,4 @@
         "sab"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_it_CH.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_it_CH.java
index 582ab1a..51cdaba 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_it_CH.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_it_CH.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "it_CH".
+ * Implementation of DateTimeFormatInfo for the "it_CH" locale.
  */
 public class DateTimeFormatInfoImpl_it_CH extends DateTimeFormatInfoImpl_it {
 
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kam.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kam.java
index 0024114..0029f96 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kam.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kam.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,44 +15,52 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "kam".
+ * Implementation of DateTimeFormatInfo for the "kam" locale.
  */
 public class DateTimeFormatInfoImpl_kam extends DateTimeFormatInfoImpl {
 
   @Override
+  public String[] ampms() {
+    return new String[] {
+        "Ĩyakwakya",
+        "Ĩyawĩoo"
+    };
+  }
+
+  @Override
   public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
+    return "EEEE, d MMMM y";
   }
 
   @Override
   public String dateFormatLong() {
-    return "y MMMM d";
+    return "d MMMM y";
   }
 
   @Override
   public String dateFormatMedium() {
-    return "y MMM d";
+    return "d MMM y";
   }
 
   @Override
   public String dateFormatShort() {
-    return "yy/MM/dd";
+    return "dd/MM/yyyy";
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
-        "mbee wa yesu",
-        "IY"
+    return new String[] {
+        "Mbee wa Yesũ",
+        "Ĩtina wa Yesũ"
     };
   }
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "MY",
         "IY"
     };
@@ -60,7 +68,7 @@
 
   @Override
   public int firstDayOfTheWeek() {
-    return 1;
+    return 6;
   }
 
   @Override
@@ -120,154 +128,134 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
-        "Mwei wa mbee",
-        "Mwei wa keli",
-        "Mwei wa katatu",
-        "Mwei wa kanne",
-        "Mwei wa katano",
-        "Mwei wa thanthatu",
-        "Mwei wa muonza",
-        "Mwei wa nyanya",
-        "Mwei wa kenda",
-        "Mwei wa ikumi",
-        "Mwei wa ikumi na imwe",
-        "Mwei wa ikumi na ili"
+    return new String[] {
+        "Mwai wa mbee",
+        "Mwai wa kelĩ",
+        "Mwai wa katatũ",
+        "Mwai wa kana",
+        "Mwai wa katano",
+        "Mwai wa thanthatũ",
+        "Mwai wa muonza",
+        "Mwai wa nyaanya",
+        "Mwai wa kenda",
+        "Mwai wa ĩkumi",
+        "Mwai wa ĩkumi na ĩmwe",
+        "Mwai wa ĩkumi na ilĩ"
     };
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
+    return new String[] {
+        "M",
+        "K",
+        "K",
+        "K",
+        "K",
+        "T",
+        "M",
+        "N",
+        "K",
+        "Ĩ",
+        "Ĩ",
+        "Ĩ"
     };
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
-        "Mwei wa mbee",
-        "Mwei wa keli",
-        "Mwei wa katatu",
-        "Mwei wa kanne",
-        "Mwei wa katano",
-        "Mwei wa thanthatu",
-        "Mwei wa muonza",
-        "Mwei wa nyanya",
-        "Mwei wa kenda",
-        "Mwei wa ikumi",
-        "Mwei wa ikumi na imwe",
-        "Mwei wa ikumi na ili"
+    return new String[] {
+        "Mbe",
+        "Kel",
+        "Ktũ",
+        "Kan",
+        "Ktn",
+        "Tha",
+        "Moo",
+        "Nya",
+        "Knd",
+        "Ĩku",
+        "Ĩkm",
+        "Ĩkl"
     };
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
+  public String[] quartersFull() {
+    return new String[] {
+        "Lovo ya mbee",
+        "Lovo ya kelĩ",
+        "Lovo ya katatũ",
+        "Lovo ya kana"
+    };
   }
 
   @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
+  public String[] quartersShort() {
+    return new String[] {
+        "L1",
+        "L2",
+        "L3",
+        "L4"
     };
   }
 
   @Override
   public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
+    return "h:mm:ss a zzzz";
   }
 
   @Override
   public String timeFormatLong() {
-    return "HH:mm:ss z";
+    return "h:mm:ss a z";
   }
 
   @Override
   public String timeFormatMedium() {
-    return "HH:mm:ss";
+    return "h:mm:ss a";
   }
 
   @Override
   public String timeFormatShort() {
-    return "HH:mm";
+    return "h:mm a";
   }
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
-        "Jumapili",
-        "Jumatatu",
-        "Jumanne",
-        "Jumatano",
-        "Alamisi",
-        "Ijumaa",
-        "Jumamosi"
+    return new String[] {
+        "Wa kyumwa",
+        "Wa kwambĩlĩlya",
+        "Wa kelĩ",
+        "Wa katatũ",
+        "Wa kana",
+        "Wa katano",
+        "Wa thanthatũ"
     };
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
+    return new String[] {
+        "Y",
+        "W",
+        "E",
+        "A",
+        "A",
+        "A",
+        "A"
     };
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
-        "Jpl",
-        "Jtt",
-        "Jnn",
-        "Jtn",
-        "Alh",
-        "Ijm",
-        "Jms"
+    return new String[] {
+        "Wky",
+        "Wkw",
+        "Wkl",
+        "Wtũ",
+        "Wkn",
+        "Wtn",
+        "Wth"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kcg.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kcg.java
index 23f186a..199861f 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kcg.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kcg.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,36 +15,21 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "kcg".
+ * Implementation of DateTimeFormatInfo for the "kcg" locale.
  */
 public class DateTimeFormatInfoImpl_kcg extends DateTimeFormatInfoImpl {
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
   public String dateFormatShort() {
     return "yy/MM/dd";
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "Gabanin Miladi",
         "Miladi"
     };
@@ -52,18 +37,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "GM",
         "M"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -120,7 +100,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Zwat Juwung",
         "Zwat Swiyang",
         "Zwat Tsat",
@@ -137,13 +117,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -160,13 +135,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Juw",
         "Swi",
         "Tsa",
@@ -183,13 +153,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -198,28 +163,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Ladi",
         "Tanii",
         "Talata",
@@ -231,13 +176,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -249,13 +189,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Lad",
         "Tan",
         "Tal",
@@ -265,9 +200,4 @@
         "Asa"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kk.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kk.java
index dde211f..1072e9c 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kk.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kk.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "kk".
+ * Implementation of DateTimeFormatInfo for the "kk" locale.
  */
 public class DateTimeFormatInfoImpl_kk extends DateTimeFormatInfoImpl {
 
@@ -44,7 +44,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -52,18 +52,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatYearMonthAbbrevDay() {
     return "d MMM y 'ж'.";
   }
@@ -85,7 +80,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "қаңтар",
         "ақпан",
         "наурыз",
@@ -102,13 +97,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -125,13 +115,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "қаң.",
         "ақп.",
         "нау.",
@@ -148,13 +133,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -163,28 +143,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "жексені",
         "дуйсенбі",
         "сейсенбі",
@@ -196,13 +156,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -214,13 +169,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "жс.",
         "дс.",
         "сс.",
@@ -230,9 +180,4 @@
         "сһ."
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kn.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kn.java
index 68f1a8d..456da90 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kn.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kn.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "kn".
+ * Implementation of DateTimeFormatInfo for the "kn" locale.
  */
 public class DateTimeFormatInfoImpl_kn extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "am",
         "pm"
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ಈಸಪೂವ೯.",
         "ಕ್ರಿಸ್ತ ಶಕ"
     };
@@ -60,13 +60,18 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatHour12Minute() {
     return "hh:mm a";
   }
@@ -138,7 +143,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "ಜನವರೀ",
         "ಫೆಬ್ರವರೀ",
         "ಮಾರ್ಚ್",
@@ -155,13 +160,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ಜ",
         "ಫೆ",
         "ಮಾ",
@@ -178,13 +178,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ಜನವರೀ",
         "ಫೆಬ್ರವರೀ",
         "ಮಾರ್ಚ್",
@@ -201,13 +196,18 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
+  public String[] quartersFull() {
+    return new String[] {
+        "ಒಂದು 1",
+        "ಎರಡು 2",
+        "ಮೂರು 3",
+        "ನಾಲೃಕ 4"
+    };
   }
 
   @Override
-  public String[] quartersFull() {
-    return new String[] { 
+  public String[] quartersShort() {
+    return new String[] {
         "ಒಂದು 1",
         "ಎರಡು 2",
         "ಮೂರು 3",
@@ -237,7 +237,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "ರವಿವಾರ",
         "ಸೋಮವಾರ",
         "ಮಂಗಳವಾರ",
@@ -249,13 +249,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "ರ",
         "ಸೋ",
         "ಮಂ",
@@ -267,13 +262,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "ರ.",
         "ಸೋ.",
         "ಮಂ.",
@@ -285,11 +275,6 @@
   }
 
   @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
   public int weekendStart() {
     return 0;
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kpe.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kpe.java
index 23db0bd..bedda13 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kpe.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kpe.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,36 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "kpe".
+ * Implementation of DateTimeFormatInfo for the "kpe" locale.
  */
 public class DateTimeFormatInfoImpl_kpe extends DateTimeFormatInfoImpl {
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/MM/dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -52,18 +32,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -120,7 +95,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -137,13 +112,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -160,13 +130,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -183,13 +148,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -198,28 +158,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -231,13 +171,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -249,13 +184,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -265,9 +195,4 @@
         "7"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_SY.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_SY.java
index e7aa08e..dd4dd57 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_SY.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_SY.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,15 +15,162 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ku_SY".
+ * Implementation of DateTimeFormatInfo for the "ku_SY" locale.
  */
 public class DateTimeFormatInfoImpl_ku_SY extends DateTimeFormatInfoImpl_ku {
 
   @Override
+  public String[] ampms() {
+    return new String[] {
+        "BN",
+        "PN"
+    };
+  }
+
+  @Override
+  public String[] erasFull() {
+    return new String[] {
+        "BZ",
+        "PZ"
+    };
+  }
+
+  @Override
+  public String[] erasShort() {
+    return new String[] {
+        "BZ",
+        "PZ"
+    };
+  }
+
+  @Override
   public int firstDayOfTheWeek() {
     return 0;
   }
+
+  @Override
+  public String[] monthsFull() {
+    return new String[] {
+        "çile",
+        "sibat",
+        "adar",
+        "nîsan",
+        "gulan",
+        "hezîran",
+        "7",
+        "8",
+        "9",
+        "10",
+        "11",
+        "12"
+    };
+  }
+
+  @Override
+  public String[] monthsNarrow() {
+    return new String[] {
+        "ç",
+        "s",
+        "a",
+        "n",
+        "g",
+        "h",
+        "7",
+        "8",
+        "9",
+        "10",
+        "11",
+        "12"
+    };
+  }
+
+  @Override
+  public String[] monthsShort() {
+    return new String[] {
+        "çil",
+        "sib",
+        "adr",
+        "nîs",
+        "gul",
+        "hez",
+        "tîr",
+        "8",
+        "9",
+        "10",
+        "11",
+        "12"
+    };
+  }
+
+  @Override
+  public String[] quartersFull() {
+    return new String[] {
+        "Ç1",
+        "Ç2",
+        "Ç3",
+        "Ç4"
+    };
+  }
+
+  @Override
+  public String[] quartersShort() {
+    return new String[] {
+        "Ç1",
+        "Ç2",
+        "Ç3",
+        "Ç4"
+    };
+  }
+
+  @Override
+  public String[] weekdaysFull() {
+    return new String[] {
+        "yekşem",
+        "duşem",
+        "şê",
+        "çarşem",
+        "pêncşem",
+        "în",
+        "şemî"
+    };
+  }
+
+  @Override
+  public String[] weekdaysNarrow() {
+    return new String[] {
+        "y",
+        "d",
+        "s",
+        "ç",
+        "p",
+        "î",
+        "ş"
+    };
+  }
+
+  @Override
+  public String[] weekdaysShort() {
+    return new String[] {
+        "yş",
+        "dş",
+        "sş",
+        "çş",
+        "pş",
+        "în",
+        "ş"
+    };
+  }
+
+  @Override
+  public int weekendEnd() {
+    return 6;
+  }
+
+  @Override
+  public int weekendStart() {
+    return 5;
+  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ln.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ln.java
index c0922fb..ccfb809 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ln.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ln.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,36 +15,21 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ln".
+ * Implementation of DateTimeFormatInfo for the "ln" locale.
  */
 public class DateTimeFormatInfoImpl_ln extends DateTimeFormatInfoImpl {
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
   public String dateFormatShort() {
     return "yy/MM/dd";
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "libosó ya Y.-K.",
         "nsima ya Y.-K."
     };
@@ -52,18 +37,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "libosó ya Y.-K.",
         "nsima ya Y.-K."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -120,7 +100,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "sánzá ya yambo",
         "sánzá ya míbalé",
         "sánzá ya mísáto",
@@ -137,13 +117,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -160,13 +135,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "s1",
         "s2",
         "s3",
@@ -183,13 +153,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "sánzá mísáto ya yambo",
         "sánzá mísáto ya míbalé",
         "sánzá mísáto ya mísáto",
@@ -199,7 +164,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "SM1",
         "SM2",
         "SM3",
@@ -208,28 +173,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "eyenga",
         "mokɔlɔ ya libosó",
         "mokɔlɔ ya míbalé",
@@ -241,13 +186,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -259,13 +199,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "eye",
         "m1",
         "m2",
@@ -275,9 +210,4 @@
         "mps"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mn.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mn.java
index f3d3726..9f7722f 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mn.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mn.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,36 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "mn".
+ * Implementation of DateTimeFormatInfo for the "mn" locale.
  */
 public class DateTimeFormatInfoImpl_mn extends DateTimeFormatInfoImpl {
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/MM/dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "манай эриний өмнөх",
         "манай эриний"
     };
@@ -52,7 +32,7 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "м.э.ө",
         "м.э."
     };
@@ -115,7 +95,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Хулгана",
         "Үхэр",
         "Бар",
@@ -132,13 +112,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -155,13 +130,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "хул",
         "үхэ",
         "бар",
@@ -178,13 +148,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "дөрөвний нэг",
         "дөрөвний хоёр",
         "дөрөвний гурав",
@@ -194,7 +159,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "1/4",
         "2/4",
         "3/4",
@@ -203,28 +168,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "ням",
         "даваа",
         "мягмар",
@@ -236,13 +181,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -254,13 +194,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Ня",
         "Да",
         "Мя",
@@ -270,9 +205,4 @@
         "Бя"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nb.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nb.java
index 5c6afc7..78a52a3 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nb.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nb.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "nb".
+ * Implementation of DateTimeFormatInfo for the "nb" locale.
  */
 public class DateTimeFormatInfoImpl_nb extends DateTimeFormatInfoImpl {
 
@@ -44,7 +44,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "f.Kr.",
         "e.Kr."
     };
@@ -52,18 +52,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "f.Kr.",
         "e.Kr."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMinuteSecond() {
     return "mm.ss";
   }
@@ -135,7 +130,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "januar",
         "februar",
         "mars",
@@ -152,13 +147,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "jan.",
         "feb.",
         "mars",
@@ -175,13 +165,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1. kvartal",
         "2. kvartal",
         "3. kvartal",
@@ -191,7 +176,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "K1",
         "K2",
         "K3",
@@ -201,27 +186,12 @@
 
   @Override
   public String timeFormatFull() {
-    return "'kl'. HH.mm.ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH.mm.ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH.mm.ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH.mm";
+    return "'kl'. HH:mm:ss zzzz";
   }
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "søndag",
         "mandag",
         "tirsdag",
@@ -233,13 +203,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "S",
         "M",
         "T",
@@ -251,13 +216,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "søn.",
         "man.",
         "tir.",
@@ -270,6 +230,14 @@
 
   @Override
   public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
+    return new String[] {
+        "sø.",
+        "ma.",
+        "ti.",
+        "on.",
+        "to.",
+        "fr.",
+        "lø."
+    };
   }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nds.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nds.java
index ddee894..49862b5 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nds.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nds.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,36 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "nds".
+ * Implementation of DateTimeFormatInfo for the "nds" locale.
  */
 public class DateTimeFormatInfoImpl_nds extends DateTimeFormatInfoImpl {
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -52,18 +32,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -120,7 +95,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -137,13 +112,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -160,13 +130,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -183,13 +148,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -198,28 +158,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -231,13 +171,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -249,13 +184,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -265,9 +195,4 @@
         "7"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ne.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ne.java
index f4a36a1..2bf4824 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ne.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ne.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,44 +15,24 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ne".
+ * Implementation of DateTimeFormatInfo for the "ne" locale.
  */
 public class DateTimeFormatInfoImpl_ne extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "पूर्व मध्यान्ह",
         "उत्तर मध्यान्ह"
     };
   }
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/MM/dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ईसा पूर्व",
         "सन्"
     };
@@ -60,20 +40,15 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ईसा पूर्व",
         "सन्"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "जनवरी",
         "फेब्रुअरी",
         "मार्च",
@@ -90,13 +65,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "१",
         "२",
         "३",
@@ -113,13 +83,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "जन",
         "फेब",
         "मार्च",
@@ -136,13 +101,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "पहिलो सत्र",
         "दोस्रो सत्र",
         "तेस्रो सत्र",
@@ -151,28 +111,18 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
+  public String[] quartersShort() {
+    return new String[] {
+        "पहिलो सत्र",
+        "दोस्रो सत्र",
+        "तेस्रो सत्र",
+        "चौथो सत्र"
+    };
   }
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "आइतबार",
         "सोमबार",
         "मङ्गलबार",
@@ -184,13 +134,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "१",
         "२",
         "३",
@@ -202,13 +147,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "आइत",
         "सोम",
         "मङ्गल",
@@ -218,9 +158,4 @@
         "शनि"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ne_IN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ne_IN.java
index c7186cc..f8cc394 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ne_IN.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ne_IN.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,19 +15,78 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ne_IN".
+ * Implementation of DateTimeFormatInfo for the "ne_IN" locale.
  */
 public class DateTimeFormatInfoImpl_ne_IN extends DateTimeFormatInfoImpl_ne {
 
   @Override
+  public String[] ampms() {
+    return new String[] {
+        "पूर्वाह्न",
+        "अपराह्न"
+    };
+  }
+
+  @Override
   public int firstDayOfTheWeek() {
     return 0;
   }
 
   @Override
+  public String[] monthsFull() {
+    return new String[] {
+        "जनवरी",
+        "फरवरी",
+        "मार्च",
+        "अप्रेल",
+        "मई",
+        "जुन",
+        "जुलाई",
+        "अगस्त",
+        "सेप्टेम्बर",
+        "अक्टोबर",
+        "नोभेम्बर",
+        "दिसम्बर"
+    };
+  }
+
+  @Override
+  public String[] quartersFull() {
+    return new String[] {
+        "पहिलो पाउ",
+        "दोस्रो पाउ",
+        "तेस्रो पाउ",
+        "चौथो पाउ"
+    };
+  }
+
+  @Override
+  public String[] quartersShort() {
+    return new String[] {
+        "पहिलो पाउ",
+        "दोस्रो पाउ",
+        "तेस्रो पाउ",
+        "चौथो पाउ"
+    };
+  }
+
+  @Override
+  public String[] weekdaysFull() {
+    return new String[] {
+        "आइतवार",
+        "सोमवार",
+        "मङ्गलवार",
+        "बुधवार",
+        "बिहीवार",
+        "शुक्रवार",
+        "शनिवार"
+    };
+  }
+
+  @Override
   public int weekendStart() {
     return 0;
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nl_BE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nl_BE.java
index 860c1b6..c7a9997 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nl_BE.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nl_BE.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "nl_BE".
+ * Implementation of DateTimeFormatInfo for the "nl_BE" locale.
  */
 public class DateTimeFormatInfoImpl_nl_BE extends DateTimeFormatInfoImpl_nl {
 
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ny.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ny.java
index 44e0544..f87c46f 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ny.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ny.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,44 +15,27 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ny".
+ * Implementation of DateTimeFormatInfo for the "ny" locale.
  */
 public class DateTimeFormatInfoImpl_ny extends DateTimeFormatInfoImpl {
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/MM/dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
-        "BC",
-        "AD"
+    return new String[] {
+        "BCE",
+        "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
+  public String[] erasShort() {
+    return new String[] {
+        "BCE",
+        "CE"
+    };
   }
 
   @Override
@@ -112,7 +95,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Januwale",
         "Febuluwale",
         "Malichi",
@@ -129,13 +112,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -152,13 +130,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Jan",
         "Feb",
         "Mal",
@@ -175,13 +148,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -190,28 +158,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Lamulungu",
         "Lolemba",
         "Lachiwiri",
@@ -223,13 +171,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -241,13 +184,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Mul",
         "Lem",
         "Wir",
@@ -257,9 +195,4 @@
         "Wer"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_oc.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_oc.java
index dacb4e2..26bb6c4 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_oc.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_oc.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,36 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "oc".
+ * Implementation of DateTimeFormatInfo for the "oc" locale.
  */
 public class DateTimeFormatInfoImpl_oc extends DateTimeFormatInfoImpl {
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -52,18 +32,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -120,7 +95,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "genièr",
         "febrièr",
         "març",
@@ -137,13 +112,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -160,13 +130,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "genièr",
         "febrièr",
         "març",
@@ -183,13 +148,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -198,28 +158,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Dimenge",
         "diluns",
         "dimarç",
@@ -231,13 +171,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -249,13 +184,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Dimenge",
         "diluns",
         "dimarç",
@@ -265,9 +195,4 @@
         "dissabte"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_or.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_or.java
index 2425b34..0aeafe5 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_or.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_or.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "or".
+ * Implementation of DateTimeFormatInfo for the "or" locale.
  */
 public class DateTimeFormatInfoImpl_or extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "am",
         "pm"
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -60,13 +60,18 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatMonthNumDay() {
     return "d-M";
   }
@@ -118,7 +123,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "ଜାନୁଆରୀ",
         "ଫେବ୍ରୁୟାରୀ",
         "ମାର୍ଚ୍ଚ",
@@ -135,13 +140,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ଜା",
         "ଫେ",
         "ମା",
@@ -158,13 +158,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ଜାନୁଆରୀ",
         "ଫେବ୍ରୁୟାରୀ",
         "ମାର୍ଚ୍ଚ",
@@ -181,13 +176,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -196,8 +186,28 @@
   }
 
   @Override
+  public String timeFormatFull() {
+    return "h:mm:ss a zzzz";
+  }
+
+  @Override
+  public String timeFormatLong() {
+    return "h:mm:ss a z";
+  }
+
+  @Override
+  public String timeFormatMedium() {
+    return "h:mm:ss a";
+  }
+
+  @Override
+  public String timeFormatShort() {
+    return "h:mm a";
+  }
+
+  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "ରବିବାର",
         "ସୋମବାର",
         "ମଙ୍ଗଳବାର",
@@ -209,13 +219,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "ର",
         "ସୋ",
         "ମ",
@@ -227,13 +232,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "ରବି",
         "ସୋମ",
         "ମଙ୍ଗଳ",
@@ -245,11 +245,6 @@
   }
 
   @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
   public int weekendStart() {
     return 0;
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa_PK.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa_PK.java
index f01a6df..87c2a0b 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa_PK.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa_PK.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,24 +15,29 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "pa_PK".
+ * Implementation of DateTimeFormatInfo for the "pa_PK" locale.
  */
 public class DateTimeFormatInfoImpl_pa_PK extends DateTimeFormatInfoImpl_pa {
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ايساپورو",
         "سں"
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "جنوری",
         "فروری",
         "مارچ",
@@ -49,13 +54,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "جنوری",
         "فروری",
         "مارچ",
@@ -72,13 +72,18 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
+  public String[] quartersFull() {
+    return new String[] {
+        "چوتھاي پہلاں",
+        "چوتھاي دوجا",
+        "چوتھاي تيجا",
+        "چوتھاي چوتھا"
+    };
   }
 
   @Override
-  public String[] quartersFull() {
-    return new String[] { 
+  public String[] quartersShort() {
+    return new String[] {
         "چوتھاي پہلاں",
         "چوتھاي دوجا",
         "چوتھاي تيجا",
@@ -88,7 +93,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "اتوار",
         "پیر",
         "منگل",
@@ -98,14 +103,4 @@
         "ہفتہ"
     };
   }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public int weekendStart() {
-    return 6;
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pl.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pl.java
index fbe52a9..59a2c3a 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pl.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pl.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "pl".
+ * Implementation of DateTimeFormatInfo for the "pl" locale.
  */
 public class DateTimeFormatInfoImpl_pl extends DateTimeFormatInfoImpl {
 
@@ -39,12 +39,32 @@
 
   @Override
   public String dateFormatShort() {
-    return "dd-MM-yy";
+    return "dd-MM-yyyy";
+  }
+
+  @Override
+  public String dateTimeFull(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append(", ").append(timePattern).toString();
+  }
+
+  @Override
+  public String dateTimeLong(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append(", ").append(timePattern).toString();
+  }
+
+  @Override
+  public String dateTimeMedium(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append(", ").append(timePattern).toString();
+  }
+
+  @Override
+  public String dateTimeShort(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append(", ").append(timePattern).toString();
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "p.n.e.",
         "n.e."
     };
@@ -52,18 +72,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "p.n.e.",
         "n.e."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatHour12Minute() {
     return "hh:mm a";
   }
@@ -95,7 +110,7 @@
 
   @Override
   public String formatYearMonthAbbrev() {
-    return "LLL y";
+    return "MMM y";
   }
 
   @Override
@@ -140,7 +155,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "stycznia",
         "lutego",
         "marca",
@@ -158,7 +173,7 @@
 
   @Override
   public String[] monthsFullStandalone() {
-    return new String[] { 
+    return new String[] {
         "styczeń",
         "luty",
         "marzec",
@@ -176,7 +191,7 @@
 
   @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "s",
         "l",
         "m",
@@ -193,13 +208,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "sty",
         "lut",
         "mar",
@@ -216,13 +226,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "I kwartał",
         "II kwartał",
         "III kwartał",
@@ -232,7 +237,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "K1",
         "K2",
         "K3",
@@ -241,28 +246,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "niedziela",
         "poniedziałek",
         "wtorek",
@@ -274,13 +259,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "N",
         "P",
         "W",
@@ -292,13 +272,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "niedz.",
         "pon.",
         "wt.",
@@ -308,9 +283,4 @@
         "sob."
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ps.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ps.java
index 3e30994..bb6698c 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ps.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ps.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ps".
+ * Implementation of DateTimeFormatInfo for the "ps" locale.
  */
 public class DateTimeFormatInfoImpl_ps extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "غ.م.",
         "غ.و."
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ق.م.",
         "م."
     };
@@ -60,7 +60,7 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ق.م.",
         "م."
     };
@@ -68,7 +68,7 @@
 
   @Override
   public int firstDayOfTheWeek() {
-    return 6;
+    return 0;
   }
 
   @Override
@@ -103,7 +103,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "جنوري",
         "فبروري",
         "مارچ",
@@ -120,13 +120,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -143,36 +138,26 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "مـی",
+    return new String[] {
+        "جنوري",
+        "فبروري",
+        "مارچ",
+        "اپریل",
+        "می",
         "جون",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
+        "جولای",
+        "اګست",
+        "سپتمبر",
+        "اکتوبر",
+        "نومبر",
+        "دسمبر"
     };
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -202,7 +187,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "یکشنبه",
         "دوشنبه",
         "سه‌شنبه",
@@ -214,13 +199,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -232,35 +212,15 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
+    return new String[] {
+        "یکشنبه",
+        "دوشنبه",
+        "سه‌شنبه",
+        "چهارشنبه",
+        "پنجشنبه",
+        "جمعه",
+        "شنبه"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
-  public int weekendEnd() {
-    return 5;
-  }
-
-  @Override
-  public int weekendStart() {
-    return 4;
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt_PT.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt_PT.java
index a59307e..f7c62a9 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt_PT.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt_PT.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,18 +15,18 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "pt_PT".
+ * Implementation of DateTimeFormatInfo for the "pt_PT" locale.
  */
 public class DateTimeFormatInfoImpl_pt_PT extends DateTimeFormatInfoImpl_pt {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
-        "Antes do meio-dia",
-        "Depois do meio-dia"
+    return new String[] {
+        "a.m.",
+        "p.m."
     };
   }
 
@@ -57,7 +57,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Janeiro",
         "Fevereiro",
         "Março",
@@ -74,13 +74,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Jan",
         "Fev",
         "Mar",
@@ -97,17 +92,25 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1.º trimestre",
         "2.º trimestre",
         "3.º trimestre",
         "4.º trimestre"
     };
   }
+
+  @Override
+  public String[] weekdaysFull() {
+    return new String[] {
+        "Domingo",
+        "Segunda-feira",
+        "Terça-feira",
+        "Quarta-feira",
+        "Quinta-feira",
+        "Sexta-feira",
+        "Sábado"
+    };
+  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ru_UA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ru_UA.java
index 1458bf1..81f27c1 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ru_UA.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ru_UA.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ru_UA".
+ * Implementation of DateTimeFormatInfo for the "ru_UA" locale.
  */
 public class DateTimeFormatInfoImpl_ru_UA extends DateTimeFormatInfoImpl_ru {
 
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_rw.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_rw.java
index 7939abc..af93033 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_rw.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_rw.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,36 +15,21 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "rw".
+ * Implementation of DateTimeFormatInfo for the "rw" locale.
  */
 public class DateTimeFormatInfoImpl_rw extends DateTimeFormatInfoImpl {
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
   public String dateFormatShort() {
     return "yy/MM/dd";
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -52,25 +37,20 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatYearMonthNumDay() {
     return "y/M/d";
   }
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Mutarama",
         "Gashyantare",
         "Werurwe",
@@ -87,13 +67,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -110,13 +85,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "mut.",
         "gas.",
         "wer.",
@@ -133,13 +103,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "igihembwe cya mbere",
         "igihembwe cya kabiri",
         "igihembwe cya gatatu",
@@ -149,7 +114,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "I1",
         "I2",
         "I3",
@@ -158,28 +123,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Ku cyumweru",
         "Kuwa mbere",
         "Kuwa kabiri",
@@ -191,13 +136,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -209,13 +149,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "cyu.",
         "mbe.",
         "kab.",
@@ -225,9 +160,4 @@
         "gnd."
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sa.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sa.java
index c4a8edf..710c210 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sa.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sa.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "sa".
+ * Implementation of DateTimeFormatInfo for the "sa" locale.
  */
 public class DateTimeFormatInfoImpl_sa extends DateTimeFormatInfoImpl {
 
@@ -44,7 +44,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -60,7 +60,7 @@
 
   @Override
   public int firstDayOfTheWeek() {
-    return 1;
+    return 0;
   }
 
   @Override
@@ -120,7 +120,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -137,13 +137,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -160,13 +155,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -183,13 +173,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -219,7 +204,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -231,13 +216,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -249,13 +229,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -267,7 +242,7 @@
   }
 
   @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
+  public int weekendStart() {
+    return 0;
   }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_si.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_si.java
index 67b57c7..e86823d 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_si.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_si.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "si".
+ * Implementation of DateTimeFormatInfo for the "si" locale.
  */
 public class DateTimeFormatInfoImpl_si extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "පෙ.ව.",
         "ප.ව."
     };
@@ -36,23 +36,13 @@
   }
 
   @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
   public String dateFormatShort() {
     return "yyyy/MM/dd";
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ක්‍රිස්තු පූර්‍ව",
         "ක්‍රිස්තු වර්‍ෂ"
     };
@@ -60,25 +50,20 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ක්‍රි.පූ.",
         "ක්‍රි.ව."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatYearMonthNumDay() {
     return "y/M/d";
   }
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "ජනවාර",
         "පෙබරවාර",
         "මාර්ත",
@@ -95,13 +80,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ජ",
         "පෙ",
         "මා",
@@ -118,13 +98,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ජන",
         "පෙබ",
         "මාර්ත",
@@ -141,13 +116,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1 වන කාර්තුව",
         "2 වන කාර්තුව",
         "3 වන කාර්තුව",
@@ -157,7 +127,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "කාර්:1",
         "කාර්:2",
         "කාර්:3",
@@ -166,8 +136,28 @@
   }
 
   @Override
+  public String timeFormatFull() {
+    return "h:mm:ss a zzzz";
+  }
+
+  @Override
+  public String timeFormatLong() {
+    return "h:mm:ss a z";
+  }
+
+  @Override
+  public String timeFormatMedium() {
+    return "h:mm:ss a";
+  }
+
+  @Override
+  public String timeFormatShort() {
+    return "h:mm a";
+  }
+
+  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "ඉරිදා",
         "සඳුදා",
         "අඟහරුවාදා",
@@ -179,13 +169,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "ඉ",
         "ස",
         "අ",
@@ -197,13 +182,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "ඉරි",
         "සඳු",
         "අඟ",
@@ -213,9 +193,4 @@
         "සෙන"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sk.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sk.java
index 728a9c7..8de51f1 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sk.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sk.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "sk".
+ * Implementation of DateTimeFormatInfo for the "sk" locale.
  */
 public class DateTimeFormatInfoImpl_sk extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "dopoludnia",
         "popoludní"
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "pred n.l.",
         "n.l."
     };
@@ -60,18 +60,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "pred n.l.",
         "n.l."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatHour24Minute() {
     return "H:mm";
   }
@@ -148,7 +143,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "januára",
         "februára",
         "marca",
@@ -166,7 +161,7 @@
 
   @Override
   public String[] monthsFullStandalone() {
-    return new String[] { 
+    return new String[] {
         "január",
         "február",
         "marec",
@@ -184,7 +179,7 @@
 
   @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "j",
         "f",
         "m",
@@ -201,13 +196,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "jan",
         "feb",
         "mar",
@@ -224,13 +214,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1. štvrťrok",
         "2. štvrťrok",
         "3. štvrťrok",
@@ -260,7 +245,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "nedeľa",
         "pondelok",
         "utorok",
@@ -272,13 +257,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "N",
         "P",
         "U",
@@ -290,13 +270,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "ne",
         "po",
         "ut",
@@ -306,9 +281,4 @@
         "so"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr.java
index 5d85b5e..b2d8952 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "sr".
+ * Implementation of DateTimeFormatInfo for the "sr" locale.
  */
 public class DateTimeFormatInfoImpl_sr extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "пре подне",
         "поподне"
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "Пре нове ере",
         "Нове ере"
     };
@@ -60,18 +60,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "п. н. е.",
-        "н. е"
+        "н. е."
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatHour12Minute() {
     return "hh.mm a";
   }
@@ -107,11 +102,6 @@
   }
 
   @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d. MMMM";
-  }
-
-  @Override
   public String formatYearMonthAbbrev() {
     return "MMM. y";
   }
@@ -122,11 +112,6 @@
   }
 
   @Override
-  public String formatYearMonthFull() {
-    return "MMMM. y";
-  }
-
-  @Override
   public String formatYearMonthFullDay() {
     return "d. MMMM y.";
   }
@@ -143,7 +128,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "јануар",
         "фебруар",
         "март",
@@ -160,13 +145,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ј",
         "ф",
         "м",
@@ -183,13 +163,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "јан",
         "феб",
         "мар",
@@ -206,13 +181,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Прво тромесечје",
         "Друго тромесечје",
         "Треће тромесечје",
@@ -222,7 +192,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "К1",
         "К2",
         "К3",
@@ -252,7 +222,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "недеља",
         "понедељак",
         "уторак",
@@ -264,13 +234,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "н",
         "п",
         "у",
@@ -282,13 +247,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "нед",
         "пон",
         "уто",
@@ -298,9 +258,4 @@
         "суб"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_st.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_st.java
index 55071fe..da863b8 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_st.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_st.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,44 +15,27 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "st".
+ * Implementation of DateTimeFormatInfo for the "st" locale.
  */
 public class DateTimeFormatInfoImpl_st extends DateTimeFormatInfoImpl {
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/MM/dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
-        "BC",
-        "AD"
+    return new String[] {
+        "BCE",
+        "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
+  public String[] erasShort() {
+    return new String[] {
+        "BCE",
+        "CE"
+    };
   }
 
   @Override
@@ -112,7 +95,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Phesekgong",
         "Hlakola",
         "Hlakubele",
@@ -129,13 +112,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -152,13 +130,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Phe",
         "Kol",
         "Ube",
@@ -175,13 +148,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -190,28 +158,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Sontaha",
         "Mmantaha",
         "Labobedi",
@@ -223,13 +171,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -241,13 +184,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Son",
         "Mma",
         "Bed",
@@ -257,9 +195,4 @@
         "Moq"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tg.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tg.java
index 37f909e..aefc4da 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tg.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tg.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,44 +15,29 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "tg".
+ * Implementation of DateTimeFormatInfo for the "tg" locale.
  */
 public class DateTimeFormatInfoImpl_tg extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "пе. чо.",
         "па. чо."
     };
   }
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
   public String dateFormatShort() {
     return "yy/MM/dd";
   }
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "Пеш аз милод",
         "ПаМ"
     };
@@ -60,18 +45,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ПеМ",
         "ПаМ"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -128,7 +108,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Январ",
         "Феврал",
         "Март",
@@ -145,13 +125,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -168,13 +143,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Янв",
         "Фев",
         "Мар",
@@ -191,13 +161,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -206,28 +171,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Якшанбе",
         "Душанбе",
         "Сешанбе",
@@ -239,13 +184,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -257,13 +197,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Яшб",
         "Дшб",
         "Сшб",
@@ -273,9 +208,4 @@
         "Шнб"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_th.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_th.java
index 0ecb342..8b62b27 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_th.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_th.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "th".
+ * Implementation of DateTimeFormatInfo for the "th" locale.
  */
 public class DateTimeFormatInfoImpl_th extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "ก่อนเที่ยง",
         "หลังเที่ยง"
     };
@@ -51,8 +51,28 @@
   }
 
   @Override
+  public String dateTimeFull(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append(", ").append(timePattern).toString();
+  }
+
+  @Override
+  public String dateTimeLong(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append(", ").append(timePattern).toString();
+  }
+
+  @Override
+  public String dateTimeMedium(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append(", ").append(timePattern).toString();
+  }
+
+  @Override
+  public String dateTimeShort(String timePattern, String datePattern) {
+    return new java.lang.StringBuffer().append(datePattern).append(", ").append(timePattern).toString();
+  }
+
+  @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ปีก่อนคริสต์ศักราช",
         "คริสต์ศักราช"
     };
@@ -60,13 +80,18 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ปีก่อน ค.ศ.",
         "ค.ศ."
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatHour12Minute() {
     return "H:mm";
   }
@@ -87,43 +112,28 @@
   }
 
   @Override
-  public String formatMinuteSecond() {
-    return "m ├'F13': s┤";
-  }
-
-  @Override
-  public String formatMonthAbbrev() {
-    return "MMM";
-  }
-
-  @Override
   public String formatMonthAbbrevDay() {
-    return "d ├'F3': MMM┤";
-  }
-
-  @Override
-  public String formatMonthFull() {
-    return "MMMM";
+    return "d MMM";
   }
 
   @Override
   public String formatMonthFullDay() {
-    return "d ├'F3': MMMM┤";
+    return "d MMMM";
   }
 
   @Override
   public String formatMonthFullWeekdayDay() {
-    return "d ├'F3': MMMM┤ ├'F6': EEEE┤";
+    return "EEEE d MMMM";
   }
 
   @Override
   public String formatMonthNumDay() {
-    return "M ├'F7': d┤";
+    return "d/M";
   }
 
   @Override
   public String formatYearMonthAbbrev() {
-    return "y ├'F3': MMM┤";
+    return "MMM y";
   }
 
   @Override
@@ -133,7 +143,7 @@
 
   @Override
   public String formatYearMonthFull() {
-    return "y ├'F3': MMMM┤";
+    return "MMMM y";
   }
 
   @Override
@@ -143,7 +153,7 @@
 
   @Override
   public String formatYearMonthNum() {
-    return "y ├'F3': M┤";
+    return "M/yyyy";
   }
 
   @Override
@@ -153,22 +163,22 @@
 
   @Override
   public String formatYearMonthWeekdayDay() {
-    return "d MMM y ├'F6': EEE┤";
+    return "EEE d MMM y";
   }
 
   @Override
   public String formatYearQuarterFull() {
-    return "y ├'F2': QQQQ┤";
+    return "QQQQ yyyy";
   }
 
   @Override
   public String formatYearQuarterShort() {
-    return "y ├'F2': Q┤";
+    return "Q yyyy";
   }
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "มกราคม",
         "กุมภาพันธ์",
         "มีนาคม",
@@ -185,36 +195,26 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
-        "ม.ค.",
-        "ก.พ.",
-        "มี.ค.",
-        "เม.ย.",
-        "พ.ค.",
-        "มิ.ย.",
-        "ก.ค.",
-        "ส.ค.",
-        "ก.ย.",
-        "ต.ค.",
-        "พ.ย.",
-        "ธ.ค."
+    return new String[] {
+        "ม",
+        "ก",
+        "ม",
+        "ม",
+        "พ",
+        "ม",
+        "ก",
+        "ส",
+        "ก",
+        "ต",
+        "พ",
+        "ธ"
     };
   }
 
   @Override
   public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ม.ค.",
         "ก.พ.",
         "มี.ค.",
@@ -231,13 +231,26 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
+  public String[] monthsShort() {
+    return new String[] {
+        "ม.ค.",
+        "ก.พ.",
+        "มี.ค.",
+        "เม.ย.",
+        "พ.ค.",
+        "มิ.ย.",
+        "ก.ค.",
+        "ส.ค.",
+        "ก.ย.",
+        "ต.ค.",
+        "พ.ย.",
+        "ธ.ค."
+    };
   }
 
   @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "ไตรมาส 1",
         "ไตรมาส 2",
         "ไตรมาส 3",
@@ -267,7 +280,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "วันอาทิตย์",
         "วันจันทร์",
         "วันอังคาร",
@@ -279,13 +292,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "อ",
         "จ",
         "อ",
@@ -297,13 +305,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "อา.",
         "จ.",
         "อ.",
@@ -313,9 +316,4 @@
         "ส."
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ti.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ti.java
index a059e8c..23799a3 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ti.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ti.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ti".
+ * Implementation of DateTimeFormatInfo for the "ti" locale.
  */
 public class DateTimeFormatInfoImpl_ti extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "ንጉሆ ሰዓተ",
         "ድሕር ሰዓት"
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "ዓ/ዓ",
         "ዓ/ም"
     };
@@ -60,7 +60,7 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ዓ/ዓ",
         "ዓ/ም"
     };
@@ -128,7 +128,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "ጃንዩወሪ",
         "ፌብሩወሪ",
         "ማርች",
@@ -145,13 +145,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ጃ",
         "ፌ",
         "ማ",
@@ -168,13 +163,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "ጃንዩ",
         "ፌብሩ",
         "ማርች",
@@ -191,13 +181,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -206,8 +191,28 @@
   }
 
   @Override
+  public String timeFormatFull() {
+    return "h:mm:ss a zzzz";
+  }
+
+  @Override
+  public String timeFormatLong() {
+    return "h:mm:ss a z";
+  }
+
+  @Override
+  public String timeFormatMedium() {
+    return "h:mm:ss a";
+  }
+
+  @Override
+  public String timeFormatShort() {
+    return "h:mm a";
+  }
+
+  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "ሰንበት",
         "ሰኑይ",
         "ሠሉስ",
@@ -219,13 +224,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "ሰ",
         "ሰ",
         "ሠ",
@@ -237,14 +237,9 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
-        "ሰንበ",
+    return new String[] {
+        "ሰንበት",
         "ሰኑይ",
         "ሠሉስ",
         "ረቡዕ",
@@ -253,9 +248,4 @@
         "ቀዳም"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tr.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tr.java
index 6747902..c376868 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tr.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tr.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "tr".
+ * Implementation of DateTimeFormatInfo for the "tr" locale.
  */
 public class DateTimeFormatInfoImpl_tr extends DateTimeFormatInfoImpl {
 
@@ -44,7 +44,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "Milattan Önce",
         "Milattan Sonra"
     };
@@ -52,18 +52,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "MÖ",
         "MS"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthAbbrevDay() {
     return "dd MMM";
   }
@@ -110,7 +105,7 @@
 
   @Override
   public String formatYearMonthNumDay() {
-    return "d.M.y";
+    return "d M y";
   }
 
   @Override
@@ -130,7 +125,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Ocak",
         "Şubat",
         "Mart",
@@ -147,13 +142,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "O",
         "Ş",
         "M",
@@ -170,13 +160,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Oca",
         "Şub",
         "Mar",
@@ -193,13 +178,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "1. çeyrek",
         "2. çeyrek",
         "3. çeyrek",
@@ -209,7 +189,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "Ç1",
         "Ç2",
         "Ç3",
@@ -218,28 +198,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Pazar",
         "Pazartesi",
         "Salı",
@@ -251,13 +211,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "P",
         "P",
         "S",
@@ -269,13 +224,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Paz",
         "Pzt",
         "Sal",
@@ -285,9 +235,4 @@
         "Cmt"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tt.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tt.java
index 42edd19..a408011 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tt.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tt.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "tt".
+ * Implementation of DateTimeFormatInfo for the "tt" locale.
  */
 public class DateTimeFormatInfoImpl_tt extends DateTimeFormatInfoImpl {
 
@@ -44,7 +44,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
@@ -52,18 +52,13 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "BCE",
         "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
   public String formatMonthFullWeekdayDay() {
     return "EEEE, MMMM d";
   }
@@ -120,7 +115,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -137,13 +132,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -160,13 +150,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -183,13 +168,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -198,6 +178,11 @@
   }
 
   @Override
+  public String timeFormatFull() {
+    return "h:mm:ss a zzzz";
+  }
+
+  @Override
   public String timeFormatLong() {
     return "H:mm:ss z";
   }
@@ -214,7 +199,7 @@
 
   @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -226,13 +211,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -244,13 +224,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -260,9 +235,4 @@
         "7"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ur.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ur.java
index 403ce7a..8a71012 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ur.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ur.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,16 +15,16 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ur".
+ * Implementation of DateTimeFormatInfo for the "ur" locale.
  */
 public class DateTimeFormatInfoImpl_ur extends DateTimeFormatInfoImpl {
 
   @Override
   public String[] ampms() {
-    return new String[] { 
+    return new String[] {
         "قبل دوپہر",
         "بعد دوپہر"
     };
@@ -52,7 +52,7 @@
 
   @Override
   public String[] erasFull() {
-    return new String[] { 
+    return new String[] {
         "قبل مسيح",
         "عيسوی سن"
     };
@@ -60,13 +60,18 @@
 
   @Override
   public String[] erasShort() {
-    return new String[] { 
+    return new String[] {
         "ق م",
         "عيسوی سن"
     };
   }
 
   @Override
+  public int firstDayOfTheWeek() {
+    return 0;
+  }
+
+  @Override
   public String formatYearMonthAbbrevDay() {
     return "d, MMM y";
   }
@@ -88,7 +93,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "جنوری",
         "فروری",
         "مار چ",
@@ -105,13 +110,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "ج",
         "ف",
         "م",
@@ -128,13 +128,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "جنوری",
         "فروری",
         "مار چ",
@@ -151,13 +146,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "پہلی سہ ماہی",
         "دوسری سہ ماہی",
         "تيسری سہ ماہی",
@@ -167,7 +157,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "1سہ ماہی",
         "2سہ ماہی",
         "3سہ ماہی",
@@ -176,8 +166,28 @@
   }
 
   @Override
+  public String timeFormatFull() {
+    return "h:mm:ss a zzzz";
+  }
+
+  @Override
+  public String timeFormatLong() {
+    return "h:mm:ss a z";
+  }
+
+  @Override
+  public String timeFormatMedium() {
+    return "h:mm:ss a";
+  }
+
+  @Override
+  public String timeFormatShort() {
+    return "h:mm a";
+  }
+
+  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "اتوار",
         "پير",
         "منگل",
@@ -189,13 +199,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "ا",
         "پ",
         "م",
@@ -207,21 +212,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "اتوار",
         "پير",
         "منگل",
@@ -231,9 +223,4 @@
         "ہفتہ"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ve.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ve.java
index 879f223..b204d79 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ve.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ve.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,44 +15,27 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "ve".
+ * Implementation of DateTimeFormatInfo for the "ve" locale.
  */
 public class DateTimeFormatInfoImpl_ve extends DateTimeFormatInfoImpl {
 
   @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/MM/dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
-        "BC",
-        "AD"
+    return new String[] {
+        "BCE",
+        "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
+  public String[] erasShort() {
+    return new String[] {
+        "BCE",
+        "CE"
+    };
   }
 
   @Override
@@ -112,7 +95,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Phando",
         "Luhuhi",
         "Ṱhafamuhwe",
@@ -129,13 +112,8 @@
   }
 
   @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
   public String[] monthsNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -152,13 +130,8 @@
   }
 
   @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Pha",
         "Luh",
         "Ṱha",
@@ -175,13 +148,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Kotara ya u thoma",
         "Kotara ya vhuvhili",
         "Kotara ya vhuraru",
@@ -191,7 +159,7 @@
 
   @Override
   public String[] quartersShort() {
-    return new String[] { 
+    return new String[] {
         "K1",
         "K2",
         "K3",
@@ -200,28 +168,8 @@
   }
 
   @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Swondaha",
         "Musumbuluwo",
         "Ḽavhuvhili",
@@ -233,13 +181,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "1",
         "2",
         "3",
@@ -251,13 +194,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Swo",
         "Mus",
         "Vhi",
@@ -267,9 +205,4 @@
         "Mug"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zu.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zu.java
index 3106f60..e8dd4bd 100644
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zu.java
+++ b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zu.java
@@ -6,7 +6,7 @@
  * the License at
  * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.i18n.client.impl.cldr;
 
-// DO NOT EDIT - GENERATED FROM CLDR DATA
+// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
 
 /**
- * Implementation of DateTimeFormatInfo for locale "zu".
+ * Implementation of DateTimeFormatInfo for the "zu" locale.
  */
 public class DateTimeFormatInfoImpl_zu extends DateTimeFormatInfoImpl {
 
@@ -38,21 +38,19 @@
   }
 
   @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
   public String[] erasFull() {
-    return new String[] { 
-        "BC",
-        "AD"
+    return new String[] {
+        "BCE",
+        "CE"
     };
   }
 
   @Override
-  public int firstDayOfTheWeek() {
-    return 1;
+  public String[] erasShort() {
+    return new String[] {
+        "BCE",
+        "CE"
+    };
   }
 
   @Override
@@ -72,7 +70,7 @@
 
   @Override
   public String[] monthsFull() {
-    return new String[] { 
+    return new String[] {
         "Januwari",
         "Februwari",
         "Mashi",
@@ -90,7 +88,7 @@
 
   @Override
   public String[] monthsFullStandalone() {
-    return new String[] { 
+    return new String[] {
         "uJanuwari",
         "uFebruwari",
         "uMashi",
@@ -108,7 +106,7 @@
 
   @Override
   public String[] monthsShort() {
-    return new String[] { 
+    return new String[] {
         "Jan",
         "Feb",
         "Mas",
@@ -125,13 +123,8 @@
   }
 
   @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
   public String[] quartersFull() {
-    return new String[] { 
+    return new String[] {
         "Q1",
         "Q2",
         "Q3",
@@ -140,8 +133,28 @@
   }
 
   @Override
+  public String timeFormatFull() {
+    return "h:mm:ss a zzzz";
+  }
+
+  @Override
+  public String timeFormatLong() {
+    return "h:mm:ss a z";
+  }
+
+  @Override
+  public String timeFormatMedium() {
+    return "h:mm:ss a";
+  }
+
+  @Override
+  public String timeFormatShort() {
+    return "h:mm a";
+  }
+
+  @Override
   public String[] weekdaysFull() {
-    return new String[] { 
+    return new String[] {
         "Sonto",
         "Msombuluko",
         "Lwesibili",
@@ -153,13 +166,8 @@
   }
 
   @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
   public String[] weekdaysNarrow() {
-    return new String[] { 
+    return new String[] {
         "S",
         "M",
         "B",
@@ -171,13 +179,8 @@
   }
 
   @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
   public String[] weekdaysShort() {
-    return new String[] { 
+    return new String[] {
         "Son",
         "Mso",
         "Bil",
@@ -187,9 +190,4 @@
         "Mgq"
     };
   }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
 }
diff --git a/user/src/com/google/gwt/i18n/rebind/cldr/ListPatterns_nl.properties b/user/src/com/google/gwt/i18n/rebind/cldr/ListPatterns_nl.properties
index 9664e93..0d34cc1 100644
--- a/user/src/com/google/gwt/i18n/rebind/cldr/ListPatterns_nl.properties
+++ b/user/src/com/google/gwt/i18n/rebind/cldr/ListPatterns_nl.properties
@@ -1,4 +1,4 @@
 2={0} en {1}
 start={0}, {1}
 middle={0}, {1}
-end={0}, en {1}
+end={0} en {1}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonProxyListRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonProxyListRequest.java
index 34fc8d3..baee250 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonProxyListRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonProxyListRequest.java
@@ -16,7 +16,7 @@
 package com.google.gwt.requestfactory.client.impl;
 
 import com.google.gwt.requestfactory.shared.EntityProxy;
-import com.google.gwt.requestfactory.shared.ProxyListRequest;
+import com.google.gwt.requestfactory.shared.Request;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -39,7 +39,7 @@
     AbstractJsonProxyListRequest<T extends EntityProxy,
     R extends AbstractJsonProxyListRequest<T, R>>
     extends AbstractJsonProxyCollectionRequest<List<T>, T, R>
-    implements ProxyListRequest<T> {
+    implements Request<List<T>> {
   protected final ProxySchema<?> schema;
 
   public AbstractJsonProxyListRequest(ProxySchema<? extends T> schema,
diff --git a/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java b/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
index 76483ed..9be4279 100644
--- a/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
+++ b/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
@@ -55,9 +55,7 @@
 import com.google.gwt.requestfactory.server.ReflectionBasedOperationRegistry;
 import com.google.gwt.requestfactory.shared.EntityProxy;
 import com.google.gwt.requestfactory.shared.EntityProxyId;
-import com.google.gwt.requestfactory.shared.ProxyListRequest;
-import com.google.gwt.requestfactory.shared.ProxyRequest;
-import com.google.gwt.requestfactory.shared.ProxySetRequest;
+import com.google.gwt.requestfactory.shared.Request;
 import com.google.gwt.requestfactory.shared.RequestFactory;
 import com.google.gwt.requestfactory.shared.WriteOperation;
 import com.google.gwt.requestfactory.shared.impl.CollectionProperty;
@@ -136,6 +134,7 @@
   private JClassType listType;
   private JClassType setType;
   private JClassType entityProxyType;
+  private JClassType mainRequestType;
 
   private final Set<JClassType> generatedProxyTypes = new HashSet<JClassType>();
 
@@ -148,6 +147,7 @@
     listType = typeOracle.findType(List.class.getName());
     setType = typeOracle.findType(Set.class.getName());
     entityProxyType = typeOracle.findType(EntityProxy.class.getName());
+    mainRequestType = typeOracle.findType(Request.class.getName());
 
     // Get a reference to the type that the generator should implement
     JClassType interfaceType = typeOracle.findType(interfaceName);
@@ -183,6 +183,10 @@
   }
 
   private String asInnerImplClass(String className, JClassType outerClassName) {
+    if (outerClassName.isParameterized() != null) {
+      // outerClassName is of form List<EmployeeProxy>
+      outerClassName = outerClassName.isParameterized().getTypeArgs()[0];
+    }
     className = outerClassName.getQualifiedSourceName() + "Impl." + className;
     return className;
   }
@@ -226,11 +230,11 @@
       throws UnableToCompleteException {
     TypeOracle typeOracle = generatorContext.getTypeOracle();
 
-    if (!publicProxyType.isAssignableTo(entityProxyType)) {
-      return;
+    if (publicProxyType.isParameterized() != null) {
+      // handle publicProxyType = List<EmployeeProxy>
+      publicProxyType = publicProxyType.isParameterized().getTypeArgs()[0];
     }
-
-    if (publicProxyType.equals(entityProxyType)) {
+    if (!publicProxyType.isAssignableTo(entityProxyType)) {
       return;
     }
     if (generatedProxyTypes.contains(publicProxyType)) {
@@ -681,7 +685,7 @@
           throw new UnableToCompleteException();
         }
       }
-      if (isProxyCollectionRequest(typeOracle, requestType)) {
+      if (isRequestObjectCollectionRequest(typeOracle, requestType)) {
         Class<?> colType = getCollectionType(typeOracle, requestType);
         assert colType != null;
         requestClassName = asInnerImplClass(colType == List.class
@@ -777,12 +781,6 @@
    */
   private Class<?> getCollectionType(TypeOracle typeOracle,
       JClassType requestType) {
-    if (requestType.isAssignableTo(typeOracle.findType(ProxyListRequest.class.getName()))) {
-      return List.class;
-    }
-    if (requestType.isAssignableTo(typeOracle.findType(ProxySetRequest.class.getName()))) {
-      return Set.class;
-    }
     JClassType retType = requestType.isParameterized().getTypeArgs()[0];
     if (retType.isParameterized() != null) {
       JClassType leafType = retType.isParameterized().getTypeArgs()[0];
@@ -920,14 +918,12 @@
     return requestType.isParameterized().getTypeArgs()[0].isAssignableTo(typeOracle.findType(Long.class.getName()));
   }
 
-  private boolean isProxyCollectionRequest(TypeOracle typeOracle,
-      JClassType requestType) {
-    return requestType.isAssignableTo(typeOracle.findType(ProxyListRequest.class.getName()))
-        || requestType.isAssignableTo(typeOracle.findType(ProxySetRequest.class.getName()));
-  }
-
   private boolean isProxyRequest(TypeOracle typeOracle, JClassType requestType) {
-    return requestType.isAssignableTo(typeOracle.findType(ProxyRequest.class.getName()));
+    if (requestType.isParameterized() != null && requestType.isAssignableTo(mainRequestType)) {
+      JClassType leafType = requestType.isParameterized().getTypeArgs()[0];
+      return leafType.isAssignableTo(entityProxyType);
+    }
+    return false;
   }
 
   private boolean isProxyType(TypeOracle typeOracle, JClassType requestType) {
diff --git a/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java b/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java
index f485425..ead2af7 100644
--- a/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java
+++ b/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java
@@ -66,8 +66,12 @@
       return domainClass.getCanonicalName();
     }
 
+    public Method getDomainMethod() {
+      return domainMethod;
+    }
+
     public String getDomainMethodName() {
-      return domainMethod.getName();
+      return getDomainMethod().getName();
     }
 
     public Class<?>[] getParameterTypes() {
@@ -91,13 +95,12 @@
           if (!dtoClass.equals(domainReturnType)) {
             throw new IllegalArgumentException(
                 "Type mismatch between " + domainMethod + " return type, and "
-                    + requestReturnType + "'s DataTransferObject annotation "
+                    + requestReturnType + "'s ProxyFor annotation "
                     + dtoClass);
           }
         } else {
           throw new IllegalArgumentException(
-              "Missing DataTransferObject " + "annotation on record type "
-                  + requestReturnType);
+              "Missing ProxyFor annotation on proxy type " + requestReturnType);
         }
         return requestReturnType;
       }
@@ -109,10 +112,6 @@
       return isInstance;
     }
 
-    public boolean isReturnTypeList() {
-      return List.class.isAssignableFrom(domainMethod.getReturnType());
-    }
-
     public String name() {
       return requestClass.getCanonicalName() + SCOPE_SEPARATOR
           + getDomainMethodName();
@@ -160,7 +159,7 @@
       if (params.length == 1) {
         if (params[0] instanceof ParameterizedType) {
           // if type is for example, RequestObject<List<T>> we return T
-          return (Class<?>) ((ParameterizedType) params[0]).getRawType();
+          return (Class<?>) ((ParameterizedType) params[0]).getActualTypeArguments()[0];
         }
         // else, it might be a case like List<T> in which case we return T
         return (Class<Object>) params[0];
diff --git a/user/src/com/google/gwt/requestfactory/shared/UserInformationRequest.java b/user/src/com/google/gwt/requestfactory/shared/UserInformationRequest.java
index 2333632..f6aff3e 100644
--- a/user/src/com/google/gwt/requestfactory/shared/UserInformationRequest.java
+++ b/user/src/com/google/gwt/requestfactory/shared/UserInformationRequest.java
@@ -25,6 +25,6 @@
 @Service(UserInformation.class)
 public interface UserInformationRequest {
 
-  ProxyRequest<UserInformationProxy> getCurrentUserInformation(String redirectUrl);
+  Request<UserInformationProxy> getCurrentUserInformation(String redirectUrl);
  
 }
diff --git a/user/src/com/google/gwt/view/client/SingleSelectionModel.java b/user/src/com/google/gwt/view/client/SingleSelectionModel.java
index bc8fa12..831a74f 100644
--- a/user/src/com/google/gwt/view/client/SingleSelectionModel.java
+++ b/user/src/com/google/gwt/view/client/SingleSelectionModel.java
@@ -34,6 +34,7 @@
   // Pending selection change
   private boolean newSelected;
   private T newSelectedObject = null;
+  private boolean newSelectedPending;
 
   /**
    * Constructs a SingleSelectionModel without a key provider.
@@ -41,7 +42,7 @@
   public SingleSelectionModel() {
     super(null);
   }
-  
+
   /**
    * Constructs a SingleSelectionModel with the given key provider.
    *
@@ -71,6 +72,7 @@
   public void setSelected(T object, boolean selected) {
     newSelectedObject = object;
     newSelected = selected;
+    newSelectedPending = true;
     scheduleSelectionChangeEvent();
   }
 
@@ -83,11 +85,11 @@
   }
 
   private void resolveChanges() {
-    if (newSelectedObject == null) {
+    if (!newSelectedPending) {
       return;
     }
 
-    Object key = getKey(newSelectedObject);
+    Object key = (newSelectedObject == null) ? null : getKey(newSelectedObject);
     boolean sameKey = curKey == null ? key == null : curKey.equals(key);
     boolean changed = false;
     if (newSelected) {
@@ -101,6 +103,7 @@
     }
 
     newSelectedObject = null;
+    newSelectedPending = false;
 
     // Fire a selection change event.
     if (changed) {
diff --git a/user/test/com/google/gwt/cell/client/CellTestBase.java b/user/test/com/google/gwt/cell/client/CellTestBase.java
index 28c6082..cdbee13 100644
--- a/user/test/com/google/gwt/cell/client/CellTestBase.java
+++ b/user/test/com/google/gwt/cell/client/CellTestBase.java
@@ -108,7 +108,7 @@
 
   @Override
   public String getModuleName() {
-    return "com.google.gwt.cell.Cell";
+    return "com.google.gwt.cell.CellTest";
   }
 
   public void testDependsOnSelection() {
diff --git a/user/test/com/google/gwt/i18n/client/I18N2Test.java b/user/test/com/google/gwt/i18n/client/I18N2Test.java
index 98cf5a1..08a1d57 100644
--- a/user/test/com/google/gwt/i18n/client/I18N2Test.java
+++ b/user/test/com/google/gwt/i18n/client/I18N2Test.java
@@ -52,7 +52,7 @@
     assertEquals("This {0} would be an argument if not quoted", m.quotedArg());
     assertEquals("Total is US$11,305.01", m.currencyFormat(11305.01));
     assertEquals("Default number format is 1,017.1", m.defaultNumberFormat(1017.1));
-    assertEquals("It is 12:01 PM on Saturday, December 1, 2007",
+    assertEquals("It is 12:01 on Saturday, 2007 December 01",
         m.getTimeDate(new Date(107, 11, 1, 12, 1, 2)));
     assertEquals("13 widgets", m.pluralWidgetsOther(13));
 //    assertEquals("A widget", m.pluralWidgetsOther(1));
diff --git a/user/test/com/google/gwt/requestfactory/client/EditorTest.java b/user/test/com/google/gwt/requestfactory/client/EditorTest.java
index 69e9da9..32161dd 100644
--- a/user/test/com/google/gwt/requestfactory/client/EditorTest.java
+++ b/user/test/com/google/gwt/requestfactory/client/EditorTest.java
@@ -24,11 +24,10 @@
 import com.google.gwt.editor.client.HasEditorDelegate;
 import com.google.gwt.editor.client.HasEditorErrors;
 import com.google.gwt.editor.client.adapters.SimpleEditor;
-import com.google.gwt.requestfactory.shared.ProxyRequest;
 import com.google.gwt.requestfactory.shared.Receiver;
+import com.google.gwt.requestfactory.shared.Request;
 import com.google.gwt.requestfactory.shared.SimpleBarProxy;
 import com.google.gwt.requestfactory.shared.SimpleFooProxy;
-
 import com.google.gwt.requestfactory.shared.Violation;
 
 import java.util.Arrays;
@@ -153,7 +152,7 @@
             assertNotNull(editor.delegate.subscribe());
 
             // Simulate edits occurring elsewhere in the module
-            ProxyRequest<SimpleFooProxy> request = req.simpleFooRequest().persistAndReturnSelf(
+            Request<SimpleFooProxy> request = req.simpleFooRequest().persistAndReturnSelf(
                 response);
             SimpleBarProxy newBar = req.create(SimpleBarProxy.class);
             newBar = request.edit(newBar);
diff --git a/user/test/com/google/gwt/requestfactory/client/RequestFactoryTestBase.java b/user/test/com/google/gwt/requestfactory/client/RequestFactoryTestBase.java
index 19a7810..44531b4 100644
--- a/user/test/com/google/gwt/requestfactory/client/RequestFactoryTestBase.java
+++ b/user/test/com/google/gwt/requestfactory/client/RequestFactoryTestBase.java
@@ -40,8 +40,7 @@
    */
   protected class SimpleFooEventHandler<P extends EntityProxy>
       implements EntityProxyChange.Handler<P> {
-    int acquireEventCount = 0;
-    int createEventCount = 0;
+    int persistEventCount = 0;
     int deleteEventCount = 0;
     int totalEventCount = 0;
     int updateEventCount = 0;
@@ -49,8 +48,7 @@
     public void onProxyChange(EntityProxyChange<P> event) {
       totalEventCount++;
       switch (event.getWriteOperation()) {
-        case ACQUIRE: acquireEventCount++; break;
-        case CREATE: createEventCount++; break;
+        case PERSIST: persistEventCount++; break;
         case DELETE: deleteEventCount++; break;
         case UPDATE: updateEventCount++; break;
         default: break;
diff --git a/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java b/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
index b03a01f..18163af 100644
--- a/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
+++ b/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
@@ -84,7 +84,7 @@
         valueStore, requestFactory);
     String json = deltaValueStore.toJson();
     JSONObject jsonObject = (JSONObject) JSONParser.parseLenient(json);
-    assertFalse(jsonObject.containsKey(WriteOperation.CREATE.getUnObfuscatedEnumName()));
+    assertFalse(jsonObject.containsKey(WriteOperation.PERSIST.getUnObfuscatedEnumName()));
   }
 
   public void testCreateUpdate() {
@@ -96,7 +96,7 @@
     deltaValueStore.set(SimpleFooProxyProperties.userName, created, "harry");
     assertTrue(deltaValueStore.isChanged());
     JSONObject changeProxy = testAndGetChangeProxy(deltaValueStore.toJson(),
-        WriteOperation.CREATE);
+        WriteOperation.PERSIST);
     assertEquals("harry", changeProxy.get("userName").isString().stringValue());
   }
 
@@ -112,7 +112,7 @@
     deltaValueStore.set(SimpleFooProxyProperties.userName, created, "harry");
     assertTrue(deltaValueStore.isChanged());
     JSONObject changeProxy = testAndGetChangeProxy(deltaValueStore.toJson(),
-        WriteOperation.CREATE);
+        WriteOperation.PERSIST);
     assertEquals(
         "harry",
         changeProxy.get(SimpleFooProxyProperties.userName.getName()).isString().stringValue());
@@ -157,11 +157,11 @@
     String jsonString = deltaValueStore.toJson();
     JSONObject jsonObject = (JSONObject) JSONParser.parseLenient(jsonString);
     assertFalse(jsonObject.containsKey(WriteOperation.DELETE.getUnObfuscatedEnumName()));
-    assertTrue(jsonObject.containsKey(WriteOperation.CREATE.getUnObfuscatedEnumName()));
+    assertTrue(jsonObject.containsKey(WriteOperation.PERSIST.getUnObfuscatedEnumName()));
     assertTrue(jsonObject.containsKey(WriteOperation.UPDATE.getUnObfuscatedEnumName()));
 
     JSONArray createOperationArray = jsonObject.get(
-        WriteOperation.CREATE.getUnObfuscatedEnumName()).isArray();
+        WriteOperation.PERSIST.getUnObfuscatedEnumName()).isArray();
     assertEquals(1, createOperationArray.size());
     assertEquals(
         "harry",
diff --git a/user/test/com/google/gwt/requestfactory/shared/SimpleBarRequest.java b/user/test/com/google/gwt/requestfactory/shared/SimpleBarRequest.java
index 51d4879..ca7a16a 100644
--- a/user/test/com/google/gwt/requestfactory/shared/SimpleBarRequest.java
+++ b/user/test/com/google/gwt/requestfactory/shared/SimpleBarRequest.java
@@ -16,6 +16,7 @@
 package com.google.gwt.requestfactory.shared;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * Do nothing test interface.
@@ -25,19 +26,19 @@
 
   Request<Long> countSimpleBar();
 
-  ProxyListRequest<SimpleBarProxy> findAll();
+  Request<List<SimpleBarProxy>> findAll();
 
-  ProxySetRequest<SimpleBarProxy> findAsSet();
+  Request<Set<SimpleBarProxy>> findAsSet();
   
-  ProxyRequest<SimpleBarProxy> findSimpleBarById(String id);
+  Request<SimpleBarProxy> findSimpleBarById(String id);
 
   @Instance
   Request<Void> persist(SimpleBarProxy proxy);
 
   @Instance
-  ProxyRequest<SimpleBarProxy> persistAndReturnSelf(SimpleBarProxy proxy);
+  Request<SimpleBarProxy> persistAndReturnSelf(SimpleBarProxy proxy);
 
   Request<Void> reset();
 
-  ProxyRequest<SimpleBarProxy> returnFirst(List<SimpleBarProxy> proxy);
+  Request<SimpleBarProxy> returnFirst(List<SimpleBarProxy> proxy);
 }
diff --git a/user/test/com/google/gwt/uibinder/test/client/HandlerDemo.ui.xml b/user/test/com/google/gwt/uibinder/test/client/HandlerDemo.ui.xml
index 6640802..5c72902 100644
--- a/user/test/com/google/gwt/uibinder/test/client/HandlerDemo.ui.xml
+++ b/user/test/com/google/gwt/uibinder/test/client/HandlerDemo.ui.xml
@@ -1,6 +1,7 @@
 <ui:UiBinder
   xmlns:ui='urn:ui:com.google.gwt.uibinder'
-  xmlns:gwt='urn:import:com.google.gwt.user.client.ui'>
+  xmlns:gwt='urn:import:com.google.gwt.user.client.ui'
+  xmlns:test="urn:import:com.google.gwt.uibinder.test.client">
 
   <gwt:FlowPanel>
     <gwt:Button ui:field="buttonClick" text="ClickEvent test for Button"/>
@@ -14,6 +15,13 @@
 
     <gwt:Label text="ValueChangeEvent test" />
     <gwt:TextBox ui:field="textBoxValueChange"/>
+
+    <gwt:Tree ui:field="tree" />
+
+    <test:CustomEventWidget ui:field="customEventWidget">
+      Click to test UiBinder custom events.
+    </test:CustomEventWidget>
+
   </gwt:FlowPanel>
 
 </ui:UiBinder>
