diff --git a/dev/build.xml b/dev/build.xml
index cfc3b0c..75af45b 100755
--- a/dev/build.xml
+++ b/dev/build.xml
@@ -54,7 +54,6 @@
           <include name="apache/ant-1.6.5.jar" />
           <include name="eclipse/jdt-3.4.2.jar" />
           <include name="jetty/jetty-6.1.11.jar" />
-          <include name="icu4j/icu4j-4_4_1.jar" />
           <include name="protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
           <include name="tomcat/ant-launcher-1.6.5.jar" />
           <include name="tomcat/catalina-1.0.jar" />
@@ -111,7 +110,6 @@
           <zipfileset src="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
           <zipfileset src="${gwt.tools.lib}/eclipse/jdt-3.4.2.jar" />
           <zipfileset src="${gwt.tools.lib}/jetty/jetty-6.1.11.jar" />
-          <zipfileset src="${gwt.tools.lib}/icu4j/icu4j-4_4_1.jar" />
           <zipfileset src="${gwt.tools.lib}/protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
           <zipfileset src="${gwt.tools.lib}/tomcat/ant-launcher-1.6.5.jar" />
           <zipfileset src="${gwt.tools.lib}/tomcat/catalina-1.0.jar" />
diff --git a/eclipse/tools/datetimefmtcreator/.classpath b/eclipse/tools/datetimefmtcreator/.classpath
deleted file mode 100644
index b4f7397..0000000
--- a/eclipse/tools/datetimefmtcreator/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="core/src"/>
-	<classpathentry kind="src" path="core/test"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/gwt-user"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/icu4j-4_4_1.jar"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/tools/datetimefmtcreator/.project b/eclipse/tools/datetimefmtcreator/.project
deleted file mode 100644
index f81421f..0000000
--- a/eclipse/tools/datetimefmtcreator/.project
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>gwt-dtfc</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-	<linkedResources>
-		<link>
-			<name>core</name>
-			<type>2</type>
-			<locationURI>GWT_ROOT/tools/datetimefmtcreator</locationURI>
-		</link>
-	</linkedResources>
-</projectDescription>
diff --git a/eclipse/user/.classpath b/eclipse/user/.classpath
index 88d98c8..0765257 100644
--- a/eclipse/user/.classpath
+++ b/eclipse/user/.classpath
@@ -16,7 +16,6 @@
 	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-logging-1.0.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/apache/commons/commons-io-1.4.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/cssparser/cssparser-0.9.5.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/icu4j-4_4_1.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/nekohtml/nekohtml-1.9.13.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/selenium/selenium-java-client-driver.jar" sourcepath="/GWT_TOOLS/lib/selenium/selenium-java-client-driver-sources.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/xalan/xalan-2.7.1.jar"/>
diff --git a/tools/api-checker/config/gwt20_21userApi.conf b/tools/api-checker/config/gwt20_21userApi.conf
index e7e9d63..43801d2 100644
--- a/tools/api-checker/config/gwt20_21userApi.conf
+++ b/tools/api-checker/config/gwt20_21userApi.conf
@@ -110,7 +110,7 @@
 # Removing HTTPRequest.
 com.google.gwt.user.client.HTTPRequest MISSING
 
-# Change signature for native long from double[2] to LongEmul{l=int,m=int,h=int}
+# Change signature for native long from double[2] to LongEmul{l=int,m=int,h=int} 
 com.google.gwt.lang.LongLib::RUN_IN_JVM MISSING
 com.google.gwt.lang.LongLib::add([D[D) MISSING
 com.google.gwt.lang.LongLib::and([D[D) MISSING
@@ -138,7 +138,3 @@
 com.google.gwt.lang.LongLib::toString([D) MISSING
 com.google.gwt.lang.LongLib::typeChange(J) MISSING
 com.google.gwt.lang.LongLib::xor([D[D) MISSING
-
-# Add DateTimeFormatInfo, PredefinedFormat overrides
-com.google.gwt.i18n.client.DateTimeFormat::DateTimeFormat(Ljava/lang/String;Lcom/google/gwt/i18n/client/constants/DateTimeConstants;) OVERLOADED_METHOD_CALL
-com.google.gwt.i18n.client.DateTimeFormat::getFormat(Ljava/lang/String;) OVERLOADED_METHOD_CALL
diff --git a/tools/datetimefmtcreator/src/com/google/gwt/tools/datetimefmtcreator/DateTimeFormatCreator.java b/tools/datetimefmtcreator/src/com/google/gwt/tools/datetimefmtcreator/DateTimeFormatCreator.java
deleted file mode 100644
index 0315142..0000000
--- a/tools/datetimefmtcreator/src/com/google/gwt/tools/datetimefmtcreator/DateTimeFormatCreator.java
+++ /dev/null
@@ -1,640 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.tools.datetimefmtcreator;
-
-import com.google.gwt.i18n.client.constants.DateTimeConstantsImpl;
-import com.google.gwt.i18n.rebind.LocaleUtils;
-import com.google.gwt.i18n.shared.GwtLocale;
-import com.google.gwt.i18n.shared.GwtLocaleFactory;
-
-import com.ibm.icu.text.DateTimePatternGenerator;
-import com.ibm.icu.util.ULocale;
-
-import org.apache.tapestry.util.text.LocalizedProperties;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.Map.Entry;
-import java.util.regex.Pattern;
-
-/**
- * Generate implementations of DateTimeFormatInfoImpl for all the supported
- * locales.
- */
-public class DateTimeFormatCreator {
-
-  private static class DtfiGenerator {
-    
-    private static void buildPatterns(GwtLocale locale,
-        TreeMap<Key, String[]> properties) {
-      ULocale ulocale = new ULocale(ULocale.canonicalize(locale.getAsString()));
-      DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(
-          ulocale);
-      for (Map.Entry<String, String> entry : patterns.entrySet()) {
-        properties.put(new Key(locale, "format" + entry.getKey()), new String[] {
-              dtpg.getBestPattern(entry.getValue())
-            });
-      }
-    }
-
-    private static GwtLocale findEarliestAncestor(GwtLocale locale,
-        Set<GwtLocale> set) {
-      if (set == null) {
-        return null;
-      }
-      for (GwtLocale search : locale.getInheritanceChain()) {
-        if (set.contains(search)) {
-          return search;
-        }
-      }
-      return null;
-    }
- 
-    private static String quote(String value) {
-      return value.replaceAll("\"", "\\\\\"");
-    }
-
-    private static String[] split(String target) {
-      // We add an artificial end character to avoid the odd split() behavior
-      // that drops the last item if it is only whitespace.
-      target = target + "~";
-
-      // Do not split on escaped commas.
-      String[] args = target.split("(?<![\\\\]),");
-
-      // Now remove the artificial ending we added above.
-      // We have to do it before we escape and trim because otherwise
-      // the artificial trailing '~' would prevent the last item from being
-      // properly trimmed.
-      if (args.length > 0) {
-        int last = args.length - 1;
-        args[last] = args[last].substring(0, args[last].length() - 1);
-      }
-
-      for (int i = 0; i < args.length; i++) {
-        args[i] = args[i].replaceAll("\\\\,", ",").trim();
-      }
-      return args;
-    }
-
-    private File propDir;
-
-    private File src;
-    public DtfiGenerator(File src) {
-      this.src = src;
-      String packageName = DateTimeConstantsImpl.class.getPackage().getName();
-      propDir = new File(src, packageName.replaceAll("\\.", "/"));
-      if (!propDir.exists()) {
-        System.err.println("Can't find directory for " + packageName);
-        return;
-      }
-    }
-
-    public void generate() throws FileNotFoundException,
-        IOException {
-      final Pattern dtcProps = Pattern.compile(
-          "DateTimeConstantsImpl(.*)\\.properties");
-      String[] propFiles = propDir.list(new FilenameFilter() {
-        public boolean accept(File dir, String name) {
-          return dtcProps.matcher(name).matches();
-        }
-      });
-      TreeMap<Key, String[]> properties = new TreeMap<Key, String[]>();
-      GwtLocaleFactory factory = LocaleUtils.getLocaleFactory();
-      collectPropertyData(propFiles, properties, factory);
-      Map<GwtLocale, Set<GwtLocale>> parents = removeInheritedValues(properties);
-      generateSources(properties, parents);
-    }
-
-    private void addLocaleParent(Map<GwtLocale, Set<GwtLocale>> parents,
-        GwtLocale keyLocale, GwtLocale parentLocale) {
-      Set<GwtLocale> parentSet = parents.get(keyLocale);
-      if (parentSet == null) {
-        parentSet = new HashSet<GwtLocale>();
-        parents.put(keyLocale, parentSet);
-      }
-      parentSet.add(parentLocale);
-    }
-
-    @SuppressWarnings("unchecked")
-    private void collectPropertyData(String[] propFiles,
-        TreeMap<Key, String[]> properties, GwtLocaleFactory factory)
-        throws FileNotFoundException, IOException {
-      for (String propFile : propFiles) {
-        if (!propFile.startsWith("DateTimeConstantsImpl")
-            || !propFile.endsWith(".properties")) {
-          continue;
-        }
-        int len = propFile.length();
-        String suffix = propFile.substring(21, len - 11);
-        if (suffix.startsWith("_")) {
-          suffix = suffix.substring(1);
-        }
-        GwtLocale locale = factory.fromString(suffix).getCanonicalForm();
-        File f = new File(propDir, propFile);
-        FileInputStream str = null;
-        try {
-          str = new FileInputStream(f);
-          LocalizedProperties props = new LocalizedProperties();
-          props.load(str);
-          Map<String, String> map = props.getPropertyMap();
-          for (Map.Entry<String, String> entry : map.entrySet()) {
-            String[] value = split(entry.getValue());
-            if ("dateFormats".equals(entry.getKey())
-                || "timeFormats".equals(entry.getKey())
-                || "weekendRange".equals(entry.getKey())) {
-              // split these out into separate fields
-              for (int i = 0; i < value.length; ++i) {
-                Key key = new Key(locale, entry.getKey() + i);
-                properties.put(key, new String[] {value[i]});
-              }
-            } else {
-              Key key = new Key(locale, entry.getKey());
-              properties.put(key, value);
-            }
-          }
-          buildPatterns(locale, properties);
-        } finally {
-          if (str != null) {
-            str.close();
-          }
-        }
-      }
-    }
-
-    private PrintWriter createClassSource(String packageName,
-        String className) throws FileNotFoundException {
-      String path = packageName.replace('.', '/') + "/" + className + ".java";
-      File f = new File(src, path);
-      FileOutputStream ostr = new FileOutputStream(f);
-      PrintWriter out = new PrintWriter(ostr);
-      out.println("/*");
-      out.println(" * Copyright 2010 Google Inc.");
-      out.println(" * ");
-      out.println(" * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not");
-      out.println(" * use this file except in compliance with the License. You may obtain a copy of");
-      out.println(" * the License at");
-      out.println(" * ");
-      out.println(" * http://www.apache.org/licenses/LICENSE-2.0");
-      out.println(" *"); 
-      out.println(" * Unless required by applicable law or agreed to in writing, software");
-      out.println(" * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT");
-      out.println(" * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the");
-      out.println(" * License for the specific language governing permissions and limitations under");
-      out.println(" * the License.");
-      out.println(" */");
-      out.println("package " + packageName + ";");
-      out.println();
-      out.println("// DO NOT EDIT - GENERATED FROM CLDR DATA");
-      out.println();
-      return out;
-    }
-
-    private void generateAlias(GwtLocale locale, GwtLocale parent)
-         throws IOException {
-      System.out.println("Generating alias " + locale);
-      String suffix;
-      if (parent.isDefault()) {
-        suffix = "";
-      } else {
-        suffix = "_" + parent.getAsString();
-      }
-      String packageName = "com.google.gwt.i18n.client.impl.cldr";
-      String className = "DateTimeFormatInfoImpl_" + locale.getAsString();
-      PrintWriter out = null;
-      try {
-        out = createClassSource(packageName, className);
-        out.println("/**");
-        out.println(" * Locale \"" + locale + "\" is an alias for \"" + parent
-            + "\".");
-        out.println(" */");
-        out.println("public class " + className
-            + " extends DateTimeFormatInfoImpl" + suffix + " {");
-        out.println("}");
-      } finally {
-        if (out != null) {
-          out.close();
-        }
-      }
-      
-    }
-
-    private void generateLocale(GwtLocale locale, GwtLocale parent,
-        Map<String, String[]> values) throws IOException {
-      System.out.println("Generating locale " + locale);
-      boolean addOverrides = true;
-      PrintWriter out = null;
-      try {
-        if (locale.isDefault()) {
-          String packageName = "com.google.gwt.i18n.client";
-          String className = "DefaultDateTimeFormatInfo";
-          out = createClassSource(packageName, className);
-          out.println("/**");
-          out.println(" * Default implementation of DateTimeFormatInfo interface, using values from");
-          out.println(" * the CLDR root locale.");
-          out.println(" * <p>");
-          out.println(" * Users who need to create their own DateTimeFormatInfo implementation are");
-          out.println(" * encouraged to extend this class so their implementation won't break when");
-          out.println(" * new methods are added.");
-          out.println(" */");
-          out.println("public class DefaultDateTimeFormatInfo implements DateTimeFormatInfo {");
-          addOverrides = false;
-        } else {
-          String suffix;
-          if (parent.isDefault()) {
-            suffix = "";
-          } else {
-            suffix = "_" + parent.getAsString();
-          }
-          String packageName = "com.google.gwt.i18n.client.impl.cldr";
-          String className = "DateTimeFormatInfoImpl_" + locale.getAsString();
-          out = createClassSource(packageName, className);
-          out.println("/**");
-          out.println(" * Implementation of DateTimeFormatInfo for locale \""
-              + locale + "\".");
-          out.println(" */");
-          out.println("public class " + className
-              + " extends DateTimeFormatInfoImpl" + suffix + " {");
-        }
-        Set<String> keySet = values.keySet();
-        String[] keys = keySet.toArray(new String[keySet.size()]);
-        Arrays.sort(keys, new Comparator<String>() {
-          public int compare(String a, String b) {
-            String mappedA = a;
-            String mappedB = b;
-            FieldMapping field = fieldMap.get(a);
-            if (field != null) {
-              mappedA = field.methodName;
-            }
-            field = fieldMap.get(b);
-            if (field != null) {
-              mappedB = field.methodName;
-            }
-            return mappedA.compareTo(mappedB);
-          }
-        });
-        for (String key : keys) {
-          String[] value = values.get(key);
-          FieldMapping mapping = fieldMap.get(key);
-          Class<?> type = value.length > 1 ? String[].class : String.class;
-          String related = null;
-          String name = key;
-          if (mapping != null) {
-            name = mapping.methodName;
-            type = mapping.type;
-            related = mapping.related;
-          }
-          String[] relatedValue = values.get(related);
-          String relayMethod = null;
-          if (Arrays.equals(value, relatedValue)) {
-            relayMethod = fieldMap.get(related).methodName;
-          }
-          out.println();
-          if (addOverrides) {
-            out.println("  @Override");
-          }
-          out.println("  public " + type.getSimpleName() + " " + name
-              + "() {");
-          out.print("    return ");
-          if (relayMethod != null) {
-            out.println(relayMethod + "();");
-          } else {
-            if (type.isArray()) {
-              out.println("new " + type.getSimpleName() + " { ");
-              out.print("        ");
-            }
-            boolean first = true;
-            for (String oneValue : value) {
-              if (!first) {
-                out.println(",");
-                out.print("        ");
-              }
-              if (type == int.class || type == int[].class) {
-                out.print(Integer.valueOf(oneValue) - 1);
-              } else {
-                out.print("\"" + quote(oneValue) + "\"");
-              }
-              first = false;
-            }
-            if (type.isArray()) {
-              out.println();
-              out.println("    };");
-            } else {
-              out.println(";");
-            }
-          }
-          out.println("  }");
-        }
-        if (locale.isDefault()) {
-          // TODO(jat): actually generate these from CLDR data
-          out.println();
-          out.println("  public String dateFormat() {");
-          out.println("    return dateFormatMedium();");
-          out.println("  }");
-          out.println();
-          out.println("  public String dateTime(String timePattern, String datePattern) {");
-          out.println("    return datePattern + \" \" + timePattern;");
-          out.println("  }");
-          out.println();
-          out.println("  public String dateTimeFull(String timePattern, String datePattern) {");
-          out.println("    return dateTime(timePattern, datePattern);");
-          out.println("  }");
-          out.println();
-          out.println("  public String dateTimeLong(String timePattern, String datePattern) {");
-          out.println("    return dateTime(timePattern, datePattern);");
-          out.println("  }");
-          out.println();
-          out.println("  public String dateTimeMedium(String timePattern, String datePattern) {");
-          out.println("    return dateTime(timePattern, datePattern);");
-          out.println("  }");
-          out.println();
-          out.println("  public String dateTimeShort(String timePattern, String datePattern) {");
-          out.println("    return dateTime(timePattern, datePattern);");
-          out.println("  }");
-          out.println();
-          out.println("  public String timeFormat() {");
-          out.println("    return timeFormatMedium();");
-          out.println("  }");
-        }
-        out.println("}");
-      } finally {
-        if (out != null) {
-          out.close();
-        }
-      }
-    }
-
-   private void generateSources(TreeMap<Key, String[]> properties,
-      Map<GwtLocale, Set<GwtLocale>> parents) throws IOException {
-    Set<GwtLocale> locales = new HashSet<GwtLocale>();
-    // process sorted locales/keys, generating each locale on change
-    GwtLocale lastLocale = null;
-    Map<String, String[]> thisLocale = new HashMap<String, String[]>();
-    for (Entry<Key, String[]> entry : properties.entrySet()) {
-      if (lastLocale != null && lastLocale != entry.getKey().locale) {
-        GwtLocale parent = findEarliestAncestor(lastLocale,
-            parents.get(lastLocale));
-        generateLocale(lastLocale, parent, thisLocale);
-        thisLocale.clear();
-        lastLocale = null;
-      }
-      if (lastLocale == null) {
-        lastLocale = entry.getKey().locale;
-        locales.add(lastLocale);
-      }
-      thisLocale.put(entry.getKey().key, entry.getValue());
-    }
-    if (lastLocale != null) {
-      GwtLocale parent = findEarliestAncestor(lastLocale,
-          parents.get(lastLocale));
-      generateLocale(lastLocale, parent, thisLocale);
-    }
-    Set<GwtLocale> seen = new HashSet<GwtLocale>(locales);
-    for (GwtLocale locale : locales) {
-      for (GwtLocale alias : locale.getAliases()) {
-        if (!seen.contains(alias)) {
-          seen.add(alias);
-//          generateAlias(alias, locale);
-        }
-      }
-    }
-  }
-
- /**
-     * Check if a given entry within a locale is inherited from a parent.
-     * 
-     * @param properties
-     * @param parents
-     * @param key
-     * @param value
-     * @return true if the value is the same as the first parent defining that
-     *     value
-     */
-    private boolean isInherited(TreeMap<Key, String[]> properties,
-        Map<GwtLocale, Set<GwtLocale>> parents, Key key, String[] value) {
-      GwtLocale keyLocale = key.locale;
-      if (keyLocale.isDefault()) {
-        // never delete entries from default
-        return false;
-      }
-      List<GwtLocale> list = keyLocale.getInheritanceChain();
-      String[] parent = null;
-      for (int i = 1; i < list.size(); ++i) {
-        Key parentKey = new Key(list.get(i), key.key);
-        parent = properties.get(parentKey);
-        if (parent != null) {
-          GwtLocale parentLocale = parentKey.locale;
-          addLocaleParent(parents, keyLocale, parentLocale);
-          break;
-        }
-      }
-      return Arrays.equals(value, parent);
-    }
-
-    /**
-     * Remove inherited values and return a map of inherited-from locales for
-     * each locale.
-     * 
-     * @param properties
-     * @return inheritance map
-     */
-    private Map<GwtLocale, Set<GwtLocale>> removeInheritedValues(
-        TreeMap<Key, String[]> properties) {
-      // remove entries identical to a parent locale
-      Map<GwtLocale, Set<GwtLocale>> parents = new HashMap<GwtLocale, Set<GwtLocale>>();
-      Set<Entry<Key, String[]>> entrySet = properties.entrySet();
-      Iterator<Entry<Key, String[]>> it = entrySet.iterator();
-      while (it.hasNext()) {
-        Entry<Key, String[]> entry = it.next();
-        if (isInherited(properties, parents, entry.getKey(),
-            entry.getValue())) {
-          it.remove();
-        }
-      }
-      return parents;
-    }
-  }
-
-  private static class FieldMapping {
-    public final String methodName;
-    public final Class<?> type;
-    public final String related;
-
-    public FieldMapping(String methodName, Class<?> type) {
-      this(methodName, type, null);
-    }
-
-    public FieldMapping(String methodName, Class<?> type, String related) {
-      this.methodName = methodName;
-      this.type = type;
-      this.related = related;
-    }
-  }
-
-  private static class Key implements Comparable<Key> {
-    public final GwtLocale locale;
-    public final String key;
-
-    public Key(GwtLocale locale, String key) {
-      this.locale = locale;
-      this.key = key;
-    }
-
-    public int compareTo(Key other) {
-      int c = locale.compareTo(other.locale);
-      if (c == 0) {
-        c = key.compareTo(other.key);
-      }
-      return c;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (this == obj) {
-        return true;
-      }
-      if (obj == null || getClass() != obj.getClass()) {
-        return false;
-      }
-      Key other = (Key) obj;
-      return locale.equals(other.locale) && key.equals(other.key);
-    }
-
-    @Override
-    public int hashCode() {
-      return locale.hashCode() * 31 + key.hashCode();
-    }
-
-    @Override
-    public String toString() {
-      return locale.toString() + "/" + key;
-    }
-  }
-
-  private static final Map<String, FieldMapping> fieldMap = new HashMap<String, FieldMapping>();
-
-  private static Map<String, String> patterns = new HashMap<String, String>();
-
-  static {
-    fieldMap.put("ampms", new FieldMapping("ampms", String[].class));
-    fieldMap.put("dateFormats0", new FieldMapping("dateFormatFull",
-        String.class));
-    fieldMap.put("dateFormats1", new FieldMapping("dateFormatLong",
-        String.class));
-    fieldMap.put("dateFormats2", new FieldMapping("dateFormatMedium",
-        String.class));
-    fieldMap.put("dateFormats3", new FieldMapping("dateFormatShort",
-        String.class));
-    fieldMap.put("timeFormats0", new FieldMapping("timeFormatFull",
-        String.class));
-    fieldMap.put("timeFormats1", new FieldMapping("timeFormatLong",
-        String.class));
-    fieldMap.put("timeFormats2", new FieldMapping("timeFormatMedium",
-        String.class));
-    fieldMap.put("timeFormats3", new FieldMapping("timeFormatShort",
-        String.class));
-    fieldMap.put("eraNames", new FieldMapping("erasFull", String[].class));
-    fieldMap.put("eras", new FieldMapping("erasShort", String[].class));
-    fieldMap.put("quarters", new FieldMapping("quartersFull", String[].class));
-    fieldMap.put("shortQuarters", new FieldMapping("quartersShort",
-        String[].class));
-    fieldMap.put("firstDayOfTheWeek", new FieldMapping("firstDayOfTheWeek",
-        Integer.class));
-    fieldMap.put("months", new FieldMapping("monthsFull", String[].class));
-    fieldMap.put("standaloneMonths", new FieldMapping("monthsFullStandalone",
-        String[].class, "months"));
-    fieldMap.put("narrowMonths", new FieldMapping("monthsNarrow",
-        String[].class));
-    fieldMap.put("standaloneNarrowMonths", new FieldMapping(
-        "monthsNarrowStandalone", String[].class, "narrowMonths"));
-    fieldMap.put("shortMonths", new FieldMapping("monthsShort",
-        String[].class));
-    fieldMap.put("standaloneShortMonths", new FieldMapping(
-        "monthsShortStandalone", String[].class, "shortMonths"));
-    fieldMap.put("weekendRange0", new FieldMapping("weekendStart", int.class));
-    fieldMap.put("weekendRange1", new FieldMapping("weekendEnd", int.class));
-    fieldMap.put("firstDayOfTheWeek", new FieldMapping("firstDayOfTheWeek",
-        int.class));
-    fieldMap.put("weekdays", new FieldMapping("weekdaysFull", String[].class));
-    fieldMap.put("standaloneWeekdays", new FieldMapping(
-        "weekdaysFullStandalone", String[].class, "weekdays"));
-    fieldMap.put("shortWeekdays", new FieldMapping("weekdaysShort",
-        String[].class));
-    fieldMap.put("standaloneShortWeekdays", new FieldMapping(
-        "weekdaysShortStandalone", String[].class, "shortWeekdays"));
-    fieldMap.put("narrowWeekdays", new FieldMapping("weekdaysNarrow",
-        String[].class));
-    fieldMap.put("standaloneNarrowWeekdays", new FieldMapping(
-        "weekdaysNarrowStandalone", String[].class, "narrowWeekdays"));
-    
-    // patterns to use with DateTimePatternGenerator
-    patterns.put("Day", "d");
-    patterns.put("Hour12Minute", "hmm");
-    patterns.put("Hour12MinuteSecond", "hmmss");
-    patterns.put("Hour24Minute", "Hmm");
-    patterns.put("Hour24MinuteSecond", "Hmmss");
-    patterns.put("MinuteSecond", "mss");
-    patterns.put("MonthAbbrev", "MMM");
-    patterns.put("MonthAbbrevDay", "MMMd");
-    patterns.put("MonthFull", "MMMM");
-    patterns.put("MonthFullDay", "MMMMd");
-    patterns.put("MonthFullWeekdayDay", "MMMMEEEEd");
-    patterns.put("MonthNumDay", "Md");
-    patterns.put("Year", "y");
-    patterns.put("YearMonthAbbrev", "yMMM");
-    patterns.put("YearMonthAbbrevDay", "yMMMd");
-    patterns.put("YearMonthFull", "yMMMM");
-    patterns.put("YearMonthFullDay", "yMMMMd");
-    patterns.put("YearMonthNum", "yM");
-    patterns.put("YearMonthNumDay", "yMd");
-    patterns.put("YearMonthWeekdayDay", "yMMMEEEd");
-    patterns.put("YearQuarterFull", "yQQQQ");
-    patterns.put("YearQuarterShort", "yQ");
-  }
-
-  /**
-   * @param args
-   * @throws IOException
-   */
-  public static void main(String[] args) throws IOException {
-    if (args.length != 1) {
-      System.err.println("Usage: "
-          + DateTimeFormatCreator.class.getSimpleName() + " gwt-root-dir");
-      return;
-    }
-    File gwt = new File(args[0]);
-    File src = new File(gwt, "user/src");
-    if (!gwt.exists() || !src.exists()) {
-      System.err.println(args[0] + " doesn't appear to be a GWT root directory");
-      return;
-    }
-    new DtfiGenerator(src).generate();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/I18N.gwt.xml b/user/src/com/google/gwt/i18n/I18N.gwt.xml
index 23d1c29..3f0fa0b 100644
--- a/user/src/com/google/gwt/i18n/I18N.gwt.xml
+++ b/user/src/com/google/gwt/i18n/I18N.gwt.xml
@@ -86,9 +86,6 @@
   <generate-with class="com.google.gwt.i18n.rebind.CurrencyListGenerator">
     <when-type-is class="com.google.gwt.i18n.client.CurrencyList" />
   </generate-with>
-  <generate-with class="com.google.gwt.i18n.rebind.CustomDateTimeFormatGenerator">
-    <when-type-assignable class="com.google.gwt.i18n.client.CustomDateTimeFormat" />
-  </generate-with>
   
   <!--
       Set of locales to be selectable at runtime.  Only those which extend
diff --git a/user/src/com/google/gwt/i18n/client/CustomDateTimeFormat.java b/user/src/com/google/gwt/i18n/client/CustomDateTimeFormat.java
deleted file mode 100644
index e204561..0000000
--- a/user/src/com/google/gwt/i18n/client/CustomDateTimeFormat.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client;
-
-/**
- * Create a custom localized date/time format at compile time. All methods on
- * subtypes of this interface must take no parameters and return DateTimeFormat
- * (which will be an initialized instance).
- */
-public interface CustomDateTimeFormat {
-
-  /**
-   * Annotation containing the pattern skeleton.
-   * 
-   * <p>The order of pattern characters and any literals don't matter, just
-   * which pattern characters are present and their counts.
-   */
-  public @interface Pattern {
-
-    /**
-     * The pattern skeleton for which to generate a localized pattern.  Note
-     * that the order of pattern characters don't matter, as the generated
-     * pattern will be derived from a localized pattern that conveys the same
-     * information.
-     * 
-     * @return the pattern skeleton
-     */
-    String value();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/DateTimeConstantsAdapter.java b/user/src/com/google/gwt/i18n/client/DateTimeConstantsAdapter.java
deleted file mode 100644
index e850237..0000000
--- a/user/src/com/google/gwt/i18n/client/DateTimeConstantsAdapter.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client;
-
-import com.google.gwt.i18n.client.constants.DateTimeConstants;
-
-/**
- * Adapter that makes a {@link com.google.gwt.i18n.client.DateTimeFormatInfo}
- * implementation suitable for use with something that wants a
- * {@link DateTimeConstants}.
- */
-@SuppressWarnings("deprecation")
-class DateTimeConstantsAdapter implements DateTimeConstants {
-
-  private final DateTimeFormatInfo dtfi;
-  
-  public DateTimeConstantsAdapter(DateTimeFormatInfo dtfi) {
-    this.dtfi = dtfi;
-  }
-
-  public String[] ampms() {
-    return dtfi.ampms();
-  }
-
-  public String[] dateFormats() {
-    return new String[] {
-        dtfi.dateFormatFull(), dtfi.dateFormatLong(), dtfi.dateFormatMedium(),
-        dtfi.dateFormatShort(),
-    };
-  }
-
-  public String[] eraNames() {
-    return dtfi.erasFull();
-  }
-
-  public String[] eras() {
-    return dtfi.erasShort();
-  }
-
-  public String firstDayOfTheWeek() {
-    return String.valueOf(dtfi.firstDayOfTheWeek() + 1);
-  }
-
-  public String[] months() {
-    return dtfi.monthsFull();
-  }
-
-  public String[] narrowMonths() {
-    return dtfi.monthsNarrow();
-  }
-
-  public String[] narrowWeekdays() {
-    return dtfi.weekdaysNarrow();
-  }
-
-  public String[] quarters() {
-    return dtfi.quartersFull();
-  }
-
-  public String[] shortMonths() {
-    return dtfi.monthsShort();
-  }
-
-  public String[] shortQuarters() {
-    return dtfi.quartersShort();
-  }
-
-  public String[] shortWeekdays() {
-    return dtfi.weekdaysShort();
-  }
-
-  public String[] standaloneMonths() {
-    return dtfi.monthsFullStandalone();
-  }
-
-  public String[] standaloneNarrowMonths() {
-    return dtfi.monthsNarrowStandalone();
-  }
-
-  public String[] standaloneNarrowWeekdays() {
-    return dtfi.weekdaysNarrowStandalone();
-  }
-
-  public String[] standaloneShortMonths() {
-    return dtfi.monthsShortStandalone();
-  }
-
-  public String[] standaloneShortWeekdays() {
-    return dtfi.weekdaysShortStandalone();
-  }
-
-  public String[] standaloneWeekdays() {
-    return dtfi.weekdaysFullStandalone();
-  }
-
-  public String[] timeFormats() {
-    return new String[] {
-        dtfi.timeFormatFull(), dtfi.timeFormatLong(), dtfi.timeFormatMedium(),
-        dtfi.dateFormatShort(),
-    };
-  }
-
-  public String[] weekdays() {
-    return dtfi.weekdaysFull();
-  }
-
-  public String[] weekendRange() {
-    return new String[] {
-        String.valueOf(dtfi.weekendStart() + 1),
-        String.valueOf(dtfi.weekendEnd() + 1),
-    };
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/DateTimeFormat.java b/user/src/com/google/gwt/i18n/client/DateTimeFormat.java
index fa1032a..b8a3202 100644
--- a/user/src/com/google/gwt/i18n/client/DateTimeFormat.java
+++ b/user/src/com/google/gwt/i18n/client/DateTimeFormat.java
@@ -18,12 +18,9 @@
 
 import com.google.gwt.i18n.client.constants.DateTimeConstants;
 import com.google.gwt.i18n.client.impl.DateRecord;
-import com.google.gwt.i18n.client.impl.cldr.DateTimeFormatInfoImpl_en;
 
 import java.util.ArrayList;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * Formats and parses dates and times using locale-sensitive patterns.
@@ -247,16 +244,11 @@
  * <td>UTC-7</td>
  * </tr>
  * <tr>
- * <td>Z, ZZ</td>
+ * <td>Z, ZZ, ZZZ</td>
  * <td>-0700</td>
  * <td>-0700</td>
  * </tr>
  * <tr>
- * <td>ZZZ</td>
- * <td>-07:00</td>
- * <td>-07:00</td>
- * </tr>
- * <tr>
  * <td>ZZZZ</td>
  * <td>GMT-07:00</td>
  * <td>GMT-07:00</td>
@@ -389,67 +381,6 @@
  */
 @SuppressWarnings("deprecation")
 public class DateTimeFormat {
-
-  /**
-   * Predefined date/time formats -- see {@link CustomDateTimeFormat} if you
-   * need some format that isn't supplied here.
-   */
-  public enum PredefinedFormat {
-    // TODO(jat): Javadoc to explain these formats
-
-    /**
-     * ISO 8601 date format, fixed across all locales.
-     * <p>Example: {@code 2008-10-03T10:29:40.046-04:00}
-     * <p>http://code.google.com/p/google-web-toolkit/issues/detail?id=3068
-     * <p>http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm
-     */
-    ISO_8601,
-
-    /**
-     * RFC 2822 date format, fixed across all locales.
-     * <p>Example: {@code Thu, 20 May 2010 17:54:50 -0700}
-     * <p>http://tools.ietf.org/html/rfc2822#section-3.3
-     */
-    RFC_2822,
-
-    DATE_FULL,
-    DATE_LONG,
-    DATE_MEDIUM,
-    DATE_SHORT,
-
-    TIME_FULL,
-    TIME_LONG,
-    TIME_MEDIUM,
-    TIME_SHORT,
-
-    DATE_TIME_FULL,
-    DATE_TIME_LONG,
-    DATE_TIME_MEDIUM,
-    DATE_TIME_SHORT,
-
-    DAY,
-    HOUR_MINUTE,
-    HOUR_MINUTE_SECOND,
-    HOUR24_MINUTE,
-    HOUR24_MINUTE_SECOND,
-    MINUTE_SECOND,
-    MONTH,
-    MONTH_ABBR,
-    MONTH_ABBR_DAY,
-    MONTH_DAY,
-    MONTH_NUM_DAY,
-    MONTH_WEEKDAY_DAY,
-    YEAR,
-    YEAR_MONTH,
-    YEAR_MONTH_ABBR,
-    YEAR_MONTH_ABBR_DAY,
-    YEAR_MONTH_DAY,
-    YEAR_MONTH_NUM,
-    YEAR_MONTH_NUM_DAY,
-    YEAR_QUARTER,
-    YEAR_QUARTER_ABBR,
-  }
-
   /**
    * Class PatternPart holds a "compiled" pattern part.
    */
@@ -465,13 +396,34 @@
     }
   }
 
+  private static final int FULL_DATE_FORMAT = 0;
+  private static final int LONG_DATE_FORMAT = 1;
+  private static final int MEDIUM_DATE_FORMAT = 2;
+  private static final int SHORT_DATE_FORMAT = 3;
+  private static final int FULL_TIME_FORMAT = 0;
+  private static final int LONG_TIME_FORMAT = 1;
+  private static final int MEDIUM_TIME_FORMAT = 2;
+
+  private static final int SHORT_TIME_FORMAT = 3;
   private static final int NUMBER_BASE = 10;
   private static final int JS_START_YEAR = 1900;
 
-  private static final Map<String, DateTimeFormat> cache;
+  private static DateTimeFormat cachedFullDateFormat;
+  private static DateTimeFormat cachedLongDateFormat;
+  private static DateTimeFormat cachedMediumDateFormat;
+
+  private static DateTimeFormat cachedShortDateFormat;
+  private static DateTimeFormat cachedFullTimeFormat;
+  private static DateTimeFormat cachedLongTimeFormat;
+  private static DateTimeFormat cachedMediumTimeFormat;
+
+  private static DateTimeFormat cachedShortTimeFormat;
+  private static DateTimeFormat cachedFullDateTimeFormat;
+  private static DateTimeFormat cachedLongDateTimeFormat;
+  private static DateTimeFormat cachedMediumDateTimeFormat;
+  private static DateTimeFormat cachedShortDateTimeFormat;
 
   private static final int NUM_MILLISECONDS_IN_DAY = 24 * 60 * 60000;
-
   private static final String PATTERN_CHARS = "GyMLdkHmsSEcDahKzZv";
 
   // Note: M & L must be the first two characters
@@ -483,162 +435,12 @@
 
   private static final int MINUTES_PER_HOUR = 60;
 
-  private static final String RFC2822_PATTERN = "EEE, d MMM yyyy HH:mm:ss Z";
-  private static final String ISO8601_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZ";
-
-  static {
-    cache = new HashMap<String, DateTimeFormat>();
-  }
-
-  /**
-   * Get a DateTimeFormat instance for a predefined format.
-   * 
-   * <p>See {@link CustomDateTimeFormat} if you need a localized format that is
-   * not supported here.
-   * 
-   * @param predef {@link PredefinedFormat} describing desired format
-   * @return a DateTimeFormat instance for the specified format
-   */
-  public static DateTimeFormat getFormat(PredefinedFormat predef) {
-    if (usesFixedEnglishStrings(predef)) {
-      String pattern;
-      switch (predef) {
-        case RFC_2822:
-          pattern = RFC2822_PATTERN;
-          break;
-        case ISO_8601:
-          pattern = ISO8601_PATTERN;
-          break;
-        default:
-          throw new IllegalStateException("Unexpected predef type " + predef);
-      }
-      return getFormat(pattern, new DateTimeFormatInfoImpl_en());
-    }
-    DateTimeFormatInfo dtfi = getDefaultDateTimeFormatInfo();
-    String pattern;
-    switch (predef) {
-      case DATE_FULL:
-        pattern = dtfi.dateFormatFull();
-        break;
-      case DATE_LONG:
-        pattern = dtfi.dateFormatLong();
-        break;
-      case DATE_MEDIUM:
-        pattern = dtfi.dateFormatMedium();
-        break;
-      case DATE_SHORT:
-        pattern = dtfi.dateFormatShort();
-        break;
-      case DATE_TIME_FULL:
-        pattern = dtfi.dateTimeFull(dtfi.timeFormatFull(),
-            dtfi.dateFormatFull());
-        break;
-      case DATE_TIME_LONG:
-        pattern = dtfi.dateTimeLong(dtfi.timeFormatLong(),
-            dtfi.dateFormatLong());
-        break;
-      case DATE_TIME_MEDIUM:
-        pattern = dtfi.dateTimeMedium(dtfi.timeFormatMedium(),
-            dtfi.dateFormatMedium());
-        break;
-      case DATE_TIME_SHORT:
-        pattern = dtfi.dateTimeShort(dtfi.timeFormatShort(),
-            dtfi.dateFormatShort());
-        break;
-      case DAY:
-        pattern = dtfi.formatDay();
-        break;
-      case HOUR24_MINUTE:
-        pattern = dtfi.formatHour24Minute();
-        break;
-      case HOUR24_MINUTE_SECOND:
-        pattern = dtfi.formatHour24MinuteSecond();
-        break;
-      case HOUR_MINUTE:
-        pattern = dtfi.formatHour12Minute();
-        break;
-      case HOUR_MINUTE_SECOND:
-        pattern = dtfi.formatHour12MinuteSecond();
-        break;
-      case MINUTE_SECOND:
-        pattern = dtfi.formatMinuteSecond();
-        break;
-      case MONTH:
-        pattern = dtfi.formatMonthFull();
-        break;
-      case MONTH_ABBR:
-        pattern = dtfi.formatMonthAbbrev();
-        break;
-      case MONTH_ABBR_DAY:
-        pattern = dtfi.formatMonthAbbrevDay();
-        break;
-      case MONTH_DAY:
-        pattern = dtfi.formatMonthFullDay();
-        break;
-      case MONTH_NUM_DAY:
-        pattern = dtfi.formatMonthNumDay();
-        break;
-      case MONTH_WEEKDAY_DAY:
-        pattern = dtfi.formatMonthFullWeekdayDay();
-        break;
-      case TIME_FULL:
-        pattern = dtfi.timeFormatFull();
-        break;
-      case TIME_LONG:
-        pattern = dtfi.timeFormatLong();
-        break;
-      case TIME_MEDIUM:
-        pattern = dtfi.timeFormatMedium();
-        break;
-      case TIME_SHORT:
-        pattern = dtfi.timeFormatShort();
-        break;
-      case YEAR:
-        pattern = dtfi.formatYear();
-        break;
-      case YEAR_MONTH:
-        pattern = dtfi.formatYearMonthFull();
-        break;
-      case YEAR_MONTH_ABBR:
-        pattern = dtfi.formatYearMonthAbbrev();
-        break;
-      case YEAR_MONTH_ABBR_DAY:
-        pattern = dtfi.formatYearMonthAbbrevDay();
-        break;
-      case YEAR_MONTH_DAY:
-        pattern = dtfi.formatYearMonthFullDay();
-        break;
-      case YEAR_MONTH_NUM:
-        pattern = dtfi.formatYearMonthNum();
-        break;
-      case YEAR_MONTH_NUM_DAY:
-        pattern = dtfi.formatYearMonthNumDay();
-        break;
-      case YEAR_QUARTER:
-        pattern = dtfi.formatYearQuarterFull();
-        break;
-      case YEAR_QUARTER_ABBR:
-        pattern = dtfi.formatYearQuarterShort();
-        break;
-      default:
-        throw new IllegalArgumentException("Unexpected predefined format "
-            + predef);
-    }
-    return getFormat(pattern, dtfi);
-  }
-
   /**
    * Returns a DateTimeFormat object using the specified pattern. If you need to
    * format or parse repeatedly using the same pattern, it is highly recommended
    * that you cache the returned <code>DateTimeFormat</code> object and reuse it
    * rather than calling this method repeatedly.
    * 
-   * <p>Note that the pattern supplied is used as-is -- for example, if you
-   * supply "MM/dd/yyyy" as the pattern, that is the order you will get the
-   * fields, even in locales where the order is different.  It is recommended to
-   * use {@link #getFormat(PredefinedFormat)} instead -- if you use this method,
-   * you are taking responsibility for localizing the patterns yourself.
-   * 
    * @param pattern string to specify how the date should be formatted
    * 
    * @return a <code>DateTimeFormat</code> object that can be used for format or
@@ -648,149 +450,165 @@
    *           parsed
    */
   public static DateTimeFormat getFormat(String pattern) {
-    return getFormat(pattern, getDefaultDateTimeFormatInfo());
+    return new DateTimeFormat(pattern, getDefaultDateTimeConstants());
   }
 
   /**
    * Retrieve the DateTimeFormat object for full date format. The pattern for
    * this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#DATE_FULL} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getFullDateFormat() {
-    return getFormat(PredefinedFormat.DATE_FULL);
+    if (cachedFullDateFormat == null) {
+      String pattern = getDefaultDateTimeConstants().dateFormats()[FULL_DATE_FORMAT];
+      cachedFullDateFormat = new DateTimeFormat(pattern);
+    }
+    return cachedFullDateFormat;
   }
 
   /**
    * Retrieve the DateTimeFormat object for full date and time format. The
    * pattern for this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#DATE_TIME_FULL} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getFullDateTimeFormat() {
-    return getFormat(PredefinedFormat.DATE_TIME_FULL);
+    if (cachedFullDateTimeFormat == null) {
+      String pattern = getDefaultDateTimeConstants().dateFormats()[FULL_DATE_FORMAT]
+          + " " + getDefaultDateTimeConstants().timeFormats()[FULL_TIME_FORMAT];
+      cachedFullDateTimeFormat = new DateTimeFormat(pattern);
+    }
+    return cachedFullDateTimeFormat;
   }
 
   /**
    * Retrieve the DateTimeFormat object for full time format. The pattern for
    * this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#TIME_FULL} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getFullTimeFormat() {
-    return getFormat(PredefinedFormat.TIME_FULL);
+    if (cachedFullTimeFormat == null) {
+      String pattern = getDefaultDateTimeConstants().timeFormats()[FULL_TIME_FORMAT];
+      cachedFullTimeFormat = new DateTimeFormat(pattern);
+    }
+    return cachedFullTimeFormat;
   }
 
   /**
    * Retrieve the DateTimeFormat object for long date format. The pattern for
    * this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#DATE_LONG} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getLongDateFormat() {
-    return getFormat(PredefinedFormat.DATE_LONG);
+    if (cachedLongDateFormat == null) {
+      String pattern = getDefaultDateTimeConstants().dateFormats()[LONG_DATE_FORMAT];
+      cachedLongDateFormat = new DateTimeFormat(pattern);
+    }
+    return cachedLongDateFormat;
   }
 
   /**
    * Retrieve the DateTimeFormat object for long date and time format. The
    * pattern for this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#DATE_TIME_LONG} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getLongDateTimeFormat() {
-    return getFormat(PredefinedFormat.DATE_TIME_LONG);
+    if (cachedLongDateTimeFormat == null) {
+      String pattern = getDefaultDateTimeConstants().dateFormats()[LONG_DATE_FORMAT]
+          + " " + getDefaultDateTimeConstants().timeFormats()[LONG_TIME_FORMAT];
+      cachedLongDateTimeFormat = new DateTimeFormat(pattern);
+    }
+    return cachedLongDateTimeFormat;
   }
 
   /**
    * Retrieve the DateTimeFormat object for long time format. The pattern for
    * this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#TIME_LONG} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getLongTimeFormat() {
-    return getFormat(PredefinedFormat.TIME_LONG);
+    if (cachedLongTimeFormat == null) {
+      String pattern = getDefaultDateTimeConstants().timeFormats()[LONG_TIME_FORMAT];
+      cachedLongTimeFormat = new DateTimeFormat(pattern);
+    }
+    return cachedLongTimeFormat;
   }
 
   /**
    * Retrieve the DateTimeFormat object for medium date format. The pattern for
    * this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#DATE_MEDIUM} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getMediumDateFormat() {
-    return getFormat(PredefinedFormat.DATE_MEDIUM);
+    if (cachedMediumDateFormat == null) {
+      String pattern = getDefaultDateTimeConstants().dateFormats()[MEDIUM_DATE_FORMAT];
+      cachedMediumDateFormat = new DateTimeFormat(pattern);
+    }
+    return cachedMediumDateFormat;
   }
 
   /**
    * Retrieve the DateTimeFormat object for medium date and time format. The
    * pattern for this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   *     {@link PredefinedFormat#DATE_TIME_MEDIUM} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getMediumDateTimeFormat() {
-    return getFormat(PredefinedFormat.DATE_TIME_MEDIUM);
+    if (cachedMediumDateTimeFormat == null) {
+      String pattern = getDefaultDateTimeConstants().dateFormats()[MEDIUM_DATE_FORMAT]
+          + " " + getDefaultDateTimeConstants().timeFormats()[MEDIUM_TIME_FORMAT];
+      cachedMediumDateTimeFormat = new DateTimeFormat(pattern);
+    }
+    return cachedMediumDateTimeFormat;
   }
 
   /**
    * Retrieve the DateTimeFormat object for medium time format. The pattern for
    * this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#TIME_MEDIUM} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getMediumTimeFormat() {
-    return getFormat(PredefinedFormat.TIME_MEDIUM);
+    if (cachedMediumTimeFormat == null) {
+      String pattern = getDefaultDateTimeConstants().timeFormats()[MEDIUM_TIME_FORMAT];
+      cachedMediumTimeFormat = new DateTimeFormat(pattern);
+    }
+    return cachedMediumTimeFormat;
   }
 
   /**
    * Retrieve the DateTimeFormat object for short date format. The pattern for
    * this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#DATE_SHORT} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getShortDateFormat() {
-    return getFormat(PredefinedFormat.DATE_SHORT);
+    if (cachedShortDateFormat == null) {
+      String pattern = getDefaultDateTimeConstants().dateFormats()[SHORT_DATE_FORMAT];
+      cachedShortDateFormat = new DateTimeFormat(pattern);
+    }
+    return cachedShortDateFormat;
   }
 
   /**
    * Retrieve the DateTimeFormat object for short date and time format. The
    * pattern for this format is predefined for each locale.
    * 
-   * @return A DateTimeFormat object
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#DATE_TIME_SHORT} instead
+   * @return A DateTimeFormat object.
    */
-  @Deprecated
   public static DateTimeFormat getShortDateTimeFormat() {
-    return getFormat(PredefinedFormat.DATE_TIME_SHORT);
+    if (cachedShortDateTimeFormat == null) {
+      String pattern = getDefaultDateTimeConstants().dateFormats()[SHORT_DATE_FORMAT]
+          + " " + getDefaultDateTimeConstants().timeFormats()[SHORT_TIME_FORMAT];
+      cachedShortDateTimeFormat = new DateTimeFormat(pattern);
+    }
+    return cachedShortDateTimeFormat;
   }
 
   /**
@@ -798,63 +616,22 @@
    * this format is predefined for each locale.
    * 
    * @return A DateTimeFormat object.
-   * @deprecated use {@link #getFormat(PredefinedFormat)} with
-   *     {@link PredefinedFormat#TIME_SHORT} instead
    */
-  @Deprecated
   public static DateTimeFormat getShortTimeFormat() {
-    return getFormat(PredefinedFormat.TIME_SHORT);
+    if (cachedShortTimeFormat == null) {
+      String pattern = getDefaultDateTimeConstants().timeFormats()[SHORT_TIME_FORMAT];
+      cachedShortTimeFormat = new DateTimeFormat(pattern);
+    }
+    return cachedShortTimeFormat;
   }
 
-  /**
-   * Internal factory method that provides caching.
-   * 
-   * @param pattern
-   * @param dtfi
-   * @return DateTimeFormat instance
-   */
-  protected static DateTimeFormat getFormat(String pattern,
-      DateTimeFormatInfo dtfi) {
-    DateTimeFormatInfo defaultDtfi = getDefaultDateTimeFormatInfo();
-    DateTimeFormat dtf = null;
-    if (dtfi == defaultDtfi) {
-      dtf = cache.get(pattern);
-    }
-    if (dtf == null) {
-      dtf = new DateTimeFormat(pattern, dtfi);
-      if (dtfi == defaultDtfi) {
-        cache.put(pattern, dtf);
-      }
-    }
-    return dtf;
-  }
-
-  private static DateTimeFormatInfo getDefaultDateTimeFormatInfo() {
-    return LocaleInfo.getCurrentLocale().getDateTimeFormatInfo();
-  }
-
-  /**
-   * Returns true if the predefined format is one that specifies always using
-   * English names/separators.
-   * <p>This should be a method on PredefinedFormat, but that would defeat the
-   * enum optimizations GWT is currently capable of.
-   * @param predef
-   * @return true if the specified format requires English names/separators
-   */
-  private static boolean usesFixedEnglishStrings(PredefinedFormat predef) {
-    switch (predef) {
-      case RFC_2822:
-        return true;
-      case ISO_8601:
-        return true;
-      default:
-        return false;
-    }
+  private static DateTimeConstants getDefaultDateTimeConstants() {
+    return LocaleInfo.getCurrentLocale().getDateTimeConstants();
   }
 
   private final ArrayList<PatternPart> patternParts = new ArrayList<PatternPart>();
 
-  private final DateTimeFormatInfo dateTimeFormatInfo;
+  private final DateTimeConstants dateTimeConstants;
 
   private final String pattern;
 
@@ -865,7 +642,7 @@
    * @param pattern string pattern specification
    */
   protected DateTimeFormat(String pattern) {
-    this(pattern, getDefaultDateTimeFormatInfo());
+    this(pattern, getDefaultDateTimeConstants());
   }
 
   /**
@@ -874,23 +651,10 @@
    * 
    * @param pattern string pattern specification
    * @param dateTimeConstants locale specific symbol collection
-   * @deprecated use {@link #DateTimeFormat(String, DateTimeFormatInfo)}
    */
-  @Deprecated
   protected DateTimeFormat(String pattern, DateTimeConstants dateTimeConstants) {
-    this(pattern, new DateTimeFormatInfoAdapter(dateTimeConstants));
-  }
-
-  /**
-   * Constructs a format object using the specified pattern and user-supplied
-   * date time constants.
-   * 
-   * @param pattern string pattern specification
-   * @param dtfi DateTimeFormatInfo instance to use
-   */
-  protected DateTimeFormat(String pattern, DateTimeFormatInfo dtfi) {
     this.pattern = pattern;
-    this.dateTimeFormatInfo = dtfi;
+    this.dateTimeConstants = dateTimeConstants;
 
     /*
      * Even though the pattern is only compiled for use in parsing and parsing
@@ -1176,9 +940,9 @@
    */
   private void formatAmPm(StringBuffer buf, Date date) {
     if (date.getHours() >= 12 && date.getHours() < 24) {
-      buf.append(dateTimeFormatInfo.ampms()[1]);
+      buf.append(dateTimeConstants.ampms()[1]);
     } else {
-      buf.append(dateTimeFormatInfo.ampms()[0]);
+      buf.append(dateTimeConstants.ampms()[0]);
     }
   }
 
@@ -1206,11 +970,11 @@
   private void formatDayOfWeek(StringBuffer buf, int count, Date date) {
     int value = date.getDay();
     if (count == 5) {
-      buf.append(dateTimeFormatInfo.weekdaysNarrow()[value]);
+      buf.append(dateTimeConstants.narrowWeekdays()[value]);
     } else if (count == 4) {
-      buf.append(dateTimeFormatInfo.weekdaysFull()[value]);
+      buf.append(dateTimeConstants.weekdays()[value]);
     } else {
-      buf.append(dateTimeFormatInfo.weekdaysShort()[value]);
+      buf.append(dateTimeConstants.shortWeekdays()[value]);
     }
   }
 
@@ -1225,9 +989,9 @@
   private void formatEra(StringBuffer buf, int count, Date date) {
     int value = date.getYear() >= -JS_START_YEAR ? 1 : 0;
     if (count >= 4) {
-      buf.append(dateTimeFormatInfo.erasFull()[value]);
+      buf.append(dateTimeConstants.eraNames()[value]);
     } else {
-      buf.append(dateTimeFormatInfo.erasShort()[value]);
+      buf.append(dateTimeConstants.eras()[value]);
     }
   }
 
@@ -1296,13 +1060,13 @@
     int value = date.getMonth();
     switch (count) {
       case 5:
-        buf.append(dateTimeFormatInfo.monthsNarrow()[value]);
+        buf.append(dateTimeConstants.narrowMonths()[value]);
         break;
       case 4:
-        buf.append(dateTimeFormatInfo.monthsFull()[value]);
+        buf.append(dateTimeConstants.months()[value]);
         break;
       case 3:
-        buf.append(dateTimeFormatInfo.monthsShort()[value]);
+        buf.append(dateTimeConstants.shortMonths()[value]);
         break;
       default:
         zeroPaddingNumber(buf, value + 1, count);
@@ -1320,9 +1084,9 @@
   private void formatQuarter(StringBuffer buf, int count, Date date) {
     int value = date.getMonth() / 3;
     if (count < 4) {
-      buf.append(dateTimeFormatInfo.quartersShort()[value]);
+      buf.append(dateTimeConstants.shortQuarters()[value]);
     } else {
-      buf.append(dateTimeFormatInfo.quartersFull()[value]);
+      buf.append(dateTimeConstants.quarters()[value]);
     }
   }
 
@@ -1350,11 +1114,11 @@
   private void formatStandaloneDay(StringBuffer buf, int count, Date date) {
     int value = date.getDay();
     if (count == 5) {
-      buf.append(dateTimeFormatInfo.weekdaysNarrowStandalone()[value]);
+      buf.append(dateTimeConstants.standaloneNarrowWeekdays()[value]);
     } else if (count == 4) {
-      buf.append(dateTimeFormatInfo.weekdaysFullStandalone()[value]);
+      buf.append(dateTimeConstants.standaloneWeekdays()[value]);
     } else if (count == 3) {
-      buf.append(dateTimeFormatInfo.weekdaysShortStandalone()[value]);
+      buf.append(dateTimeConstants.standaloneShortWeekdays()[value]);
     } else {
       zeroPaddingNumber(buf, value, 1);
     }
@@ -1371,11 +1135,11 @@
   private void formatStandaloneMonth(StringBuffer buf, int count, Date date) {
     int value = date.getMonth();
     if (count == 5) {
-      buf.append(dateTimeFormatInfo.monthsNarrowStandalone()[value]);
+      buf.append(dateTimeConstants.standaloneNarrowMonths()[value]);
     } else if (count == 4) {
-      buf.append(dateTimeFormatInfo.monthsFullStandalone()[value]);
+      buf.append(dateTimeConstants.standaloneMonths()[value]);
     } else if (count == 3) {
-      buf.append(dateTimeFormatInfo.monthsShortStandalone()[value]);
+      buf.append(dateTimeConstants.standaloneShortMonths()[value]);
     } else {
       zeroPaddingNumber(buf, value + 1, count);
     }
@@ -1408,10 +1172,8 @@
    */
   private void formatTimeZoneRFC(StringBuffer buf, int count, Date date,
       TimeZone timeZone) {
-    if (count < 3) {
+    if (count < 4) {
       buf.append(timeZone.getRFCTimeZoneString(date));
-    } else if (count == 3) {
-      buf.append(timeZone.getISOTimeZoneString(date));
     } else {
       buf.append(timeZone.getGMTString(date));
     }
@@ -1970,7 +1732,7 @@
 
     switch (ch) {
       case 'G': // era
-        value = matchString(text, start, dateTimeFormatInfo.erasFull(), pos);
+        value = matchString(text, start, dateTimeConstants.eras(), pos);
         cal.setEra(value);
         return true;
       case 'M': // month
@@ -1982,7 +1744,7 @@
       case 'c': // standalone day of week
         return subParseStandaloneDay(text, pos, start, cal);
       case 'a': // AM/PM
-        value = matchString(text, start, dateTimeFormatInfo.ampms(), pos);
+        value = matchString(text, start, dateTimeConstants.ampms(), pos);
         cal.setAmpm(value);
         return true;
       case 'y': // year
@@ -2055,9 +1817,9 @@
     // 'E' - DAY_OF_WEEK
     // Want to be able to parse both short and long forms.
     // Try count == 4 (DDDD) first:
-    value = matchString(text, start, dateTimeFormatInfo.weekdaysFull(), pos);
+    value = matchString(text, start, dateTimeConstants.weekdays(), pos);
     if (value < 0) {
-      value = matchString(text, start, dateTimeFormatInfo.weekdaysShort(), pos);
+      value = matchString(text, start, dateTimeConstants.shortWeekdays(), pos);
     }
     if (value < 0) {
       return false;
@@ -2115,9 +1877,9 @@
     if (value < 0) {
       // Want to be able to parse both short and long forms.
       // Try count == 4 first:
-      value = matchString(text, start, dateTimeFormatInfo.monthsFull(), pos);
+      value = matchString(text, start, dateTimeConstants.months(), pos);
       if (value < 0) { // count == 4 failed, now try count == 3.
-        value = matchString(text, start, dateTimeFormatInfo.monthsShort(), pos);
+        value = matchString(text, start, dateTimeConstants.shortMonths(), pos);
       }
       if (value < 0) {
         return false;
@@ -2148,11 +1910,11 @@
     // 'c' - DAY_OF_WEEK
     // Want to be able to parse both short and long forms.
     // Try count == 4 (cccc) first:
-    value = matchString(text, start, dateTimeFormatInfo.weekdaysFullStandalone(),
+    value = matchString(text, start, dateTimeConstants.standaloneWeekdays(),
         pos);
     if (value < 0) {
       value = matchString(text, start,
-          dateTimeFormatInfo.weekdaysShortStandalone(), pos);
+          dateTimeConstants.standaloneShortWeekdays(), pos);
     }
     if (value < 0) {
       return false;
@@ -2180,10 +1942,10 @@
       // Want to be able to parse both short and long forms.
       // Try count == 4 first:
       value = matchString(text, start,
-          dateTimeFormatInfo.monthsFullStandalone(), pos);
+          dateTimeConstants.standaloneMonths(), pos);
       if (value < 0) { // count == 4 failed, now try count == 3.
         value = matchString(text, start,
-            dateTimeFormatInfo.monthsShortStandalone(), pos);
+            dateTimeConstants.standaloneShortMonths(), pos);
       }
       if (value < 0) {
         return false;
diff --git a/user/src/com/google/gwt/i18n/client/DateTimeFormatInfo.java b/user/src/com/google/gwt/i18n/client/DateTimeFormatInfo.java
deleted file mode 100644
index 0386b57..0000000
--- a/user/src/com/google/gwt/i18n/client/DateTimeFormatInfo.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client;
-
-/**
- * Information required for formatting and parsing localized date/time values.
- * 
- * <p>Implementors should subclass {@link DefaultDateTimeFormatInfo} so when
- * methods are added they will get reasonable defaults and not break.  See the
- * same class for example values returned by these methods.
- */
-public interface DateTimeFormatInfo {
-
-  /**
-   * @return array of strings containing abbreviations for Ante Meridiem and
-   * Post Meridiem.
-   */
-  String[] ampms();
-
-  /**
-   * @return a safe default date format.
-   */
-  String dateFormat();
-
-  /**
-   * @return a "full" date format.
-   */
-  String dateFormatFull();
-
-  /**
-   * @return a "long" date format.
-   */
-  String dateFormatLong();
-
-  /**
-   * @return a "medium" date format.
-   */
-  String dateFormatMedium();
-
-  /**
-   * @return a "short" date format.
-   */
-  String dateFormatShort();
-
-  /**
-   * Construct a date/time format from a date format pattern and a time format
-   * pattern, using the locale default joining.
-   * @param timePattern
-   * @param datePattern
-   * 
-   * @return a date/time format
-   */
-  String dateTime(String timePattern, String datePattern);
-
-  /**
-   * Construct a date/time format from a date format pattern and a time format
-   * pattern, using "full" joining.
-   * @param timePattern
-   * @param datePattern
-   * 
-   * @return a date/time format
-   */
-  String dateTimeFull(String timePattern, String datePattern);
-
-  /**
-   * Construct a date/time format from a date format pattern and a time format
-   * pattern, using "full" joining.
-   * @param timePattern
-   * @param datePattern
-   * 
-   * @return a date/time format
-   */
-  String dateTimeLong(String timePattern, String datePattern);
-
-  /**
-   * Construct a date/time format from a date format pattern and a time format
-   * pattern, using "full" joining.
-   * @param timePattern
-   * @param datePattern
-   * 
-   * @return a date/time format
-   */
-  String dateTimeMedium(String timePattern, String datePattern);
-
-  /**
-   * Construct a date/time format from a date format pattern and a time format
-   * pattern, using "full" joining.
-   * 
-   * @param datePattern
-   * @param timePattern
-   * @return a date/time format
-   */
-  String dateTimeShort(String datePattern, String timePattern);
-
-  /**
-   * @return an array of the full era names.
-   */
-  String[] erasFull();
-
-  /**
-   * @return abbreviations of the era names.
-   */
-  String[] erasShort();
-
-  /**
-   * @return the day which generally comes first in a weekly calendar view, as
-   *     an index into the return value of {@link #weekdaysFull()}.
-   */
-  int firstDayOfTheWeek();
-
-  /**
-   * @return localized format equivalent to the "d" skeleton pattern.
-   */
-  String formatDay();
-
-  /**
-   * @return localized format equivalent to the "hm" skeleton pattern.
-   */
-  String formatHour12Minute();
-
-  /**
-   * @return localized format equivalent to the "hms" skeleton pattern.
-   */
-  String formatHour12MinuteSecond();
-
-  /**
-   * @return localized format equivalent to the "Hm" skeleton pattern.
-   */
-  String formatHour24Minute();
-
-  /**
-   * @return localized format equivalent to the "Hms" skeleton pattern.
-   */
-  String formatHour24MinuteSecond();
-
-  /**
-   * @return localized format equivalent to the "ms" skeleton pattern.
-   */
-  String formatMinuteSecond();
-
-  /**
-   * @return localized format equivalent to the "MMM" skeleton pattern.
-   */
-  String formatMonthAbbrev();
-
-  /**
-   * @return localized format equivalent to the "MMMd" skeleton pattern.
-   */
-  String formatMonthAbbrevDay();
-
-  /**
-   * @return localized format equivalent to the "MMMM" skeleton pattern.
-   */
-  String formatMonthFull();
-
-  /**
-   * @return localized format equivalent to the "MMMMd" skeleton pattern.
-   */
-  String formatMonthFullDay();
-
-  /**
-   * @return localized format equivalent to the "MMMMEEEEd" skeleton pattern.
-   */
-  String formatMonthFullWeekdayDay();
-
-  /**
-   * @return localized format equivalent to the "Md" skeleton pattern.
-   */
-  String formatMonthNumDay();
-
-  /**
-   * @return localized format equivalent to the "y" skeleton pattern.
-   */
-  String formatYear();
-
-  /**
-   * @return localized format equivalent to the "yMMM" skeleton pattern.
-   */
-  String formatYearMonthAbbrev();
-
-  /**
-   * @return localized format equivalent to the "yMMMd" skeleton pattern.
-   */
-  String formatYearMonthAbbrevDay();
-
-  /**
-   * @return localized format equivalent to the "yMMMM" skeleton pattern.
-   */
-  String formatYearMonthFull();
-
-  /**
-   * @return localized format equivalent to the "yMMMMd" skeleton pattern.
-   */
-  String formatYearMonthFullDay();
-
-  /**
-   * @return localized format equivalent to the "yM" skeleton pattern.
-   */
-  String formatYearMonthNum();
-
-  /**
-   * @return localized format equivalent to the "yMd" skeleton pattern.
-   */
-  String formatYearMonthNumDay();
-
-  /**
-   * @return localized format equivalent to the "yMMMEEEd" skeleton pattern.
-   */
-  String formatYearMonthWeekdayDay();
-
-  /**
-   * @return localized format equivalent to the "yQQQQ" skeleton pattern.
-   */
-  String formatYearQuarterFull();
-
-  /**
-   * @return localized format equivalent to the "yQ" skeleton pattern.
-   */
-  String formatYearQuarterShort();
-
-  /**
-   * @return an array of full month names.
-   */
-  String[] monthsFull();
-
-  /**
-   * @return an array of month names for use in a stand-alone context.
-   */
-  String[] monthsFullStandalone();
-
-  /**
-   * @return an array of the shortest abbreviations for months, typically a
-   *     single character and not guaranteed to be unique.
-   */
-  String[] monthsNarrow();
-
-  /**
-   * @return an array of the shortest abbreviations for months suitable for use
-   *     in a stand-alone context, typically a single character and not
-   *     guaranteed to be unique.
-   */
-  String[] monthsNarrowStandalone();
-
-  /**
-   * @return an array of month abbreviations.
-   */
-  String[] monthsShort();
-
-  /**
-   * @return an array of month abbreviations, suitable for use in a stand-alone
-   *     context.
-   */
-  String[] monthsShortStandalone();
-
-  /**
-   * @return an array of full quarter names.
-   */
-  String[] quartersFull();
-
-  /**
-   * @return an array of abbreviations for quarters.
-   */
-  String[] quartersShort();
-
-  /**
-   * @return a safe default time format.
-   */
-  String timeFormat();
-
-  /**
-   * @return a "full" time format.
-   */
-  String timeFormatFull();
-
-  /**
-   * @return a "long" time format.
-   */
-  String timeFormatLong();
-
-  /**
-   * @return a "medium" time format.
-   */
-  String timeFormatMedium();
-
-  /**
-   * @return a "short" time format.
-   */
-  String timeFormatShort();
-
-  /**
-   * @return an array of the full names of weekdays.
-   */
-  String[] weekdaysFull();
-
-  /**
-   * @return an array of the full names of weekdays, suitable for use in a
-   *     stand-alone context.
-   */
-  String[] weekdaysFullStandalone();
-
-  /**
-   * @return an array of the shortest abbreviations for weekdays, typically a
-   *     single character and not guaranteed to be unique.
-   */
-  String[] weekdaysNarrow();
-
-  /**
-   * @return an array of the shortest abbreviations for weekdays suitable for
-   *     use in a stand-alone context, typically a single character and not
-   *     guaranteed to be unique.
-   */
-  String[] weekdaysNarrowStandalone();
-
-  /**
-   * @return an array of abbreviations for weekdays.
-   */
-  String[] weekdaysShort();
-
-  /**
-   * @return an array of abbreviations for weekdays, suitable for use in a
-   *     stand-alone context.
-   */
-  String[] weekdaysShortStandalone();
-
-  /**
-   * @return the day which starts the weekend, as an index into the return value
-   *     of {@link #weekdaysFull()}.
-   */
-  int weekendEnd();
-
-  /**
-   * @return the day which ends the weekend, as an index into the return value
-   *     of {@link #weekdaysFull()}.  Note that this value may be numerically less
-   *     than {@link #weekendEnd()} - for example, {@link #weekendEnd()} of 6
-   *     and {@link #weekendStart()} of 0 means Saturday and Sunday are the
-   *     weekend.
-   */
-  int weekendStart();
-}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/i18n/client/DateTimeFormatInfoAdapter.java b/user/src/com/google/gwt/i18n/client/DateTimeFormatInfoAdapter.java
deleted file mode 100644
index d73759f..0000000
--- a/user/src/com/google/gwt/i18n/client/DateTimeFormatInfoAdapter.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client;
-
-import com.google.gwt.i18n.client.constants.DateTimeConstants;
-
-/**
- * Adapter that makes a {@link DateTimeConstants} implementation suitable for
- * use with something that wants a
- * {@link com.google.gwt.i18n.client.DateTimeFormatInfo}.  Values not present
- * in {@link DateTimeConstants} receive default values.
- */
-@SuppressWarnings("deprecation")
-class DateTimeFormatInfoAdapter extends DefaultDateTimeFormatInfo {
-
-  private final DateTimeConstants dtc;
-
-  public DateTimeFormatInfoAdapter(DateTimeConstants dtc) {
-    this.dtc = dtc;
-  }
-
-  // CHECKSTYLE_OFF
-
-  @Override
-  public String[] ampms() {
-    return dtc.ampms();
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return dtc.dateFormats()[0];
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return dtc.dateFormats()[1];
-  }
-  
-  @Override
-  public String dateFormatMedium() {
-    return dtc.dateFormats()[2];
-  }
-  
-  @Override
-  public String dateFormatShort() {
-    return dtc.dateFormats()[3];
-  }
-
-  @Override
-  public String[] erasFull() {
-    return dtc.eraNames();
-  }
-
-  @Override
-  public String[] erasShort() {
-    return dtc.eras();
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return Integer.valueOf(dtc.firstDayOfTheWeek()) - 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return dtc.months();
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return dtc.standaloneMonths();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return dtc.narrowMonths();
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return dtc.standaloneNarrowMonths();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return dtc.shortMonths();
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return dtc.standaloneShortMonths();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return dtc.quarters();
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return dtc.shortQuarters();
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return dtc.timeFormats()[0];
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return dtc.timeFormats()[1];
-  }
-  
-  @Override
-  public String timeFormatMedium() {
-    return dtc.timeFormats()[2];
-  }
-  
-  @Override
-  public String timeFormatShort() {
-    return dtc.timeFormats()[3];
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return dtc.weekdays();
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return dtc.standaloneWeekdays();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return dtc.narrowWeekdays();
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return dtc.standaloneNarrowWeekdays();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return dtc.shortWeekdays();
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return dtc.standaloneShortWeekdays();
-  }
-
-  @Override
-  public int weekendEnd() {
-    return Integer.valueOf(dtc.weekendRange()[1]) - 1;
-  }
-
-  @Override
-  public int weekendStart() {
-    return Integer.valueOf(dtc.weekendRange()[0]) - 1;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/DefaultDateTimeFormatInfo.java b/user/src/com/google/gwt/i18n/client/DefaultDateTimeFormatInfo.java
deleted file mode 100644
index fadf489..0000000
--- a/user/src/com/google/gwt/i18n/client/DefaultDateTimeFormatInfo.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Default implementation of DateTimeFormatInfo interface, using values from
- * the CLDR root locale.
- * <p>
- * Users who need to create their own DateTimeFormatInfo implementation are
- * encouraged to extend this class so their implementation won't break when
- * new methods are added.
- */
-public class DefaultDateTimeFormatInfo implements DateTimeFormatInfo {
-
-  public String[] ampms() {
-    return new String[] { 
-        "AM",
-        "PM"
-    };
-  }
-
-  public String dateFormat() {
-    return dateFormatMedium();
-  }
-
-  public String dateFormatFull() {
-    return "EEEE, MMMM d, y";
-  }
-
-  public String dateFormatLong() {
-    return "MMMM d, y";
-  }
-
-  public String dateFormatMedium() {
-    return "MMM d, y";
-  }
-
-  public String dateFormatShort() {
-    return "M/d/yy";
-  }
-
-  public String dateTime(String timePattern, String datePattern) {
-    return datePattern + " " + timePattern;
-  }
-
-  public String dateTimeFull(String timePattern, String datePattern) {
-    return dateTime(timePattern, datePattern);
-  }
-
-  public String dateTimeLong(String timePattern, String datePattern) {
-    return dateTime(timePattern, datePattern);
-  }
-
-  public String dateTimeMedium(String timePattern, String datePattern) {
-    return dateTime(timePattern, datePattern);
-  }
-
-  public String dateTimeShort(String timePattern, String datePattern) {
-    return dateTime(timePattern, datePattern);
-  }
-
-  public String[] erasFull() {
-    return new String[] { 
-        "Before Christ",
-        "Anno Domini"
-    };
-  }
-
-  public String[] erasShort() {
-    return new String[] { 
-        "BC",
-        "AD"
-    };
-  }
-
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-
-  public String formatDay() {
-    return "d";
-  }
-
-  public String formatHour12Minute() {
-    return "h:mm a";
-  }
-
-  public String formatHour12MinuteSecond() {
-    return "h:mm:ss a";
-  }
-
-  public String formatHour24Minute() {
-    return "HH:mm";
-  }
-
-  public String formatHour24MinuteSecond() {
-    return "HH:mm:ss";
-  }
-
-  public String formatMinuteSecond() {
-    return "mm:ss";
-  }
-
-  public String formatMonthAbbrev() {
-    return "LLL";
-  }
-
-  public String formatMonthAbbrevDay() {
-    return "MMM d";
-  }
-
-  public String formatMonthFull() {
-    return "LLLL";
-  }
-
-  public String formatMonthFullDay() {
-    return "MMMM d";
-  }
-
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE MMMM d";
-  }
-
-  public String formatMonthNumDay() {
-    return "M-d";
-  }
-
-  public String formatYear() {
-    return "y";
-  }
-
-  public String formatYearMonthAbbrev() {
-    return "y MMM";
-  }
-
-  public String formatYearMonthAbbrevDay() {
-    return "y MMM d";
-  }
-
-  public String formatYearMonthFull() {
-    return "y MMMM";
-  }
-
-  public String formatYearMonthFullDay() {
-    return "y MMMM d";
-  }
-
-  public String formatYearMonthNum() {
-    return "y-M";
-  }
-
-  public String formatYearMonthNumDay() {
-    return "y-M-d";
-  }
-
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, y MMM d";
-  }
-
-  public String formatYearQuarterFull() {
-    return "y QQQQ";
-  }
-
-  public String formatYearQuarterShort() {
-    return "y Q";
-  }
-
-  public String[] monthsFull() {
-    return new String[] { 
-        "January",
-        "February",
-        "March",
-        "April",
-        "May",
-        "June",
-        "July",
-        "August",
-        "September",
-        "October",
-        "November",
-        "December"
-    };
-  }
-
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "J",
-        "F",
-        "M",
-        "A",
-        "M",
-        "J",
-        "J",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  public String[] monthsShort() {
-    return new String[] { 
-        "Jan",
-        "Feb",
-        "Mar",
-        "Apr",
-        "May",
-        "Jun",
-        "Jul",
-        "Aug",
-        "Sep",
-        "Oct",
-        "Nov",
-        "Dec"
-    };
-  }
-
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  public String[] quartersFull() {
-    return new String[] { 
-        "1st quarter",
-        "2nd quarter",
-        "3rd quarter",
-        "4th quarter"
-    };
-  }
-
-  public String[] quartersShort() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  public String timeFormat() {
-    return timeFormatMedium();
-  }
-
-  public String timeFormatFull() {
-    return "h:mm:ss a zzzz";
-  }
-
-  public String timeFormatLong() {
-    return "h:mm:ss a z";
-  }
-
-  public String timeFormatMedium() {
-    return "h:mm:ss a";
-  }
-
-  public String timeFormatShort() {
-    return "h:mm a";
-  }
-
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Sunday",
-        "Monday",
-        "Tuesday",
-        "Wednesday",
-        "Thursday",
-        "Friday",
-        "Saturday"
-    };
-  }
-
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "T",
-        "W",
-        "T",
-        "F",
-        "S"
-    };
-  }
-
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Sun",
-        "Mon",
-        "Tue",
-        "Wed",
-        "Thu",
-        "Fri",
-        "Sat"
-    };
-  }
-
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  public int weekendEnd() {
-    return 0;
-  }
-
-  public int weekendStart() {
-    return 6;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/LocaleInfo.java b/user/src/com/google/gwt/i18n/client/LocaleInfo.java
index da0025a..dac341e 100644
--- a/user/src/com/google/gwt/i18n/client/LocaleInfo.java
+++ b/user/src/com/google/gwt/i18n/client/LocaleInfo.java
@@ -25,7 +25,6 @@
  * Provides access to the currently-active locale and the list of available
  * locales.
  */
-@SuppressWarnings("deprecation")
 public class LocaleInfo {
 
   /**
@@ -99,8 +98,6 @@
   private final CldrImpl cldrImpl;
 
   private DateTimeConstants dateTimeConstants;
-
-  private DateTimeFormatInfo dateTimeFormatInfo;
   
   private NumberConstants numberConstants;
 
@@ -123,7 +120,7 @@
     this.infoImpl = impl;
     this.cldrImpl = cldr;
   }
-
+  
   /**
    * @return a DateTimeConstants instance for this locale.
    */
@@ -131,15 +128,7 @@
     ensureDateTimeConstants();
     return dateTimeConstants;
   }
-
-  /**
-   * @return a DateTimeConstants instance for this locale.
-   */
-  public final DateTimeFormatInfo getDateTimeFormatInfo() {
-    ensureDateTimeFormatInfo();
-    return dateTimeFormatInfo;
-  }
-
+  
   /**
    * @return the name of this locale, such as "default, "en_US", etc
    */
@@ -164,14 +153,7 @@
 
   private void ensureDateTimeConstants() {
     if (dateTimeConstants == null) {
-      ensureDateTimeFormatInfo();
-      dateTimeConstants = new DateTimeConstantsAdapter(dateTimeFormatInfo);
-    }
-  }
-
-  private void ensureDateTimeFormatInfo() {
-    if (dateTimeFormatInfo == null) {
-      dateTimeFormatInfo = infoImpl.getDateTimeFormatInfo();
+      dateTimeConstants = infoImpl.getDateTimeConstants();
     }
   }
   
diff --git a/user/src/com/google/gwt/i18n/client/TimeZone.java b/user/src/com/google/gwt/i18n/client/TimeZone.java
index 4334a81..47902ac 100644
--- a/user/src/com/google/gwt/i18n/client/TimeZone.java
+++ b/user/src/com/google/gwt/i18n/client/TimeZone.java
@@ -43,25 +43,6 @@
   private static final int DLT_LONG_NAME = 3;
 
   /**
-   * This factory method provides a decent fallback to create a time zone object
-   * just based on a given time zone offset.
-   * 
-   * @param timeZoneOffsetInMinutes time zone offset in minutes
-   * @return a new time zone object
-   */
-  public static TimeZone createTimeZone(int timeZoneOffsetInMinutes) {
-    TimeZone tz = new TimeZone();
-    tz.standardOffset = timeZoneOffsetInMinutes;
-    tz.timezoneID = composePOSIXTimeZoneID(timeZoneOffsetInMinutes);
-    tz.tzNames = new String[2]; 
-    tz.tzNames[0] = composeUTCString(timeZoneOffsetInMinutes);
-    tz.tzNames[1] = composeUTCString(timeZoneOffsetInMinutes);
-    tz.transitionPoints = null;
-    tz.adjustments = null;
-    return tz;
-  }
-
-  /**
    * This factory method creates a time zone instance from a JSON string that
    * contains the time zone information for desired time zone. Applications can
    * get such a string from the TimeZoneConstants class, or it can request the
@@ -69,8 +50,8 @@
    * string from the data provided in the TimeZoneConstant.properties file,
    * which was carefully prepared from CLDR and Olson time zone database.
    * 
-   * @param tzJSON JSON string that contains time zone data
-   * @return a new time zone object
+   * @param tzJSON JSON string that contains time zone data.
+   * @return a new time zone object. 
    */
   public static TimeZone createTimeZone(String tzJSON) {
     TimeZoneInfo tzData = TimeZoneInfo.buildTimeZoneData(tzJSON);
@@ -111,6 +92,25 @@
   }
 
   /**
+   * This factory method provides a decent fallback to create a time zone object
+   * just based on a given time zone offset.
+   * 
+   * @param timeZoneOffsetInMinutes time zone offset in minutes.
+   * @return a new time zone object.
+   */
+  public static TimeZone createTimeZone(int timeZoneOffsetInMinutes) {
+    TimeZone tz = new TimeZone();
+    tz.standardOffset = timeZoneOffsetInMinutes;
+    tz.timezoneID = composePOSIXTimeZoneID(timeZoneOffsetInMinutes);
+    tz.tzNames = new String[2]; 
+    tz.tzNames[0] = composeUTCString(timeZoneOffsetInMinutes);
+    tz.tzNames[1] = composeUTCString(timeZoneOffsetInMinutes);
+    tz.transitionPoints = null;
+    tz.adjustments = null;
+    return tz;
+  }
+
+  /**
    * In GMT representation, +/- has reverse sign of time zone offset.
    * when offset == 480, it should output GMT-08:00.
    */
@@ -181,8 +181,8 @@
    * date. If daylight savings time is in effect on the given date, the number
    * will be positive, otherwise 0.
    * 
-   * @param date the date to check
-   * @return offset amount
+   * @param date the date to check.
+   * @return offset amount.
    */
   public int getDaylightAdjustment(Date date) {
     if (transitionPoints == null) {
@@ -201,7 +201,7 @@
    * Return the GMT representation of this time zone object.
    * 
    * @param date The date from which the time information should be extracted
-   * @return A GMT representation of the time given by the date
+   * @return A GMT representation of the time given by the date.
    */
   public String getGMTString(Date date) {
     return composeGMTString(getOffset(date));
@@ -212,39 +212,19 @@
    * been instantiated from a time zone offset, the POSIX time zone id will be
    * returned.
    * 
-   * @return time zone id
+   * @return time zone id.
    */
   public String getID() {
     return timezoneID;
   }
 
   /**
-   * To get ISO-style (+00:00) representation of the time zone for given date.
-   *
-   * @param date The date for which time to retrieve RFC time zone string
-   * @return ISO-style time zone string
-   */
-  public String getISOTimeZoneString(Date date) {
-    int offset = -getOffset(date);
-    char data[] = {'+', '0', '0', ':', '0', '0'};
-    if (offset < 0) {
-      data[0] = '-';
-      offset = -offset; // suppress the '-' sign for text display.
-    }
-    data[1] += (offset / 60) / 10;
-    data[2] += (offset / 60) % 10;
-    data[4] += (offset % 60) / 10;
-    data[5] += offset % 10;
-    return new String(data);
-  }
-
-  /**
    * Returns the long version of the time zone name for the given date; the
    * result of this method will be different if daylight savings time is in
    * effect.
    * 
    * @param date The date for which the long time zone name is returned
-   * @return long time zone name
+   * @return long time zone name.
    */
   public String getLongName(Date date) {
     return tzNames[isDaylightTime(date) ? DLT_LONG_NAME : STD_LONG_NAME]; 
@@ -255,8 +235,8 @@
    * To be consistent with JDK/Javascript API, west of Greenwich will be
    * positive.
    * 
-   *  @param date The date for which time to retrieve time zone offset
-   *  @return time zone offset in minutes
+   *  @param date The date for which time to retrieve time zone offset.
+   *  @return time zone offset in minutes. 
    */
   public int getOffset(Date date) {
     return standardOffset - getDaylightAdjustment(date);
@@ -264,8 +244,8 @@
 
   /**
    * To get RFC representation of certain time zone name for given date.
-   * @param date The date for which time to retrieve RFC time zone string
-   * @return RFC time zone string
+   * @param date The date for which time to retrieve RFC time zone string.
+   * @return RFC time zone string.
    */
   public String getRFCTimeZoneString(Date date) {
     int offset = -getOffset(date);
@@ -284,15 +264,17 @@
   /**
    * Returns the short time zone name for a given date.
    * 
-   * @param date The date for which time to retrieve short time zone
-   * @return short time zone name
+   * @param date The date for which time to retrieve short time zone.
+   * @return short time zone name.
    */
   public String getShortName(Date date) {
     return tzNames[isDaylightTime(date) ? DLT_SHORT_NAME : STD_SHORT_NAME]; 
   }
 
   /**
-   * @return the standard time zone offset, in minutes.
+   * Returns the standard time zone offset in minutes.
+   * 
+   * @return the standard time zone offset, in minutes
    */
   public int getStandardOffset() {
     return standardOffset;
@@ -302,8 +284,8 @@
    * Check whether the given date and time falls within a daylight savings time
    * period.
    * 
-   * @param date and time to check
-   * @return true if daylight savings time is in effect
+   * @param date and time to check.
+   * @return true if daylight savings time is in effect.
    */
   public boolean isDaylightTime(Date date) {
     return getDaylightAdjustment(date) > 0;
diff --git a/user/src/com/google/gwt/i18n/client/constants/DateTimeConstants.java b/user/src/com/google/gwt/i18n/client/constants/DateTimeConstants.java
index 48b79aa..998803b 100644
--- a/user/src/com/google/gwt/i18n/client/constants/DateTimeConstants.java
+++ b/user/src/com/google/gwt/i18n/client/constants/DateTimeConstants.java
@@ -24,10 +24,7 @@
  * 
  * If you previously were using GWT.create on this interface, you should
  * use LocaleInfo.getDateTimeConstants() instead.
- * 
- * @deprecated use DateTimeFormatInfo instead
  */
-@Deprecated
 public interface DateTimeConstants {
   String[] ampms();
 
diff --git a/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java b/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java
index d36b23a..7142858 100644
--- a/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java
+++ b/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java
@@ -16,10 +16,10 @@
 package com.google.gwt.i18n.client.impl;
 
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.i18n.client.DateTimeFormatInfo;
+import com.google.gwt.i18n.client.constants.DateTimeConstants;
+import com.google.gwt.i18n.client.constants.DateTimeConstantsImpl;
 import com.google.gwt.i18n.client.constants.NumberConstants;
 import com.google.gwt.i18n.client.constants.NumberConstantsImpl;
-import com.google.gwt.i18n.client.impl.cldr.DateTimeFormatInfoImpl;
 
 /**
  * Implementation detail of LocaleInfo -- not a public API and subject to
@@ -48,15 +48,15 @@
   }
   
   /**
-   * Create a {@link DateTimeFormatInfo} instance appropriate for this locale.
+   * Create a DateTimeConstants instance appropriate for this locale.
    * 
    * Note that the caller takes care of any caching so subclasses need not
    * bother.
    * 
-   * @return a {@link DateTimeFormatInfo} instance
+   * @return a DateTimeConstants instance
    */
-  public DateTimeFormatInfo getDateTimeFormatInfo() {
-    return GWT.create(DateTimeFormatInfoImpl.class);
+  public DateTimeConstants getDateTimeConstants() {
+    return GWT.create(DateTimeConstantsImpl.class);
   }
 
   /**
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl.java
deleted file mode 100644
index b4c9e4d..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-import com.google.gwt.i18n.client.DefaultDateTimeFormatInfo;
-import com.google.gwt.i18n.client.Localizable;
-
-/**
- * {@link com.google.gwt.i18n.client.DateTimeFormatInfo} implementation based on
- * Unicode CLDR data.
- */
-public class DateTimeFormatInfoImpl extends DefaultDateTimeFormatInfo
-    implements Localizable {
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa.java
deleted file mode 100644
index dac1771..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "aa".
- */
-public class DateTimeFormatInfoImpl_aa extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "saaku",
-        "carra"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, MMMM dd, y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Yaasuusuk Duma",
-        "Yaasuusuk Wadir"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "Yaasuusuk Duma",
-        "Yaasuusuk Wadir"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Qunxa Garablu",
-        "Kudo",
-        "Ciggilta Kudo",
-        "Agda Baxis",
-        "Caxah Alsa",
-        "Qasa Dirri",
-        "Qado Dirri",
-        "Liiqen",
-        "Waysu",
-        "Diteli",
-        "Ximoli",
-        "Kaxxa Garablu"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "Q",
-        "N",
-        "C",
-        "A",
-        "C",
-        "Q",
-        "Q",
-        "L",
-        "W",
-        "D",
-        "X",
-        "K"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Qun",
-        "Nah",
-        "Cig",
-        "Agd",
-        "Cax",
-        "Qas",
-        "Qad",
-        "Leq",
-        "Way",
-        "Dit",
-        "Xim",
-        "Kax"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Acaada",
-        "Etleeni",
-        "Talaata",
-        "Arbaqa",
-        "Kamiisi",
-        "Gumqata",
-        "Sabti"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "A",
-        "E",
-        "T",
-        "A",
-        "K",
-        "G",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Aca",
-        "Etl",
-        "Tal",
-        "Arb",
-        "Kam",
-        "Gum",
-        "Sab"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_DJ.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_DJ.java
deleted file mode 100644
index 904d1c3..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_DJ.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "aa_DJ".
- */
-public class DateTimeFormatInfoImpl_aa_DJ extends DateTimeFormatInfoImpl_aa {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Qunxa Garablu",
-        "Naharsi Kudo",
-        "Ciggilta Kudo",
-        "Agda Baxisso",
-        "Caxah Alsa",
-        "Qasa Dirri",
-        "Qado Dirri",
-        "Leqeeni",
-        "Waysu",
-        "Diteli",
-        "Ximoli",
-        "Kaxxa Garablu"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_ER.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_ER.java
deleted file mode 100644
index fe4d24f..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_ER.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "aa_ER".
- */
-public class DateTimeFormatInfoImpl_aa_ER extends DateTimeFormatInfoImpl_aa {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_ER_SAAHO.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_ER_SAAHO.java
deleted file mode 100644
index ac569e7..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_ER_SAAHO.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "aa_ER_SAAHO".
- */
-public class DateTimeFormatInfoImpl_aa_ER_SAAHO extends DateTimeFormatInfoImpl_aa_ER {
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Naba Sambat",
-        "Sani",
-        "Salus",
-        "Rabuq",
-        "Camus",
-        "Jumqata",
-        "Qunxa Sambat"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Nab",
-        "San",
-        "Sal",
-        "Rab",
-        "Cam",
-        "Jum",
-        "Qun"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_ET.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_ET.java
deleted file mode 100644
index fe6f258..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_aa_ET.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "aa_ET".
- */
-public class DateTimeFormatInfoImpl_aa_ET extends DateTimeFormatInfoImpl_aa {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_af.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_af.java
deleted file mode 100644
index a730dbb..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_af.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "af".
- */
-public class DateTimeFormatInfoImpl_af extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "vm.",
-        "nm."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy/MM/dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "voor Christus",
-        "na Christus"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "v.C.",
-        "n.C."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Januarie",
-        "Februarie",
-        "Maart",
-        "April",
-        "Mei",
-        "Junie",
-        "Julie",
-        "Augustus",
-        "September",
-        "Oktober",
-        "November",
-        "Desember"
-    };
-  }
-
-  @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[] { 
-        "Jan",
-        "Feb",
-        "Mar",
-        "Apr",
-        "Mei",
-        "Jun",
-        "Jul",
-        "Aug",
-        "Sep",
-        "Okt",
-        "Nov",
-        "Des"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1ste kwartaal",
-        "2de kwartaal",
-        "3de kwartaal",
-        "4de kwartaal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Sondag",
-        "Maandag",
-        "Dinsdag",
-        "Woensdag",
-        "Donderdag",
-        "Vrydag",
-        "Saterdag"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "So",
-        "Ma",
-        "Di",
-        "Wo",
-        "Do",
-        "Vr",
-        "Sa"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_af_NA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_af_NA.java
deleted file mode 100644
index 329c45e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_af_NA.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "af_NA".
- */
-public class DateTimeFormatInfoImpl_af_NA extends DateTimeFormatInfoImpl_af {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @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";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ak.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ak.java
deleted file mode 100644
index d697b55..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ak.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ak".
- */
-public class DateTimeFormatInfoImpl_ak extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "AN",
-        "EW"
-    };
-  }
-
-  @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[] { 
-        "Ansa Kristo",
-        "Kristo Ekyiri"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "AK",
-        "KE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM yyyy";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y/M/d";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Sanda-Ɔpɛpɔn",
-        "Kwakwar-Ɔgyefuo",
-        "Ebɔw-Ɔbenem",
-        "Ebɔbira-Oforisuo",
-        "Esusow Aketseaba-Kɔtɔnimba",
-        "Obirade-Ayɛwohomumu",
-        "Ayɛwoho-Kitawonsa",
-        "Difuu-Ɔsandaa",
-        "Fankwa-Ɛbɔ",
-        "Ɔbɛsɛ-Ahinime",
-        "Ɔberɛfɛw-Obubuo",
-        "Mumu-Ɔpɛnimba"
-    };
-  }
-
-  @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[] { 
-        "S-Ɔ",
-        "K-Ɔ",
-        "E-Ɔ",
-        "E-O",
-        "E-K",
-        "O-A",
-        "A-K",
-        "D-Ɔ",
-        "F-Ɛ",
-        "Ɔ-A",
-        "Ɔ-O",
-        "M-Ɔ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Kwesida",
-        "Dwowda",
-        "Benada",
-        "Wukuda",
-        "Yawda",
-        "Fida",
-        "Memeneda"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "K",
-        "D",
-        "B",
-        "W",
-        "Y",
-        "F",
-        "M"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Kwe",
-        "Dwo",
-        "Ben",
-        "Wuk",
-        "Yaw",
-        "Fia",
-        "Mem"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index 9ed1410..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_am.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "am".
- */
-public class DateTimeFormatInfoImpl_am extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ጡዋት",
-        "ከሳዓት"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE፣ dd MMMM ቀን y G";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "MMM d y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ዓ/ዓ",
-        "ዓ/ም"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ዓ/ዓ",
-        "ዓ/ም"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ጃንዩወሪ",
-        "ፌብሩወሪ",
-        "ማርች",
-        "ኤፕረል",
-        "ሜይ",
-        "ጁን",
-        "ጁላይ",
-        "ኦገስት",
-        "ሴፕቴምበር",
-        "ኦክተውበር",
-        "ኖቬምበር",
-        "ዲሴምበር"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ጃ",
-        "ፌ",
-        "ማ",
-        "ኤ",
-        "ሜ",
-        "ጁ",
-        "ጁ",
-        "ኦ",
-        "ሴ",
-        "ኦ",
-        "ኖ",
-        "ዲ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ጃንዩ",
-        "ፌብሩ",
-        "ማርች",
-        "ኤፕረ",
-        "ሜይ",
-        "ጁን",
-        "ጁላይ",
-        "ኦገስ",
-        "ሴፕቴ",
-        "ኦክተ",
-        "ኖቬም",
-        "ዲሴም"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "hh:mm:ss a zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "hh:mm:ss a z";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "እሑድ",
-        "ሰኞ",
-        "ማክሰኞ",
-        "ረቡዕ",
-        "ሐሙስ",
-        "ዓርብ",
-        "ቅዳሜ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "እ",
-        "ሰ",
-        "ማ",
-        "ረ",
-        "ሐ",
-        "ዓ",
-        "ቅ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "እሑድ",
-        "ሰኞ",
-        "ማክሰ",
-        "ረቡዕ",
-        "ሐሙስ",
-        "ዓርብ",
-        "ቅዳሜ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar.java
deleted file mode 100644
index 2620620..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar".
- */
-public class DateTimeFormatInfoImpl_ar extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ص",
-        "م"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE، d MMMM، y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM، y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd‏/MM‏/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d‏/M‏/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "قبل الميلاد",
-        "ميلادي"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ق.م",
-        "م"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d‏/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM، y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM، y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M‏/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d‏/M‏/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE، d MMM، y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "yyyy QQQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "yyyy Q";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "يناير",
-        "فبراير",
-        "مارس",
-        "أبريل",
-        "مايو",
-        "يونيو",
-        "يوليو",
-        "أغسطس",
-        "سبتمبر",
-        "أكتوبر",
-        "نوفمبر",
-        "ديسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ي",
-        "ف",
-        "م",
-        "أ",
-        "و",
-        "ن",
-        "ل",
-        "غ",
-        "س",
-        "ك",
-        "ب",
-        "د"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "يناير",
-        "فبراير",
-        "مارس",
-        "أبريل",
-        "مايو",
-        "يونيو",
-        "يوليو",
-        "أغسطس",
-        "سبتمبر",
-        "أكتوبر",
-        "نوفمبر",
-        "ديسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "الربع الأول",
-        "الربع الثاني",
-        "الربع الثالث",
-        "الربع الرابع"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "الربع الأول",
-        "الربع الثاني",
-        "الربع الثالث",
-        "الربع الرابع"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "zzzz h:mm:ss a";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "z h:mm:ss a";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "الأحد",
-        "الإثنين",
-        "الثلاثاء",
-        "الأربعاء",
-        "الخميس",
-        "الجمعة",
-        "السبت"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ح",
-        "ن",
-        "ث",
-        "ر",
-        "خ",
-        "ج",
-        "س"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "أحد",
-        "إثنين",
-        "ثلاثاء",
-        "أربعاء",
-        "خميس",
-        "جمعة",
-        "سبت"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @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_ar_AE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_AE.java
deleted file mode 100644
index 6788ee5..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_AE.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_AE".
- */
-public class DateTimeFormatInfoImpl_ar_AE extends DateTimeFormatInfoImpl_ar {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_DZ.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_DZ.java
deleted file mode 100644
index e195eac..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_DZ.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_DZ".
- */
-public class DateTimeFormatInfoImpl_ar_DZ extends DateTimeFormatInfoImpl_ar {
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy/M";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y/M/d";
-  }
-
-  @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_ar_JO.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_JO.java
deleted file mode 100644
index 0a716b0..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_JO.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_JO".
- */
-public class DateTimeFormatInfoImpl_ar_JO extends DateTimeFormatInfoImpl_ar {
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "كانون الثاني",
-        "شباط",
-        "آذار",
-        "نيسان",
-        "أيار",
-        "حزيران",
-        "تموز",
-        "آب",
-        "أيلول",
-        "تشرين الأول",
-        "تشرين الثاني",
-        "كانون الأول"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "كانون الثاني",
-        "شباط",
-        "آذار",
-        "نيسان",
-        "أيار",
-        "حزيران",
-        "تموز",
-        "آب",
-        "أيلول",
-        "تشرين الأول",
-        "تشرين الثاني",
-        "كانون الأول"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "الأحد",
-        "الاثنين",
-        "الثلاثاء",
-        "الأربعاء",
-        "الخميس",
-        "الجمعة",
-        "السبت"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_KW.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_KW.java
deleted file mode 100644
index 4cddde8..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_KW.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_KW".
- */
-public class DateTimeFormatInfoImpl_ar_KW extends DateTimeFormatInfoImpl_ar {
-
-  @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_ar_LB.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_LB.java
deleted file mode 100644
index 7df8334..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_LB.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_LB".
- */
-public class DateTimeFormatInfoImpl_ar_LB extends DateTimeFormatInfoImpl_ar {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "كانون الثاني",
-        "شباط",
-        "آذار",
-        "نيسان",
-        "نوار",
-        "حزيران",
-        "تموز",
-        "آب",
-        "أيلول",
-        "تشرين الأول",
-        "تشرين الثاني",
-        "كانون الأول"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "كانون الثاني",
-        "شباط",
-        "آذار",
-        "نيسان",
-        "نوار",
-        "حزيران",
-        "تموز",
-        "آب",
-        "أيلول",
-        "تشرين الأول",
-        "تشرين الثاني",
-        "كانون الأول"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "الأحد",
-        "الاثنين",
-        "الثلاثاء",
-        "الأربعاء",
-        "الخميس",
-        "الجمعة",
-        "السبت"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
-  public int weekendEnd() {
-    return 0;
-  }
-
-  @Override
-  public int weekendStart() {
-    return 6;
-  }
-}
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
deleted file mode 100644
index 1e30156..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_OM.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_OM".
- */
-public class DateTimeFormatInfoImpl_ar_OM extends DateTimeFormatInfoImpl_ar {
-
-  @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_ar_QA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_QA.java
deleted file mode 100644
index 2080b58..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_QA.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_QA".
- */
-public class DateTimeFormatInfoImpl_ar_QA extends DateTimeFormatInfoImpl_ar {
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "الأحد",
-        "الاثنين",
-        "الثلاثاء",
-        "الأربعاء",
-        "الخميس",
-        "الجمعة",
-        "السبت"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_SA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_SA.java
deleted file mode 100644
index 6480a79..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_SA.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_SA".
- */
-public class DateTimeFormatInfoImpl_ar_SA extends DateTimeFormatInfoImpl_ar {
-
-  @Override
-  public String[] weekdaysShort() {
-    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_ar_SD.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_SD.java
deleted file mode 100644
index e3540e3..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_SD.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_SD".
- */
-public class DateTimeFormatInfoImpl_ar_SD extends DateTimeFormatInfoImpl_ar {
-
-  @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_ar_SY.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_SY.java
deleted file mode 100644
index 9d76a60..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_SY.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_SY".
- */
-public class DateTimeFormatInfoImpl_ar_SY extends DateTimeFormatInfoImpl_ar {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "كانون الثاني",
-        "شباط",
-        "آذار",
-        "نيسان",
-        "نوار",
-        "حزيران",
-        "تموز",
-        "آب",
-        "أيلول",
-        "تشرين الأول",
-        "تشرين الثاني",
-        "كانون الأول"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "كانون الثاني",
-        "شباط",
-        "آذار",
-        "نيسان",
-        "نوار",
-        "حزيران",
-        "تموز",
-        "آب",
-        "أيلول",
-        "تشرين الأول",
-        "تشرين الثاني",
-        "كانون الأول"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "الأحد",
-        "الاثنين",
-        "الثلاثاء",
-        "الأربعاء",
-        "الخميس",
-        "الجمعة",
-        "السبت"
-    };
-  }
-
-  @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
deleted file mode 100644
index f7f06ec..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_TN.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_TN".
- */
-public class DateTimeFormatInfoImpl_ar_TN extends DateTimeFormatInfoImpl_ar {
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy/M";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y/M/d";
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "الأحد",
-        "الاثنين",
-        "الثلاثاء",
-        "الأربعاء",
-        "الخميس",
-        "الجمعة",
-        "السبت"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_YE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_YE.java
deleted file mode 100644
index 9ae25c7..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ar_YE.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ar_YE".
- */
-public class DateTimeFormatInfoImpl_ar_YE extends DateTimeFormatInfoImpl_ar {
-
-  @Override
-  public String[] weekdaysShort() {
-    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_as.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_as.java
deleted file mode 100644
index e9c6c7d..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_as.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "as".
- */
-public class DateTimeFormatInfoImpl_as extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "পূৰ্বা",
-        "অপ"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM, y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM, y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MM-yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d-M-yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "জানুয়াৰী",
-        "ফেব্ৰুয়াৰী",
-        "মাৰ্চ",
-        "এপ্ৰিল",
-        "মে",
-        "জুন",
-        "জুলাই",
-        "আগষ্ট",
-        "সেপ্টেম্বৰ",
-        "অক্টোবৰ",
-        "নভেম্বৰ",
-        "ডিসেম্বৰ"
-    };
-  }
-
-  @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[] { 
-        "জানু",
-        "ফেব্ৰু",
-        "মাৰ্চ",
-        "এপ্ৰিল",
-        "মে",
-        "জুন",
-        "জুলাই",
-        "আগ",
-        "সেপ্ট",
-        "অক্টো",
-        "নভে",
-        "ডিসে"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "দেওবাৰ",
-        "সোমবাৰ",
-        "মঙ্গলবাৰ",
-        "বুধবাৰ",
-        "বৃহষ্পতিবাৰ",
-        "শুক্ৰবাৰ",
-        "শনিবাৰ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_az.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_az.java
deleted file mode 100644
index 99d207f..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_az.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "az".
- */
-public class DateTimeFormatInfoImpl_az extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d, MMMM, y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM , y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/MM/dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "eramızdan əvvəl",
-        "bizim eramızın"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "e.ə.",
-        "b.e."
-    };
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM , y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM , y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d, MMM, y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Yanvar",
-        "Fevral",
-        "Mart",
-        "Aprel",
-        "May",
-        "İyun",
-        "İyul",
-        "Avqust",
-        "Sentyabr",
-        "Oktyabr",
-        "Noyabr",
-        "Dekabr"
-    };
-  }
-
-  @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[] { 
-        "yan",
-        "fev",
-        "mar",
-        "apr",
-        "may",
-        "iyn",
-        "iyl",
-        "avq",
-        "sen",
-        "okt",
-        "noy",
-        "dek"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1-ci kvartal",
-        "2-ci kvartal",
-        "3-cü kvartal",
-        "4-cü kvartal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "1-ci kv.",
-        "2-ci kv.",
-        "3-cü kv.",
-        "4-cü kv."
-    };
-  }
-
-  @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[] { 
-        "bazar",
-        "bazar ertəsi",
-        "çərşənbə axşamı",
-        "çərşənbə",
-        "cümə axşamı",
-        "cümə",
-        "şənbə"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "7",
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "B.",
-        "B.E.",
-        "Ç.A.",
-        "Ç.",
-        "C.A.",
-        "C",
-        "Ş."
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_az_Cyrl.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_az_Cyrl.java
deleted file mode 100644
index 5f3b9e9..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_az_Cyrl.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "az_Cyrl".
- */
-public class DateTimeFormatInfoImpl_az_Cyrl extends DateTimeFormatInfoImpl_az {
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "јанвар",
-        "феврал",
-        "март",
-        "апрел",
-        "май",
-        "ијун",
-        "ијул",
-        "август",
-        "сентјабр",
-        "октјабр",
-        "нојабр",
-        "декабр"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "базар",
-        "базар ертәси",
-        "чәршәнбә ахшамы",
-        "чәршәнбә",
-        "ҹүмә ахшамы",
-        "ҹүмә",
-        "шәнбә"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_be.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_be.java
deleted file mode 100644
index a39bc0b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_be.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "be".
- */
-public class DateTimeFormatInfoImpl_be extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "да палудня",
-        "пасля палудня"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d.M.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d.M.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "да н.э.",
-        "н.э."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "да н.е.",
-        "н.е."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "h.mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "h.mm.ss a";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "HH.mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "HH.mm.ss";
-  }
-
-  @Override
-  public String formatMinuteSecond() {
-    return "mm.ss";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d MMMM";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "MM/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ 'кв'. y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q 'кв'. y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "студзень",
-        "люты",
-        "сакавік",
-        "красавік",
-        "май",
-        "чэрвень",
-        "ліпень",
-        "жнівень",
-        "верасень",
-        "кастрычнік",
-        "лістапад",
-        "снежань"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "студзень",
-        "люты",
-        "сакавік",
-        "красавік",
-        "травень",
-        "чэрвень",
-        "ліпень",
-        "жнівень",
-        "верасень",
-        "кастрычнік",
-        "лістапад",
-        "снежань"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "с",
-        "л",
-        "с",
-        "к",
-        "т",
-        "ч",
-        "л",
-        "ж",
-        "в",
-        "к",
-        "л",
-        "с"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return new String[] { 
-        "с",
-        "л",
-        "с",
-        "к",
-        "м",
-        "ч",
-        "л",
-        "ж",
-        "в",
-        "к",
-        "л",
-        "с"
-    };
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "сту",
-        "лют",
-        "сак",
-        "кра",
-        "май",
-        "чэр",
-        "ліп",
-        "жні",
-        "вер",
-        "кас",
-        "ліс",
-        "сне"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return new String[] { 
-        "сту",
-        "лют",
-        "сак",
-        "кра",
-        "тра",
-        "чэр",
-        "ліп",
-        "жні",
-        "вер",
-        "кас",
-        "ліс",
-        "сне"
-    };
-  }
-
-  @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 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[] { 
-        "нядзеля",
-        "панядзелак",
-        "аўторак",
-        "серада",
-        "чацвер",
-        "пятніца",
-        "субота"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "н",
-        "п",
-        "а",
-        "с",
-        "ч",
-        "п",
-        "с"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "нд",
-        "пн",
-        "аў",
-        "ср",
-        "чц",
-        "пт",
-        "сб"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bg.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bg.java
deleted file mode 100644
index 1e164d6..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bg.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "bg".
- */
-public class DateTimeFormatInfoImpl_bg extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "пр. об.",
-        "сл. об."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "dd MMMM y, EEEE";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.MM.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "пр.Хр.",
-        "сл.Хр."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "пр. н. е.",
-        "от н. е."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "d MMMM, EEEE";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "d MMM y, EEE";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "януари",
-        "февруари",
-        "март",
-        "април",
-        "май",
-        "юни",
-        "юли",
-        "август",
-        "септември",
-        "октомври",
-        "ноември",
-        "декември"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "я",
-        "ф",
-        "м",
-        "а",
-        "м",
-        "ю",
-        "ю",
-        "а",
-        "с",
-        "о",
-        "н",
-        "д"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ян.",
-        "февр.",
-        "март",
-        "апр.",
-        "май",
-        "юни",
-        "юли",
-        "авг.",
-        "септ.",
-        "окт.",
-        "ноем.",
-        "дек."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1-во тримесечие",
-        "2-ро тримесечие",
-        "3-то тримесечие",
-        "4-то тримесечие"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "I трим.",
-        "II трим.",
-        "III трим.",
-        "IV трим."
-    };
-  }
-
-  @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[] { 
-        "неделя",
-        "понеделник",
-        "вторник",
-        "сряда",
-        "четвъртък",
-        "петък",
-        "събота"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "н",
-        "п",
-        "в",
-        "с",
-        "ч",
-        "п",
-        "с"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "нд",
-        "пн",
-        "вт",
-        "ср",
-        "чт",
-        "пт",
-        "сб"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bn.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bn.java
deleted file mode 100644
index 1579092..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bn.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "bn".
- */
-public class DateTimeFormatInfoImpl_bn extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "am",
-        "pm"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM, y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM, y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/M/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "খৃষ্টপূর্ব",
-        "খৃষ্টাব্দ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "খৃষ্টপূর্ব",
-        "খৃষ্টাব্দ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "জানুয়ারী",
-        "ফেব্রুয়ারী",
-        "মার্চ",
-        "এপ্রিল",
-        "মে",
-        "জুন",
-        "জুলাই",
-        "আগস্ট",
-        "সেপ্টেম্বর",
-        "অক্টোবর",
-        "নভেম্বর",
-        "ডিসেম্বর"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "জা",
-        "ফে",
-        "মা",
-        "এ",
-        "মে",
-        "জুন",
-        "জু",
-        "আ",
-        "সে",
-        "অ",
-        "ন",
-        "ডি"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "জানুয়ারী",
-        "ফেব্রুয়ারী",
-        "মার্চ",
-        "এপ্রিল",
-        "মে",
-        "জুন",
-        "জুলাই",
-        "আগস্ট",
-        "সেপ্টেম্বর",
-        "অক্টোবর",
-        "নভেম্বর",
-        "ডিসেম্বর"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "প্রথম চতুর্থাংশ",
-        "দ্বিতীয় চতুর্থাংশ",
-        "তৃতীয় চতুর্থাংশ",
-        "চতুর্থ চতুর্থাংশ"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "চতুর্থাংশ ১",
-        "চতুর্থাংশ ২",
-        "চতুর্থাংশ ৩",
-        "চতুর্থাংশ ৪"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "রবিবার",
-        "সোমবার",
-        "মঙ্গলবার",
-        "বুধবার",
-        "বৃহষ্পতিবার",
-        "শুক্রবার",
-        "শনিবার"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "র",
-        "সো",
-        "ম",
-        "বু",
-        "বৃ",
-        "শু",
-        "শ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "রবি",
-        "সোম",
-        "মঙ্গল",
-        "বুধ",
-        "বৃহস্পতি",
-        "শুক্র",
-        "শনি"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bn_IN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bn_IN.java
deleted file mode 100644
index 33d396b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bn_IN.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "bn_IN".
- */
-public class DateTimeFormatInfoImpl_bn_IN extends DateTimeFormatInfoImpl_bn {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-
-  @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
deleted file mode 100644
index a655f4e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bo.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "bo".
- */
-public class DateTimeFormatInfoImpl_bo extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    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 "yyyy-MM-dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "སྤྱི་ལོ་སྔོན།",
-        "སྤྱི་ལོ།"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "སྤྱི་ལོ་སྔོན།",
-        "སྤྱི་ལོ།"
-    };
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "སྦྱི་ལོ་y MMMའི་ཙེས་dད";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "སྦྱི་ལོ་y MMMMའི་ཙེས་dད";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ཟླ་བ་དང་པོ་",
-        "ཟླ་བ་གཉིས་པ་",
-        "ཟླ་བ་སུམ་པ་",
-        "ཟླ་བ་བཞི་པ་",
-        "ཟླ་བ་ལྔ་པ་",
-        "ཟླ་བ་དྲུག་པ་",
-        "ཟླ་བ་བདུན་པ་",
-        "ཟླ་བ་བརྒྱད་པ་",
-        "ཟླ་བ་དགུ་པ་",
-        "ཟླ་བ་བཅུ་པ་",
-        "ཟླ་བ་བཅུ་གཅིག་པ་",
-        "ཟླ་བ་བཅུ་གཉིས་པ་"
-    };
-  }
-
-  @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[] { 
-        "ཟླ་༡",
-        "ཟླ་༢",
-        "ཟླ་༣",
-        "ཟླ་༤",
-        "ཟླ་༥",
-        "ཟླ་༦",
-        "ཟླ་༧",
-        "ཟླ་༨",
-        "ཟླ་༩",
-        "ཟླ་༡༠",
-        "ཟླ་༡༡",
-        "ཟླ་༡༢"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "དུས་ཚིགས་དང་པོ།",
-        "དུས་ཚིགས་གཉིས་པ།",
-        "་དུས་ཚིགས་གསུམ་པ།",
-        "དུས་ཚིགས་བཞི་པ།"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "དུས་ཚིགས་དང་པོ།",
-        "དུས་ཚིགས་གཉིས་པ།",
-        "་དུས་ཚིགས་གསུམ་པ།",
-        "དུས་ཚིགས་བཞི་པ།"
-    };
-  }
-
-  @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[] { 
-        "གཟའ་ཉི་མ་",
-        "གཟའ་ཟླ་བ་",
-        "གཟའ་མིག་དམར་",
-        "གཟའ་ཧླག་པ་",
-        "གཟའ་ཕུར་བུ་",
-        "གཟའ་སངས་",
-        "གཟའ་སྤེན་པ་"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ཉི",
-        "ཟླ",
-        "མི",
-        "ཧླ",
-        "ཕུ",
-        "ས",
-        "སྤེ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ཉི་མ་",
-        "ཟླ་བ་",
-        "མིག་དམར་",
-        "ཧླག་པ་",
-        "ཕུར་བུ་",
-        "སངས་",
-        "སྤེན་པ་"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bo_IN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bo_IN.java
deleted file mode 100644
index d2ed265..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bo_IN.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "bo_IN".
- */
-public class DateTimeFormatInfoImpl_bo_IN extends DateTimeFormatInfoImpl_bo {
-
-  @Override
-  public int weekendStart() {
-    return 0;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bs.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bs.java
deleted file mode 100644
index 156eb4d..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_bs.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "bs".
- */
-public class DateTimeFormatInfoImpl_bs 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"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Januar",
-        "Februar",
-        "Mart",
-        "April",
-        "Maj",
-        "Juni",
-        "Juli",
-        "Avgust",
-        "Septembar",
-        "Oktobar",
-        "Novembar",
-        "Decembar"
-    };
-  }
-
-  @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[] { 
-        "Jan",
-        "Feb",
-        "Mar",
-        "Apr",
-        "Maj",
-        "Jun",
-        "Jul",
-        "Avg",
-        "Sep",
-        "Okt",
-        "Nov",
-        "Dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Prvi kvartal",
-        "Drugi kvartal",
-        "Treći kvartal",
-        "Četvrti kvartal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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[] { 
-        "Nedjelja",
-        "Ponedjeljak",
-        "Utorak",
-        "Srijeda",
-        "Četvrtak",
-        "Petak",
-        "Subota"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Ned",
-        "Pon",
-        "Uto",
-        "Sri",
-        "Čet",
-        "Pet",
-        "Sub"
-    };
-  }
-
-  @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
deleted file mode 100644
index 587bd9b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_byn.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "byn".
- */
-public class DateTimeFormatInfoImpl_byn extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ፋዱስ ጃብ",
-        "ፋዱስ ደምቢ"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE፡ dd MMMM ግርጋ y G";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ይጅ",
-        "ኣድ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ይጅ",
-        "ኣድ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ልደትሪ",
-        "ካብኽብቲ",
-        "ክብላ",
-        "ፋጅኺሪ",
-        "ክቢቅሪ",
-        "ምኪኤል ትጟኒሪ",
-        "ኰርኩ",
-        "ማርያም ትሪ",
-        "ያኸኒ መሳቅለሪ",
-        "መተሉ",
-        "ምኪኤል መሽወሪ",
-        "ተሕሳስሪ"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ል",
-        "ካ",
-        "ክ",
-        "ፋ",
-        "ክ",
-        "ም",
-        "ኰ",
-        "ማ",
-        "ያ",
-        "መ",
-        "ም",
-        "ተ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ልደት",
-        "ካብኽ",
-        "ክብላ",
-        "ፋጅኺ",
-        "ክቢቅ",
-        "ም/ት",
-        "ኰር",
-        "ማርያ",
-        "ያኸኒ",
-        "መተሉ",
-        "ም/ም",
-        "ተሕሳ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ሰንበር ቅዳዅ",
-        "ሰኑ",
-        "ሰሊጝ",
-        "ለጓ ወሪ ለብዋ",
-        "ኣምድ",
-        "ኣርብ",
-        "ሰንበር ሽጓዅ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ሰ",
-        "ሰ",
-        "ሰ",
-        "ለ",
-        "ኣ",
-        "ኣ",
-        "ሰ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ሰ/ቅ",
-        "ሰኑ",
-        "ሰሊጝ",
-        "ለጓ",
-        "ኣምድ",
-        "ኣርብ",
-        "ሰ/ሽ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_byn_ER.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_byn_ER.java
deleted file mode 100644
index e2cc679..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_byn_ER.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "byn_ER".
- */
-public class DateTimeFormatInfoImpl_byn_ER extends DateTimeFormatInfoImpl_byn {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
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
deleted file mode 100644
index 407cf3f..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ca.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ca".
- */
-public class DateTimeFormatInfoImpl_ca extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "a.m.",
-        "p.m."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM 'de' y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM 'de' y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "aC",
-        "dC"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "aC",
-        "dC"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "LLL y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM 'de' y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "LLLL y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM 'de' y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM 'de' y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "de gener",
-        "de febrer",
-        "de març",
-        "d’abril",
-        "de maig",
-        "de juny",
-        "de juliol",
-        "d’agost",
-        "de setembre",
-        "d’octubre",
-        "de novembre",
-        "de desembre"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "gener",
-        "febrer",
-        "març",
-        "abril",
-        "maig",
-        "juny",
-        "juliol",
-        "agost",
-        "setembre",
-        "octubre",
-        "novembre",
-        "desembre"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "g",
-        "f",
-        "m",
-        "a",
-        "m",
-        "j",
-        "j",
-        "a",
-        "s",
-        "o",
-        "n",
-        "d"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "gen.",
-        "febr.",
-        "març",
-        "abr.",
-        "maig",
-        "juny",
-        "jul.",
-        "ag.",
-        "set.",
-        "oct.",
-        "nov.",
-        "des."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1r trimestre",
-        "2n trimestre",
-        "3r trimestre",
-        "4t trimestre"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "1T",
-        "2T",
-        "3T",
-        "4T"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "diumenge",
-        "dilluns",
-        "dimarts",
-        "dimecres",
-        "dijous",
-        "divendres",
-        "dissabte"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "g",
-        "l",
-        "t",
-        "c",
-        "j",
-        "v",
-        "s"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "dg.",
-        "dl.",
-        "dt.",
-        "dc.",
-        "dj.",
-        "dv.",
-        "ds."
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return new String[] { 
-        "dg",
-        "dl",
-        "dt",
-        "dc",
-        "dj",
-        "dv",
-        "ds"
-    };
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cch.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cch.java
deleted file mode 100644
index 68bec90..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cch.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "cch".
- */
-public class DateTimeFormatInfoImpl_cch 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[] { 
-        "Gabanin Miladi",
-        "Miladi"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "GM",
-        "M"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Pen Dyon",
-        "Pen Ba'a",
-        "Pen Atat",
-        "Pen Anas",
-        "Pen Atyon",
-        "Pen Achirim",
-        "Pen Atariba",
-        "Pen Awurr",
-        "Pen Shadon",
-        "Pen Shakur",
-        "Pen Kur Naba",
-        "Pen Kur Natat"
-    };
-  }
-
-  @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[] { 
-        "Dyon",
-        "Baa",
-        "Atat",
-        "Anas",
-        "Atyo",
-        "Achi",
-        "Atar",
-        "Awur",
-        "Shad",
-        "Shak",
-        "Naba",
-        "Nata"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Wai Yoka Bawai",
-        "Wai Tunga",
-        "Toki Gitung",
-        "Tsam Kasuwa",
-        "Wai Na Nas",
-        "Wai Na Tiyon",
-        "Wai Na Chirim"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Yok",
-        "Tung",
-        "T. Tung",
-        "Tsan",
-        "Nas",
-        "Nat",
-        "Chir"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cop.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cop.java
deleted file mode 100644
index 66b6710..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cop.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "cop".
- */
-public class DateTimeFormatInfoImpl_cop 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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cs.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cs.java
deleted file mode 100644
index 0ce2c9e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cs.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "cs".
- */
-public class DateTimeFormatInfoImpl_cs extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "dop.",
-        "odp."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d.M.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d.M.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "př.Kr.",
-        "po Kr."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "př.Kr.",
-        "po Kr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d. MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ledna",
-        "února",
-        "března",
-        "dubna",
-        "května",
-        "června",
-        "července",
-        "srpna",
-        "září",
-        "října",
-        "listopadu",
-        "prosince"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "leden",
-        "únor",
-        "březen",
-        "duben",
-        "květen",
-        "červen",
-        "červenec",
-        "srpen",
-        "září",
-        "říjen",
-        "listopad",
-        "prosinec"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "l",
-        "ú",
-        "b",
-        "d",
-        "k",
-        "č",
-        "č",
-        "s",
-        "z",
-        "ř",
-        "l",
-        "p"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return new String[] { 
-        "1.",
-        "2.",
-        "3.",
-        "4.",
-        "5.",
-        "6.",
-        "7.",
-        "8.",
-        "9.",
-        "10.",
-        "11.",
-        "12."
-    };
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. čtvrtletí",
-        "2. čtvrtletí",
-        "3. čtvrtletí",
-        "4. čtvrtletí"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "HH:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "neděle",
-        "pondělí",
-        "úterý",
-        "středa",
-        "čtvrtek",
-        "pátek",
-        "sobota"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "N",
-        "P",
-        "Ú",
-        "S",
-        "Č",
-        "P",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ne",
-        "po",
-        "út",
-        "st",
-        "čt",
-        "pá",
-        "so"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cy.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cy.java
deleted file mode 100644
index 2b5ed00..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_cy.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "cy".
- */
-public class DateTimeFormatInfoImpl_cy extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Cyn Crist",
-        "Oed Crist"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "CC",
-        "OC"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Ionawr",
-        "Chwefror",
-        "Mawrth",
-        "Ebrill",
-        "Mai",
-        "Mehefin",
-        "Gorffenaf",
-        "Awst",
-        "Medi",
-        "Hydref",
-        "Tachwedd",
-        "Rhagfyr"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "Ionawr",
-        "Chwefror",
-        "Mawrth",
-        "Ebrill",
-        "Mai",
-        "Mehefin",
-        "Gorffennaf",
-        "Awst",
-        "Medi",
-        "Hydref",
-        "Tachwedd",
-        "Rhagfyr"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "I",
-        "C",
-        "M",
-        "E",
-        "M",
-        "M",
-        "G",
-        "A",
-        "M",
-        "H",
-        "T",
-        "R"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Ion",
-        "Chwef",
-        "Mawrth",
-        "Ebrill",
-        "Mai",
-        "Meh",
-        "Gorff",
-        "Awst",
-        "Medi",
-        "Hyd",
-        "Tach",
-        "Rhag"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return new String[] { 
-        "Ion",
-        "Chwe",
-        "Maw",
-        "Ebr",
-        "Mai",
-        "Meh",
-        "Gor",
-        "Awst",
-        "Medi",
-        "Hyd",
-        "Tach",
-        "Rhag"
-    };
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Chwarter 1af",
-        "2il chwarter",
-        "3ydd chwarter",
-        "4ydd chwarter"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "Ch1",
-        "Ch2",
-        "Ch3",
-        "Ch4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Dydd Sul",
-        "Dydd Llun",
-        "Dydd Mawrth",
-        "Dydd Mercher",
-        "Dydd Iau",
-        "Dydd Gwener",
-        "Dydd Sadwrn"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "L",
-        "M",
-        "M",
-        "I",
-        "G",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Sul",
-        "Llun",
-        "Maw",
-        "Mer",
-        "Iau",
-        "Gwen",
-        "Sad"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return new String[] { 
-        "Sul",
-        "Llun",
-        "Maw",
-        "Mer",
-        "Iau",
-        "Gwe",
-        "Sad"
-    };
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_da.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_da.java
deleted file mode 100644
index 33f68e6..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_da.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "da".
- */
-public class DateTimeFormatInfoImpl_da extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "f.m.",
-        "e.m."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE 'den' d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "f.Kr.",
-        "e.Kr."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "f.Kr.",
-        "e.Kr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "h.mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "h.mm.ss a";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "HH.mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "HH.mm.ss";
-  }
-
-  @Override
-  public String formatMinuteSecond() {
-    return "mm.ss";
-  }
-
-  @Override
-  public String formatMonthAbbrev() {
-    return "MMM";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFull() {
-    return "MMMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE 'den' d. MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januar",
-        "februar",
-        "marts",
-        "april",
-        "maj",
-        "juni",
-        "juli",
-        "august",
-        "september",
-        "oktober",
-        "november",
-        "december"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan.",
-        "feb.",
-        "mar.",
-        "apr.",
-        "maj",
-        "jun.",
-        "jul.",
-        "aug.",
-        "sep.",
-        "okt.",
-        "nov.",
-        "dec."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return new String[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "maj",
-        "jun",
-        "jul",
-        "aug",
-        "sep",
-        "okt",
-        "nov",
-        "dec"
-    };
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. kvartal",
-        "2. kvartal",
-        "3. kvartal",
-        "4. kvartal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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[] { 
-        "søndag",
-        "mandag",
-        "tirsdag",
-        "onsdag",
-        "torsdag",
-        "fredag",
-        "lørdag"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "T",
-        "O",
-        "T",
-        "F",
-        "L"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "søn",
-        "man",
-        "tir",
-        "ons",
-        "tor",
-        "fre",
-        "lør"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_de.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_de.java
deleted file mode 100644
index bd11109..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_de.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "de".
- */
-public class DateTimeFormatInfoImpl_de extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "vorm.",
-        "nachm."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.MM.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "v. Chr.",
-        "n. Chr."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "v. Chr.",
-        "n. Chr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d. MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M.";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d. MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Januar",
-        "Februar",
-        "März",
-        "April",
-        "Mai",
-        "Juni",
-        "Juli",
-        "August",
-        "September",
-        "Oktober",
-        "November",
-        "Dezember"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Jan",
-        "Feb",
-        "Mär",
-        "Apr",
-        "Mai",
-        "Jun",
-        "Jul",
-        "Aug",
-        "Sep",
-        "Okt",
-        "Nov",
-        "Dez"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. Quartal",
-        "2. Quartal",
-        "3. Quartal",
-        "4. Quartal"
-    };
-  }
-
-  @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[] { 
-        "Sonntag",
-        "Montag",
-        "Dienstag",
-        "Mittwoch",
-        "Donnerstag",
-        "Freitag",
-        "Samstag"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "D",
-        "M",
-        "D",
-        "F",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "So.",
-        "Mo.",
-        "Di.",
-        "Mi.",
-        "Do.",
-        "Fr.",
-        "Sa."
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_de_AT.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_de_AT.java
deleted file mode 100644
index 88af1d5..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_de_AT.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "de_AT".
- */
-public class DateTimeFormatInfoImpl_de_AT extends DateTimeFormatInfoImpl_de {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, dd. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd. MMMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Jänner",
-        "Februar",
-        "März",
-        "April",
-        "Mai",
-        "Juni",
-        "Juli",
-        "August",
-        "September",
-        "Oktober",
-        "November",
-        "Dezember"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Jän",
-        "Feb",
-        "Mär",
-        "Apr",
-        "Mai",
-        "Jun",
-        "Jul",
-        "Aug",
-        "Sep",
-        "Okt",
-        "Nov",
-        "Dez"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_de_BE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_de_BE.java
deleted file mode 100644
index 83ec93f..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_de_BE.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "de_BE".
- */
-public class DateTimeFormatInfoImpl_de_BE extends DateTimeFormatInfoImpl_de {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/MM/yy";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "HH 'h' mm 'min' ss 's' zzzz";
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Son",
-        "Mon",
-        "Die",
-        "Mit",
-        "Don",
-        "Fre",
-        "Sam"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_dv.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_dv.java
deleted file mode 100644
index 0c278e2..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_dv.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "dv".
- */
-public class DateTimeFormatInfoImpl_dv extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MM-yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d-M-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 5;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "hh:mm:ss a zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "hh:mm:ss a z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index 110526d..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_dz.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "dz".
- */
-public class DateTimeFormatInfoImpl_dz extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "སྔ་ཆ་",
-        "ཕྱི་ཆ་"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "སྤྱི་ལོ་y ཟླ་ MMMM ཚེས་ dd";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "སྤྱི་ལོ་y ཟླ་ MMMM ཚེས་ dd";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "སྤྱི་ལོ་y ཟླ་ MMM ཚེས་ dd";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "སྤྱི་ཟླཝ་དངཔ་",
-        "སྤྱི་ཟླཝ་གཉིས་པ་",
-        "སྤྱི་ཟླཝ་གསུམ་པ་",
-        "སྤྱི་ཟླཝ་བཞི་པ་",
-        "སྤྱི་ཟླཝ་ལྔ་པ་",
-        "སྤྱི་ཟླཝ་དྲུག་པ་",
-        "སྤྱི་ཟླཝ་བདུན་པ་",
-        "སྤྱི་ཟླཝ་བརྒྱད་པ་",
-        "སྤྱི་ཟླཝ་དགུ་པ་",
-        "སྤྱི་ཟླཝ་བཅུ་པ་",
-        "སྤྱི་ཟླཝ་བཅུ་གཅིག་པ་",
-        "སྤྱི་ཟླཝ་བཅུ་གཉིས་པ་"
-    };
-  }
-
-  @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[] { 
-        "ཟླ་ ༡",
-        "ཟླ་ ༢",
-        "ཟླ་ ༣",
-        "ཟླ་ ༤",
-        "ཟླ་ ༥",
-        "ཟླ་ ༦",
-        "ཟླ་ ༧",
-        "ཟླ་ ༨",
-        "ཟླ་ ༩",
-        "ཟླ་ ༡༠",
-        "ཟླ་ ༡༡",
-        "ཟླ་ ༡༢"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "བཞི་དཔྱ་དང་པ་",
-        "བཞི་དཔྱ་གཉིས་པ་",
-        "བཞི་དཔྱ་གསུམ་པ་",
-        "བཞི་དཔྱ་བཞི་པ་"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    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[] { 
-        "གཟའ་ཟླ་བ་",
-        "གཟའ་མིག་དམར་",
-        "གཟའ་ལྷག་པ་",
-        "གཟའ་ཕུར་བུ་",
-        "གཟའ་པ་སངས་",
-        "གཟའ་སྤེན་པ་",
-        "གཟའ་ཉི་མ་"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ཟླ་",
-        "མིར་",
-        "ལྷག་",
-        "ཕུར་",
-        "སངས་",
-        "སྤེན་",
-        "ཉི་"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ee.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ee.java
deleted file mode 100644
index 20cae88..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ee.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ee".
- */
-public class DateTimeFormatInfoImpl_ee extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "AN",
-        "EW"
-    };
-  }
-
-  @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[] { 
-        "Hafi Yesu Va Do ŋgɔ na Yesu",
-        "Yesu Ŋɔli"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "HY",
-        "YŊ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Dzove",
-        "Dzodze",
-        "Tedoxe",
-        "Afɔfiɛ",
-        "Dama",
-        "Masa",
-        "Siamlɔm",
-        "Deasiamime",
-        "Anyɔnyɔ",
-        "Kele",
-        "Adeɛmekpɔxe",
-        "Dzome"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "D",
-        "D",
-        "T",
-        "A",
-        "D",
-        "M",
-        "S",
-        "D",
-        "A",
-        "K",
-        "A",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Dzv",
-        "Dzd",
-        "Ted",
-        "Afɔ",
-        "Dam",
-        "Mas",
-        "Sia",
-        "Dea",
-        "Any",
-        "Kel",
-        "Ade",
-        "Dzm"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Kɔsiɖa",
-        "Dzoɖa",
-        "Braɖa",
-        "Kuɖa",
-        "Yawoɖa",
-        "Fiɖa",
-        "Memleɖa"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "K",
-        "D",
-        "B",
-        "K",
-        "Y",
-        "F",
-        "M"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Kɔs Kwe",
-        "Dzo",
-        "Bra",
-        "Kuɖ",
-        "Yaw",
-        "Fiɖ",
-        "Mem"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_el.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_el.java
deleted file mode 100644
index 02f5f9c..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_el.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "el".
- */
-public class DateTimeFormatInfoImpl_el extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "π.μ.",
-        "μ.μ."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "π.Χ.",
-        "μ.Χ."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "π.Χ.",
-        "μ.Χ."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Ιανουαρίου",
-        "Φεβρουαρίου",
-        "Μαρτίου",
-        "Απριλίου",
-        "Μαΐου",
-        "Ιουνίου",
-        "Ιουλίου",
-        "Αυγούστου",
-        "Σεπτεμβρίου",
-        "Οκτωβρίου",
-        "Νοεμβρίου",
-        "Δεκεμβρίου"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "Ιανουάριος",
-        "Φεβρουάριος",
-        "Μάρτιος",
-        "Απρίλιος",
-        "Μάιος",
-        "Ιούνιος",
-        "Ιούλιος",
-        "Αύγουστος",
-        "Σεπτέμβριος",
-        "Οκτώβριος",
-        "Νοέμβριος",
-        "Δεκέμβριος"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "Ι",
-        "Φ",
-        "Μ",
-        "Α",
-        "Μ",
-        "Ι",
-        "Ι",
-        "Α",
-        "Σ",
-        "Ο",
-        "Ν",
-        "Δ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Ιαν",
-        "Φεβ",
-        "Μαρ",
-        "Απρ",
-        "Μαϊ",
-        "Ιουν",
-        "Ιουλ",
-        "Αυγ",
-        "Σεπ",
-        "Οκτ",
-        "Νοε",
-        "Δεκ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @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[] { 
-        "Κυριακή",
-        "Δευτέρα",
-        "Τρίτη",
-        "Τετάρτη",
-        "Πέμπτη",
-        "Παρασκευή",
-        "Σάββατο"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "Κ",
-        "Δ",
-        "Τ",
-        "Τ",
-        "Π",
-        "Π",
-        "Σ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Κυρ",
-        "Δευ",
-        "Τρι",
-        "Τετ",
-        "Πεμ",
-        "Παρ",
-        "Σαβ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_el_POLYTON.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_el_POLYTON.java
deleted file mode 100644
index dc1e9cd..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_el_POLYTON.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "el_POLYTON".
- */
-public class DateTimeFormatInfoImpl_el_POLYTON extends DateTimeFormatInfoImpl_el {
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Ἰανουαρίου",
-        "Φεβρουαρίου",
-        "Μαρτίου",
-        "Ἀπριλίου",
-        "Μαΐου",
-        "Ἰουνίου",
-        "Ἰουλίου",
-        "Αὐγούστου",
-        "Σεπτεμβρίου",
-        "Ὀκτωβρίου",
-        "Νοεμβρίου",
-        "Δεκεμβρίου"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "Ἰανουάριος",
-        "Φεβρουάριος",
-        "Μάρτιος",
-        "Ἀπρίλιος",
-        "Μάιος",
-        "Ἰούνιος",
-        "Ἰούλιος",
-        "Αὔγουστος",
-        "Σεπτέμβριος",
-        "Ὀκτώβριος",
-        "Νοέμβριος",
-        "Δεκέμβριος"
-    };
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Ἰαν",
-        "Φεβ",
-        "Μαρ",
-        "Ἀπρ",
-        "Μαϊ",
-        "Ἰουν",
-        "Ἰουλ",
-        "Αὐγ",
-        "Σεπ",
-        "Ὀκτ",
-        "Νοε",
-        "Δεκ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-}
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
deleted file mode 100644
index 38b4bc1..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en".
- */
-public class DateTimeFormatInfoImpl_en extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_AU.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_AU.java
deleted file mode 100644
index d6340a9..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_AU.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_AU".
- */
-public class DateTimeFormatInfoImpl_en_AU extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/MM/yy";
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_BE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_BE.java
deleted file mode 100644
index 413a4a4..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_BE.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_BE".
- */
-public class DateTimeFormatInfoImpl_en_BE extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "HH 'h' mm 'min' ss 's' 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";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_BW.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_BW.java
deleted file mode 100644
index 2d5b53b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_BW.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_BW".
- */
-public class DateTimeFormatInfoImpl_en_BW extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_BZ.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_BZ.java
deleted file mode 100644
index c0c484a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_BZ.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_BZ".
- */
-public class DateTimeFormatInfoImpl_en_BZ extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @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";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_CA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_CA.java
deleted file mode 100644
index da0777c..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_CA.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_CA".
- */
-public class DateTimeFormatInfoImpl_en_CA extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy-MM-dd";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M-d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM-y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM-y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM, y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y-M-d";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM, y";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_Dsrt.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_Dsrt.java
deleted file mode 100644
index fa5d701..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_Dsrt.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_Dsrt".
- */
-public class DateTimeFormatInfoImpl_en_Dsrt extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "𐐈𐐣",
-        "𐐑𐐣"
-    };
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "𐐒𐐲𐑁𐐬𐑉 𐐗𐑉𐐴𐑅𐐻",
-        "𐐈𐑌𐐬 𐐔𐐱𐑋𐐮𐑌𐐨"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "𐐒𐐗",
-        "𐐈𐐔"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "𐐖𐐰𐑌𐐷𐐭𐐯𐑉𐐨",
-        "𐐙𐐯𐐺𐑉𐐭𐐯𐑉𐐨",
-        "𐐣𐐪𐑉𐐽",
-        "𐐁𐐹𐑉𐐮𐑊",
-        "𐐣𐐩",
-        "𐐖𐐭𐑌",
-        "𐐖𐐭𐑊𐐴",
-        "𐐂𐑀𐐲𐑅𐐻",
-        "𐐝𐐯𐐹𐐻𐐯𐑋𐐺𐐲𐑉",
-        "𐐉𐐿𐐻𐐬𐐺𐐲𐑉",
-        "𐐤𐐬𐑂𐐯𐑋𐐺𐐲𐑉",
-        "𐐔𐐨𐑅𐐯𐑋𐐺𐐲𐑉"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "𐐖",
-        "𐐙",
-        "𐐣",
-        "𐐁",
-        "𐐣",
-        "𐐖",
-        "𐐖",
-        "𐐂",
-        "𐐝",
-        "𐐉",
-        "𐐤",
-        "𐐔"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "𐐖𐐰𐑌",
-        "𐐙𐐯𐐺",
-        "𐐣𐐪𐑉",
-        "𐐁𐐹𐑉",
-        "𐐣𐐩",
-        "𐐖𐐭𐑌",
-        "𐐖𐐭𐑊",
-        "𐐂𐑀",
-        "𐐝𐐯𐐹",
-        "𐐉𐐿𐐻",
-        "𐐤𐐬𐑂",
-        "𐐔𐐨𐑅"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @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[] { 
-        "𐐝𐐲𐑌𐐼𐐩",
-        "𐐣𐐲𐑌𐐼𐐩",
-        "𐐓𐐭𐑆𐐼𐐩",
-        "𐐎𐐯𐑌𐑆𐐼𐐩",
-        "𐐛𐐲𐑉𐑆𐐼𐐩",
-        "𐐙𐑉𐐴𐐼𐐩",
-        "𐐝𐐰𐐻𐐲𐑉𐐼𐐩"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "𐐝",
-        "𐐣",
-        "𐐓",
-        "𐐎",
-        "𐐛",
-        "𐐙",
-        "𐐝"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "𐐝𐐲𐑌",
-        "𐐣𐐲𐑌",
-        "𐐓𐐭𐑆",
-        "𐐎𐐯𐑌",
-        "𐐛𐐲𐑉",
-        "𐐙𐑉𐐴",
-        "𐐝𐐰𐐻"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_Dsrt_US.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_Dsrt_US.java
deleted file mode 100644
index aad32a2..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_Dsrt_US.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_Dsrt_US".
- */
-public class DateTimeFormatInfoImpl_en_Dsrt_US extends DateTimeFormatInfoImpl_en_Dsrt {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_GB.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_GB.java
deleted file mode 100644
index fc7d84a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_GB.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_GB".
- */
-public class DateTimeFormatInfoImpl_en_GB extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @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";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_IE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_IE.java
deleted file mode 100644
index 153c5e9..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_IE.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_IE".
- */
-public class DateTimeFormatInfoImpl_en_IE extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "a.m.",
-        "p.m."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @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";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_IN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_IN.java
deleted file mode 100644
index 5302930..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_IN.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_IN".
- */
-public class DateTimeFormatInfoImpl_en_IN extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public int weekendStart() {
-    return 0;
-  }
-}
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
deleted file mode 100644
index 5903483..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_MT.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_MT".
- */
-public class DateTimeFormatInfoImpl_en_MT extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @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";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_NA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_NA.java
deleted file mode 100644
index 88903ae..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_NA.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_NA".
- */
-public class DateTimeFormatInfoImpl_en_NA extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-}
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
deleted file mode 100644
index 85433ae..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_NZ.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_NZ".
- */
-public class DateTimeFormatInfoImpl_en_NZ extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/MM/yy";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_PK.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_PK.java
deleted file mode 100644
index 4224eac..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_PK.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_PK".
- */
-public class DateTimeFormatInfoImpl_en_PK extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_Shaw.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_Shaw.java
deleted file mode 100644
index 5985cc6..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_Shaw.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_Shaw".
- */
-public class DateTimeFormatInfoImpl_en_Shaw extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "𐑨𐑥",
-        "𐑐𐑥"
-    };
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "𐑚𐑰𐑓𐑪𐑮 ·𐑒𐑮𐑲𐑕𐑑",
-        "𐑨𐑙𐑴 𐑛𐑪𐑥𐑦𐑙𐑰"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "𐑚·𐑒",
-        "𐑨𐑛"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "·𐑡𐑨𐑙𐑘𐑭𐑢𐑺𐑰",
-        "·𐑓𐑧𐑚𐑘𐑵𐑢𐑺𐑰",
-        "·𐑥𐑸𐑗",
-        "·𐑱𐑐𐑮𐑭𐑤",
-        "·𐑥𐑱",
-        "·𐑡𐑵𐑯",
-        "·𐑡𐑫𐑤𐑲",
-        "·𐑪𐑜𐑭𐑕𐑑",
-        "·𐑕𐑧𐑐𐑑𐑧𐑥𐑚𐑸",
-        "·𐑷𐑒𐑑𐑴𐑚𐑸",
-        "·𐑯𐑴𐑝𐑧𐑥𐑚𐑸",
-        "·𐑛𐑭𐑕𐑧𐑥𐑚𐑸"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "𐑡",
-        "𐑓",
-        "𐑥",
-        "𐑱",
-        "𐑥",
-        "𐑡",
-        "𐑡",
-        "𐑪",
-        "𐑕",
-        "𐑷",
-        "𐑯",
-        "𐑛"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "·𐑡𐑨",
-        "·𐑓𐑧",
-        "·𐑥𐑸",
-        "·𐑱𐑐",
-        "·𐑥𐑱",
-        "·𐑡𐑵",
-        "·𐑡𐑫",
-        "·𐑪𐑜",
-        "·𐑕𐑧",
-        "·𐑷𐑒",
-        "·𐑯𐑴",
-        "·𐑛𐑭"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @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[] { 
-        "·𐑕𐑭𐑙𐑛𐑱",
-        "·𐑥𐑭𐑙𐑛𐑱",
-        "·𐑑𐑵𐑟𐑛𐑱",
-        "·𐑢𐑧𐑙𐑟𐑛𐑱",
-        "·𐑔𐑻𐑟𐑛𐑱",
-        "·𐑓𐑮𐑲𐑛𐑱",
-        "·𐑕𐑨𐑛𐑻𐑛𐑱"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "𐑕",
-        "𐑥",
-        "𐑑",
-        "𐑢",
-        "𐑔",
-        "𐑓",
-        "𐑕"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "·𐑕𐑭",
-        "·𐑥𐑭",
-        "·𐑑𐑵",
-        "·𐑢𐑧",
-        "·𐑔𐑻",
-        "·𐑓𐑮",
-        "·𐑕𐑨"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_ZA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_ZA.java
deleted file mode 100644
index 8cfd0c6..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_ZA.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_ZA".
- */
-public class DateTimeFormatInfoImpl_en_ZA extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy/MM/dd";
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y/M/d";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_ZW.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_ZW.java
deleted file mode 100644
index 30de83f..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_en_ZW.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "en_ZW".
- */
-public class DateTimeFormatInfoImpl_en_ZW extends DateTimeFormatInfoImpl_en {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd MMM,y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/M/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_eo.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_eo.java
deleted file mode 100644
index 77bc04b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_eo.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "eo".
- */
-public class DateTimeFormatInfoImpl_eo extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "atm",
-        "ptm"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d-'a' 'de' MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y-MMMM-dd";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y-MMM-dd";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy-MM-dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "aK",
-        "pK"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "aK",
-        "pK"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "y-MMM-d";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "y-MMMM-d";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d-'a' 'de' MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januaro",
-        "februaro",
-        "marto",
-        "aprilo",
-        "majo",
-        "junio",
-        "julio",
-        "aŭgusto",
-        "septembro",
-        "oktobro",
-        "novembro",
-        "decembro"
-    };
-  }
-
-  @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[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "maj",
-        "jun",
-        "jul",
-        "aŭg",
-        "sep",
-        "okt",
-        "nov",
-        "dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1a kvaronjaro",
-        "2a kvaronjaro",
-        "3a kvaronjaro",
-        "4a kvaronjaro"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H-'a' 'horo' 'kaj' m: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[] { 
-        "dimanĉo",
-        "lundo",
-        "mardo",
-        "merkredo",
-        "ĵaŭdo",
-        "vendredo",
-        "sabato"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "di",
-        "lu",
-        "ma",
-        "me",
-        "ĵa",
-        "ve",
-        "sa"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es.java
deleted file mode 100644
index 4bc43f9..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es".
- */
-public class DateTimeFormatInfoImpl_es extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "a.m.",
-        "p.m."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d 'de' MMMM 'de' y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d 'de' MMMM 'de' y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "antes de Cristo",
-        "anno Dómini"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "a.C.",
-        "d.C."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d 'de' MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d 'de' MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d 'de' MMM 'de' y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d 'de' MMMM 'de' y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d 'de' MMM 'de' y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "enero",
-        "febrero",
-        "marzo",
-        "abril",
-        "mayo",
-        "junio",
-        "julio",
-        "agosto",
-        "septiembre",
-        "octubre",
-        "noviembre",
-        "diciembre"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "E",
-        "F",
-        "M",
-        "A",
-        "M",
-        "J",
-        "J",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ene",
-        "feb",
-        "mar",
-        "abr",
-        "may",
-        "jun",
-        "jul",
-        "ago",
-        "sep",
-        "oct",
-        "nov",
-        "dic"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1er trimestre",
-        "2º trimestre",
-        "3er trimestre",
-        "4º trimestre"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "T1",
-        "T2",
-        "T3",
-        "T4"
-    };
-  }
-
-  @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[] { 
-        "domingo",
-        "lunes",
-        "martes",
-        "miércoles",
-        "jueves",
-        "viernes",
-        "sábado"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "D",
-        "L",
-        "M",
-        "M",
-        "J",
-        "V",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "dom",
-        "lun",
-        "mar",
-        "mié",
-        "jue",
-        "vie",
-        "sáb"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index 7de9ea3..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_AR.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es_AR".
- */
-public class DateTimeFormatInfoImpl_es_AR extends DateTimeFormatInfoImpl_es {
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-yyyy";
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "HH'h'''mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_CL.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_CL.java
deleted file mode 100644
index ccb93d0..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_CL.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es_CL".
- */
-public class DateTimeFormatInfoImpl_es_CL extends DateTimeFormatInfoImpl_es {
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MM-yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd-MM-yy";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-}
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
deleted file mode 100644
index c420522..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_CO.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es_CO".
- */
-public class DateTimeFormatInfoImpl_es_CO extends DateTimeFormatInfoImpl_es {
-
-  @Override
-  public String dateFormatMedium() {
-    return "d/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/MM/yy";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_EC.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_EC.java
deleted file mode 100644
index 352e816..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_EC.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es_EC".
- */
-public class DateTimeFormatInfoImpl_es_EC extends DateTimeFormatInfoImpl_es {
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_GT.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_GT.java
deleted file mode 100644
index 94850c6..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_GT.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es_GT".
- */
-public class DateTimeFormatInfoImpl_es_GT extends DateTimeFormatInfoImpl_es {
-
-  @Override
-  public String dateFormatMedium() {
-    return "d/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/MM/yy";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_HN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_HN.java
deleted file mode 100644
index e2349f5..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_HN.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es_HN".
- */
-public class DateTimeFormatInfoImpl_es_HN extends DateTimeFormatInfoImpl_es {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd 'de' MMMM 'de' y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd 'de' MMMM 'de' y";
-  }
-}
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
deleted file mode 100644
index 0f2f7d8..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PA.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es_PA".
- */
-public class DateTimeFormatInfoImpl_es_PA extends DateTimeFormatInfoImpl_es {
-
-  @Override
-  public String dateFormatMedium() {
-    return "MM/dd/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "MM/dd/yy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PE.java
deleted file mode 100644
index 12d27b3..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PE.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es_PE".
- */
-public class DateTimeFormatInfoImpl_es_PE extends DateTimeFormatInfoImpl_es {
-
-  @Override
-  public String dateFormatShort() {
-    return "d/MM/yy";
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "HH'H'mm''ss\" zzzz";
-  }
-}
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
deleted file mode 100644
index 1ddbf2a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_PR.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es_PR".
- */
-public class DateTimeFormatInfoImpl_es_PR extends DateTimeFormatInfoImpl_es {
-
-  @Override
-  public String dateFormatMedium() {
-    return "MM/dd/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "MM/dd/yy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_US.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_US.java
deleted file mode 100644
index fcb1510..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_es_US.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "es_US".
- */
-public class DateTimeFormatInfoImpl_es_US extends DateTimeFormatInfoImpl_es {
-
-  @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 formatHour12Minute() {
-    return "h:mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "h:mm:ss a";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/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_et.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_et.java
deleted file mode 100644
index e721a73..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_et.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "et".
- */
-public class DateTimeFormatInfoImpl_et extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d, MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.MM.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "enne meie aega",
-        "meie aja järgi"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "e.m.a.",
-        "m.a.j."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "h:mm.ss a";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm.ss";
-  }
-
-  @Override
-  public String formatMinuteSecond() {
-    return "mm.ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d. MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d. MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ. y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q. y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "jaanuar",
-        "veebruar",
-        "märts",
-        "aprill",
-        "mai",
-        "juuni",
-        "juuli",
-        "august",
-        "september",
-        "oktoober",
-        "november",
-        "detsember"
-    };
-  }
-
-  @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[] { 
-        "jaan",
-        "veebr",
-        "märts",
-        "apr",
-        "mai",
-        "juuni",
-        "juuli",
-        "aug",
-        "sept",
-        "okt",
-        "nov",
-        "dets"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. kvartal",
-        "2. kvartal",
-        "3. kvartal",
-        "4. kvartal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "pühapäev",
-        "esmaspäev",
-        "teisipäev",
-        "kolmapäev",
-        "neljapäev",
-        "reede",
-        "laupäev"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "P",
-        "E",
-        "T",
-        "K",
-        "N",
-        "R",
-        "L"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_eu.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_eu.java
deleted file mode 100644
index caf4d38..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_eu.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "eu".
- */
-public class DateTimeFormatInfoImpl_eu extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, y'eko' MMMM'ren' dd'a'";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y'eko' MMM'ren' dd'a'";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y MMM d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "y'eko' MMM'ren' d'a'";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "y'eko' MMMM'ren' d'a'";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, y'eko' MMM'ren' d'a'";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "urtarrila",
-        "otsaila",
-        "martxoa",
-        "apirila",
-        "maiatza",
-        "ekaina",
-        "uztaila",
-        "abuztua",
-        "iraila",
-        "urria",
-        "azaroa",
-        "abendua"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "U",
-        "O",
-        "M",
-        "A",
-        "M",
-        "E",
-        "U",
-        "A",
-        "I",
-        "U",
-        "A",
-        "A"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "urt",
-        "ots",
-        "mar",
-        "api",
-        "mai",
-        "eka",
-        "uzt",
-        "abu",
-        "ira",
-        "urr",
-        "aza",
-        "abe"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. hiruhilekoa",
-        "2. hiruhilekoa",
-        "3. hiruhilekoa",
-        "4. hiruhilekoa"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "1Hh",
-        "2Hh",
-        "3Hh",
-        "4Hh"
-    };
-  }
-
-  @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[] { 
-        "igandea",
-        "astelehena",
-        "asteartea",
-        "asteazkena",
-        "osteguna",
-        "ostirala",
-        "larunbata"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ig",
-        "al",
-        "as",
-        "az",
-        "og",
-        "or",
-        "lr"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index dc90aee..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "fa".
- */
-public class DateTimeFormatInfoImpl_fa extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "قبل از ظهر",
-        "بعد از ظهر"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy/M/d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/M/d";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "قبل از میلاد",
-        "میلادی"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ق.م.",
-        "م."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d LLL";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d LLLL";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d LLLL";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy/M";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "yyyy QQQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "yyyy Q";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ژانویهٔ",
-        "فوریهٔ",
-        "مارس",
-        "آوریل",
-        "مهٔ",
-        "ژوئن",
-        "ژوئیهٔ",
-        "اوت",
-        "سپتامبر",
-        "اکتبر",
-        "نوامبر",
-        "دسامبر"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "ژانویه",
-        "فوریه",
-        "مارس",
-        "آوریل",
-        "مه",
-        "ژوئن",
-        "ژوئیه",
-        "اوت",
-        "سپتامبر",
-        "اکتبر",
-        "نوامبر",
-        "دسامبر"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ژ",
-        "ف",
-        "م",
-        "آ",
-        "م",
-        "ژ",
-        "ژ",
-        "ا",
-        "س",
-        "ا",
-        "ن",
-        "د"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ژانویهٔ",
-        "فوریهٔ",
-        "مارس",
-        "آوریل",
-        "مهٔ",
-        "ژوئن",
-        "ژوئیهٔ",
-        "اوت",
-        "سپتامبر",
-        "اکتبر",
-        "نوامبر",
-        "دسامبر"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return new String[] { 
-        "ژانویه",
-        "فوریه",
-        "مارس",
-        "آوریل",
-        "مه",
-        "ژوئن",
-        "ژوئیه",
-        "اوت",
-        "سپتامبر",
-        "اکتبر",
-        "نوامبر",
-        "دسامبر"
-    };
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "سه‌ماههٔ اول",
-        "سه‌ماههٔ دوم",
-        "سه‌ماههٔ سوم",
-        "سه‌ماههٔ چهارم"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "س‌م۱",
-        "س‌م۲",
-        "س‌م۳",
-        "س‌م۴"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H:mm:ss (zzzz)";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss (z)";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "یکشنبه",
-        "دوشنبه",
-        "سه‌شنبه",
-        "چهارشنبه",
-        "پنجشنبه",
-        "جمعه",
-        "شنبه"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ی",
-        "د",
-        "س",
-        "چ",
-        "پ",
-        "ج",
-        "ش"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_fa_AF.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa_AF.java
deleted file mode 100644
index 3f1119e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fa_AF.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "fa_AF".
- */
-public class DateTimeFormatInfoImpl_fa_AF extends DateTimeFormatInfoImpl_fa {
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "جنوری",
-        "فبروری",
-        "مارچ",
-        "اپریل",
-        "می",
-        "جون",
-        "جولای",
-        "اگست",
-        "سپتمبر",
-        "اکتوبر",
-        "نومبر",
-        "دسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ج",
-        "ف",
-        "م",
-        "ا",
-        "م",
-        "ج",
-        "ج",
-        "ا",
-        "س",
-        "ا",
-        "ن",
-        "د"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    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
deleted file mode 100644
index 6611c93..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fi.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "fi".
- */
-public class DateTimeFormatInfoImpl_fi extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ap.",
-        "ip."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d.M.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d.M.yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ennen Kristuksen syntymää",
-        "jälkeen Kristuksen syntymän"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "eKr.",
-        "jKr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "h.mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "h.mm.ss a";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H.mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H.mm.ss";
-  }
-
-  @Override
-  public String formatMinuteSecond() {
-    return "mm.ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d. MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M.";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "LLL y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "LLLL y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "L.yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d. MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ/yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q/yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "tammikuuta",
-        "helmikuuta",
-        "maaliskuuta",
-        "huhtikuuta",
-        "toukokuuta",
-        "kesäkuuta",
-        "heinäkuuta",
-        "elokuuta",
-        "syyskuuta",
-        "lokakuuta",
-        "marraskuuta",
-        "joulukuuta"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "tammikuu",
-        "helmikuu",
-        "maaliskuu",
-        "huhtikuu",
-        "toukokuu",
-        "kesäkuu",
-        "heinäkuu",
-        "elokuu",
-        "syyskuu",
-        "lokakuu",
-        "marraskuu",
-        "joulukuu"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "T",
-        "H",
-        "M",
-        "H",
-        "T",
-        "K",
-        "H",
-        "E",
-        "S",
-        "L",
-        "M",
-        "J"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "tammikuuta",
-        "helmikuuta",
-        "maaliskuuta",
-        "huhtikuuta",
-        "toukokuuta",
-        "kesäkuuta",
-        "heinäkuuta",
-        "elokuuta",
-        "syyskuuta",
-        "lokakuuta",
-        "marraskuuta",
-        "joulukuuta"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return new String[] { 
-        "tammi",
-        "helmi",
-        "maalis",
-        "huhti",
-        "touko",
-        "kesä",
-        "heinä",
-        "elo",
-        "syys",
-        "loka",
-        "marras",
-        "joulu"
-    };
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. neljännes",
-        "2. neljännes",
-        "3. neljännes",
-        "4. neljännes"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "1. nelj.",
-        "2. nelj.",
-        "3. nelj.",
-        "4. nelj."
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H.mm.ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H.mm.ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H.mm.ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H.mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "sunnuntaina",
-        "maanantaina",
-        "tiistaina",
-        "keskiviikkona",
-        "torstaina",
-        "perjantaina",
-        "lauantaina"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return new String[] { 
-        "sunnuntai",
-        "maanantai",
-        "tiistai",
-        "keskiviikko",
-        "torstai",
-        "perjantai",
-        "lauantai"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "T",
-        "K",
-        "T",
-        "P",
-        "L"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "su",
-        "ma",
-        "ti",
-        "ke",
-        "to",
-        "pe",
-        "la"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fil.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fil.java
deleted file mode 100644
index 55715a0..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fil.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "fil".
- */
-public class DateTimeFormatInfoImpl_fil extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, MMMM dd y";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy-M";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Enero",
-        "Pebrero",
-        "Marso",
-        "Abril",
-        "Mayo",
-        "Hunyo",
-        "Hulyo",
-        "Agosto",
-        "Setyembre",
-        "Oktubre",
-        "Nobyembre",
-        "Disyembre"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "E",
-        "P",
-        "M",
-        "A",
-        "M",
-        "H",
-        "H",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Ene",
-        "Peb",
-        "Mar",
-        "Abr",
-        "May",
-        "Hun",
-        "Hul",
-        "Ago",
-        "Set",
-        "Okt",
-        "Nob",
-        "Dis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Linggo",
-        "Lunes",
-        "Martes",
-        "Miyerkules",
-        "Huwebes",
-        "Biyernes",
-        "Sabado"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "L",
-        "L",
-        "M",
-        "M",
-        "H",
-        "B",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Lin",
-        "Lun",
-        "Mar",
-        "Mye",
-        "Huw",
-        "Bye",
-        "Sab"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return new String[] { 
-        "Lin",
-        "Lun",
-        "Mar",
-        "Miy",
-        "Huw",
-        "Biy",
-        "Sab"
-    };
-  }
-}
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
deleted file mode 100644
index 79ccf51..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fo.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "fo".
- */
-public class DateTimeFormatInfoImpl_fo extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MM-yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd-MM-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "fyrir Krist",
-        "eftir Krist"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "f.Kr.",
-        "e.Kr."
-    };
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januar",
-        "februar",
-        "mars",
-        "apríl",
-        "mai",
-        "juni",
-        "juli",
-        "august",
-        "september",
-        "oktober",
-        "november",
-        "desember"
-    };
-  }
-
-  @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[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "mai",
-        "jun",
-        "jul",
-        "aug",
-        "sep",
-        "okt",
-        "nov",
-        "des"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. kvartal",
-        "2. kvartal",
-        "3. kvartal",
-        "4. kvartal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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[] { 
-        "sunnudagur",
-        "mánadagur",
-        "týsdagur",
-        "mikudagur",
-        "hósdagur",
-        "fríggjadagur",
-        "leygardagur"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "sun",
-        "mán",
-        "týs",
-        "mik",
-        "hós",
-        "frí",
-        "ley"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr.java
deleted file mode 100644
index 569cf0a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "fr".
- */
-public class DateTimeFormatInfoImpl_fr extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "avant Jésus-Christ",
-        "après Jésus-Christ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "av. J.-C.",
-        "ap. J.-C."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "'T'QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "'T'Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "janvier",
-        "février",
-        "mars",
-        "avril",
-        "mai",
-        "juin",
-        "juillet",
-        "août",
-        "septembre",
-        "octobre",
-        "novembre",
-        "décembre"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "janv.",
-        "févr.",
-        "mars",
-        "avr.",
-        "mai",
-        "juin",
-        "juil.",
-        "août",
-        "sept.",
-        "oct.",
-        "nov.",
-        "déc."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1er trimestre",
-        "2e trimestre",
-        "3e trimestre",
-        "4e trimestre"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "T1",
-        "T2",
-        "T3",
-        "T4"
-    };
-  }
-
-  @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[] { 
-        "dimanche",
-        "lundi",
-        "mardi",
-        "mercredi",
-        "jeudi",
-        "vendredi",
-        "samedi"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "D",
-        "L",
-        "M",
-        "M",
-        "J",
-        "V",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "dim.",
-        "lun.",
-        "mar.",
-        "mer.",
-        "jeu.",
-        "ven.",
-        "sam."
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr_BE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr_BE.java
deleted file mode 100644
index cf5d04c..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr_BE.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "fr_BE".
- */
-public class DateTimeFormatInfoImpl_fr_BE extends DateTimeFormatInfoImpl_fr {
-
-  @Override
-  public String dateFormatShort() {
-    return "d/MM/yy";
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H 'h' mm 'min' ss 's' zzzz";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr_CA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr_CA.java
deleted file mode 100644
index 235cdc0..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr_CA.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "fr_CA".
- */
-public class DateTimeFormatInfoImpl_fr_CA extends DateTimeFormatInfoImpl_fr {
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy-MM-dd";
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M-d";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy-MM";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y-M-d";
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "HH 'h' mm 'min' ss 's' zzzz";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr_CH.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr_CH.java
deleted file mode 100644
index a485768..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fr_CH.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "fr_CH".
- */
-public class DateTimeFormatInfoImpl_fr_CH extends DateTimeFormatInfoImpl_fr {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "HH.mm:ss 'h' zzzz";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fur.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fur.java
deleted file mode 100644
index 6204feb..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_fur.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "fur".
- */
-public class DateTimeFormatInfoImpl_fur extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "a.",
-        "p."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d 'di' MMMM 'dal' y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d 'di' MMMM 'dal' y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "pdC",
-        "ddC"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "pdC",
-        "ddC"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Zenâr",
-        "Fevrâr",
-        "Març",
-        "Avrîl",
-        "Mai",
-        "Jugn",
-        "Lui",
-        "Avost",
-        "Setembar",
-        "Otubar",
-        "Novembar",
-        "Dicembar"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "Z",
-        "F",
-        "M",
-        "A",
-        "M",
-        "J",
-        "L",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Zen",
-        "Fev",
-        "Mar",
-        "Avr",
-        "Mai",
-        "Jug",
-        "Lui",
-        "Avo",
-        "Set",
-        "Otu",
-        "Nov",
-        "Dic"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Prin trimestri",
-        "Secont trimestri",
-        "Tierç trimestri",
-        "Cuart trimestri"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "T1",
-        "T2",
-        "T3",
-        "T4"
-    };
-  }
-
-  @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[] { 
-        "domenie",
-        "lunis",
-        "martars",
-        "miercus",
-        "joibe",
-        "vinars",
-        "sabide"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "D",
-        "L",
-        "M",
-        "M",
-        "J",
-        "V",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "dom",
-        "lun",
-        "mar",
-        "mie",
-        "joi",
-        "vin",
-        "sab"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ga.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ga.java
deleted file mode 100644
index 644aa7e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ga.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ga".
- */
-public class DateTimeFormatInfoImpl_ga extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "a.m.",
-        "p.m."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Roimh Chríost",
-        "Anno Domini"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "RC",
-        "AD"
-    };
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Eanáir",
-        "Feabhra",
-        "Márta",
-        "Aibreán",
-        "Bealtaine",
-        "Meitheamh",
-        "Iúil",
-        "Lúnasa",
-        "Meán Fómhair",
-        "Deireadh Fómhair",
-        "Samhain",
-        "Nollaig"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "E",
-        "F",
-        "M",
-        "A",
-        "B",
-        "M",
-        "I",
-        "L",
-        "M",
-        "D",
-        "S",
-        "N"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Ean",
-        "Feabh",
-        "Márta",
-        "Aib",
-        "Beal",
-        "Meith",
-        "Iúil",
-        "Lún",
-        "MFómh",
-        "DFómh",
-        "Samh",
-        "Noll"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1ú ráithe",
-        "2ú ráithe",
-        "3ú ráithe",
-        "4ú ráithe"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "R1",
-        "R2",
-        "R3",
-        "R4"
-    };
-  }
-
-  @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[] { 
-        "Dé Domhnaigh",
-        "Dé Luain",
-        "Dé Máirt",
-        "Dé Céadaoin",
-        "Déardaoin",
-        "Dé hAoine",
-        "Dé Sathairn"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "D",
-        "L",
-        "M",
-        "C",
-        "D",
-        "A",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Domh",
-        "Luan",
-        "Máirt",
-        "Céad",
-        "Déar",
-        "Aoine",
-        "Sath"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gaa.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gaa.java
deleted file mode 100644
index b87e890..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gaa.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "gaa".
- */
-public class DateTimeFormatInfoImpl_gaa extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "LB",
-        "SN"
-    };
-  }
-
-  @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[] { 
-        "Dani Jesu",
-        "KJ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "DJ",
-        "KJ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Aharabata",
-        "Oflo",
-        "Ochokrikri",
-        "Abeibee",
-        "Agbeinaa",
-        "Otukwadan",
-        "Maawe",
-        "Manyawale",
-        "Gbo",
-        "Anton",
-        "Alemle",
-        "Afuabee"
-    };
-  }
-
-  @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[] { 
-        "Aha",
-        "Ofl",
-        "Och",
-        "Abe",
-        "Agb",
-        "Otu",
-        "Maa",
-        "Man",
-        "Gbo",
-        "Ant",
-        "Ale",
-        "Afu"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Hogbaa",
-        "Dzu",
-        "Dzufo",
-        "Sho",
-        "Soo",
-        "Sohaa",
-        "Ho"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Ho",
-        "Dzu",
-        "Dzf",
-        "Sho",
-        "Soo",
-        "Soh",
-        "Ho"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gez.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gez.java
deleted file mode 100644
index 6c8dd70..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gez.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "gez".
- */
-public class DateTimeFormatInfoImpl_gez extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ጽባሕ",
-        "ምሴት"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE፥ dd MMMM መዓልት y G";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ዓ/ዓ",
-        "ዓ/ም"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ዓ/ዓ",
-        "ዓ/ም"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ጠሐረ",
-        "ከተተ",
-        "መገበ",
-        "አኀዘ",
-        "ግንባት",
-        "ሠንየ",
-        "ሐመለ",
-        "ነሐሰ",
-        "ከረመ",
-        "ጠቀመ",
-        "ኀደረ",
-        "ኀሠሠ"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ጠ",
-        "ከ",
-        "መ",
-        "አ",
-        "ግ",
-        "ሠ",
-        "ሐ",
-        "ነ",
-        "ከ",
-        "ጠ",
-        "ኀ",
-        "ኀ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ጠሐረ",
-        "ከተተ",
-        "መገበ",
-        "አኀዘ",
-        "ግንባ",
-        "ሠንየ",
-        "ሐመለ",
-        "ነሐሰ",
-        "ከረመ",
-        "ጠቀመ",
-        "ኀደረ",
-        "ኀሠሠ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "እኁድ",
-        "ሰኑይ",
-        "ሠሉስ",
-        "ራብዕ",
-        "ሐሙስ",
-        "ዓርበ",
-        "ቀዳሚት"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "እ",
-        "ሰ",
-        "ሠ",
-        "ራ",
-        "ሐ",
-        "ዓ",
-        "ቀ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "እኁድ",
-        "ሰኑይ",
-        "ሠሉስ",
-        "ራብዕ",
-        "ሐሙስ",
-        "ዓርበ",
-        "ቀዳሚ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gez_ER.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gez_ER.java
deleted file mode 100644
index a44e92a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gez_ER.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "gez_ER".
- */
-public class DateTimeFormatInfoImpl_gez_ER extends DateTimeFormatInfoImpl_gez {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gez_ET.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gez_ET.java
deleted file mode 100644
index a50c815..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gez_ET.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "gez_ET".
- */
-public class DateTimeFormatInfoImpl_gez_ET extends DateTimeFormatInfoImpl_gez {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
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
deleted file mode 100644
index 5b57e0e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gl.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "gl".
- */
-public class DateTimeFormatInfoImpl_gl extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "antes de Cristo",
-        "despois de Cristo"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "a.C.",
-        "d.C."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Xaneiro",
-        "Febreiro",
-        "Marzo",
-        "Abril",
-        "Maio",
-        "Xuño",
-        "Xullo",
-        "Agosto",
-        "Setembro",
-        "Outubro",
-        "Novembro",
-        "Decembro"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "X",
-        "F",
-        "M",
-        "A",
-        "M",
-        "X",
-        "X",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Xan",
-        "Feb",
-        "Mar",
-        "Abr",
-        "Mai",
-        "Xuñ",
-        "Xul",
-        "Ago",
-        "Set",
-        "Out",
-        "Nov",
-        "Dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1o trimestre",
-        "2o trimestre",
-        "3o trimestre",
-        "4o trimestre"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "T1",
-        "T2",
-        "T3",
-        "T4"
-    };
-  }
-
-  @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[] { 
-        "Domingo",
-        "Luns",
-        "Martes",
-        "Mércores",
-        "Xoves",
-        "Venres",
-        "Sábado"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "D",
-        "L",
-        "M",
-        "M",
-        "X",
-        "V",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Dom",
-        "Lun",
-        "Mar",
-        "Mér",
-        "Xov",
-        "Ven",
-        "Sáb"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gsw.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gsw.java
deleted file mode 100644
index 2db6b47..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gsw.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "gsw".
- */
-public class DateTimeFormatInfoImpl_gsw extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "vorm.",
-        "nam."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.MM.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "v. Chr.",
-        "n. Chr."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "v. Chr.",
-        "n. Chr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d. MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M.";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy-M";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d. MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Januar",
-        "Februar",
-        "März",
-        "April",
-        "Mai",
-        "Juni",
-        "Juli",
-        "Auguscht",
-        "Septämber",
-        "Oktoober",
-        "Novämber",
-        "Dezämber"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Jan",
-        "Feb",
-        "Mär",
-        "Apr",
-        "Mai",
-        "Jun",
-        "Jul",
-        "Aug",
-        "Sep",
-        "Okt",
-        "Nov",
-        "Dez"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. Quartal",
-        "2. Quartal",
-        "3. Quartal",
-        "4. Quartal"
-    };
-  }
-
-  @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[] { 
-        "Sunntig",
-        "Määntig",
-        "Ziischtig",
-        "Mittwuch",
-        "Dunschtig",
-        "Friitig",
-        "Samschtig"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "D",
-        "M",
-        "D",
-        "F",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Su.",
-        "Mä.",
-        "Zi.",
-        "Mi.",
-        "Du.",
-        "Fr.",
-        "Sa."
-    };
-  }
-
-  @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
deleted file mode 100644
index 5ec5432..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gu.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "gu".
- */
-public class DateTimeFormatInfoImpl_gu extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "am",
-        "pm"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM, y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM, y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d-MM-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ઈસવીસન પૂર્વે",
-        "ઇસવીસન"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "જાન્યુઆરી",
-        "ફેબ્રુઆરી",
-        "માર્ચ",
-        "એપ્રિલ",
-        "મે",
-        "જૂન",
-        "જુલાઈ",
-        "ઑગસ્ટ",
-        "સપ્ટેમ્બર",
-        "ઑક્ટ્બર",
-        "નવેમ્બર",
-        "ડિસેમ્બર"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "જા",
-        "ફે",
-        "મા",
-        "એ",
-        "મે",
-        "જૂ",
-        "જુ",
-        "ઑ",
-        "સ",
-        "ઑ",
-        "ન",
-        "ડિ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "જાન્યુ",
-        "ફેબ્રુ",
-        "માર્ચ",
-        "એપ્રિલ",
-        "મે",
-        "જૂન",
-        "જુલાઈ",
-        "ઑગસ્ટ",
-        "સપ્ટે",
-        "ઑક્ટો",
-        "નવે",
-        "ડિસે"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "પહલી ત્રિમાસિક",
-        "બીજી ત્રિમાસિક",
-        "ત્રીજી ત્રિમાસિક",
-        "ચૌથી ત્રિમાસિક"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "ત્રિમાસિક ૧",
-        "ત્રિમાસિક ૨",
-        "ત્રિમાસિક ૩",
-        "ત્રિમાસિક ૪"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "hh:mm:ss a zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "hh:mm:ss a z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "રવિવાર",
-        "સોમવાર",
-        "મંગળવાર",
-        "બુધવાર",
-        "ગુરુવાર",
-        "શુક્રવાર",
-        "શનિવાર"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ર",
-        "સો",
-        "મં",
-        "બુ",
-        "ગુ",
-        "શુ",
-        "શ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_gv.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gv.java
deleted file mode 100644
index 1ac269b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_gv.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "gv".
- */
-public class DateTimeFormatInfoImpl_gv extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "a.m.",
-        "p.m."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "MMM dd, y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "RC",
-        "AD"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "RC",
-        "AD"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Jerrey-geuree",
-        "Toshiaght-arree",
-        "Mayrnt",
-        "Averil",
-        "Boaldyn",
-        "Mean-souree",
-        "Jerrey-souree",
-        "Luanistyn",
-        "Mean-fouyir",
-        "Jerrey-fouyir",
-        "Mee Houney",
-        "Mee ny Nollick"
-    };
-  }
-
-  @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[] { 
-        "J-guer",
-        "T-arree",
-        "Mayrnt",
-        "Avrril",
-        "Boaldyn",
-        "M-souree",
-        "J-souree",
-        "Luanistyn",
-        "M-fouyir",
-        "J-fouyir",
-        "M.Houney",
-        "M.Nollick"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Jedoonee",
-        "Jelhein",
-        "Jemayrt",
-        "Jercean",
-        "Jerdein",
-        "Jeheiney",
-        "Jesarn"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Jed",
-        "Jel",
-        "Jem",
-        "Jerc",
-        "Jerd",
-        "Jeh",
-        "Jes"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ha.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ha.java
deleted file mode 100644
index ba11f8d..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ha.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ha".
- */
-public class DateTimeFormatInfoImpl_ha extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM, y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM, y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/M/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Gabanin Miladi",
-        "Miladi"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "GM",
-        "M"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Janairu",
-        "Fabrairu",
-        "Maris",
-        "Afrilu",
-        "Mayu",
-        "Yuni",
-        "Yuli",
-        "Augusta",
-        "Satumba",
-        "Oktoba",
-        "Nuwamba",
-        "Disamba"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "J",
-        "F",
-        "M",
-        "A",
-        "M",
-        "Y",
-        "Y",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Jan",
-        "Fab",
-        "Mar",
-        "Afr",
-        "May",
-        "Yun",
-        "Yul",
-        "Aug",
-        "Sat",
-        "Okt",
-        "Nuw",
-        "Dis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Lahadi",
-        "Litini",
-        "Talata",
-        "Laraba",
-        "Alhamis",
-        "Jumma'a",
-        "Asabar"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "L",
-        "L",
-        "T",
-        "L",
-        "A",
-        "J",
-        "A"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Lah",
-        "Lit",
-        "Tal",
-        "Lar",
-        "Alh",
-        "Jum",
-        "Asa"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ha_Arab.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ha_Arab.java
deleted file mode 100644
index 7d99ba8..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ha_Arab.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ha_Arab".
- */
-public class DateTimeFormatInfoImpl_ha_Arab extends DateTimeFormatInfoImpl_ha {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "A.M.",
-        "P.M."
-    };
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "غَبَنِنْ مِلَدِ",
-        "مِلَدِ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "غَبَنِنْ مِلَدِ",
-        "مِلَدِ"
-    };
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "جَنَيْرُ",
-        "ڢَبْرَيْرُ",
-        "مَرِسْ",
-        "أَڢْرِلُ",
-        "مَيُ",
-        "يُونِ",
-        "يُولِ",
-        "أَغُسْتَ",
-        "سَتُمْبَ",
-        "أُكْتوُبَ",
-        "نُوَمْبَ",
-        "دِسَمْبَ"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "جَن",
-        "ڢَب",
-        "مَر",
-        "أَڢْر",
-        "مَي",
-        "يُون",
-        "يُول",
-        "أَغُ",
-        "سَت",
-        "أُكْت",
-        "نُو",
-        "دِس"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "لَحَدِ",
-        "لِتِنِنْ",
-        "تَلَتَ",
-        "لَرَبَ",
-        "أَلْحَمِسْ",
-        "جُمَعَ",
-        "أَسَبَرْ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "لَح",
-        "لِت",
-        "تَل",
-        "لَر",
-        "أَلْح",
-        "جُم",
-        "أَسَ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ha_SD.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ha_SD.java
deleted file mode 100644
index 735eabd..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ha_SD.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ha_SD".
- */
-public class DateTimeFormatInfoImpl_ha_SD extends DateTimeFormatInfoImpl_ha {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "A.M.",
-        "P.M."
-    };
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "غَبَنِنْ مِلَدِ",
-        "مِلَدِ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "غَبَنِنْ مِلَدِ",
-        "مِلَدِ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "جَنَيْرُ",
-        "ڢَبْرَيْرُ",
-        "مَرِسْ",
-        "أَڢْرِلُ",
-        "مَيُ",
-        "يُونِ",
-        "يُولِ",
-        "أَغُسْتَ",
-        "سَتُمْبَ",
-        "أُكْتوُبَ",
-        "نُوَمْبَ",
-        "دِسَمْبَ"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "جَن",
-        "ڢَب",
-        "مَر",
-        "أَڢْر",
-        "مَي",
-        "يُون",
-        "يُول",
-        "أَغُ",
-        "سَت",
-        "أُكْت",
-        "نُو",
-        "دِس"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "لَحَدِ",
-        "لِتِنِنْ",
-        "تَلَتَ",
-        "لَرَبَ",
-        "أَلْحَمِسْ",
-        "جُمَعَ",
-        "أَسَبَرْ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_haw.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_haw.java
deleted file mode 100644
index 5f0ebca..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_haw.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "haw".
- */
-public class DateTimeFormatInfoImpl_haw extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/M/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Ianuali",
-        "Pepeluali",
-        "Malaki",
-        "ʻApelila",
-        "Mei",
-        "Iune",
-        "Iulai",
-        "ʻAukake",
-        "Kepakemapa",
-        "ʻOkakopa",
-        "Nowemapa",
-        "Kekemapa"
-    };
-  }
-
-  @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[] { 
-        "Ian.",
-        "Pep.",
-        "Mal.",
-        "ʻAp.",
-        "Mei",
-        "Iun.",
-        "Iul.",
-        "ʻAu.",
-        "Kep.",
-        "ʻOk.",
-        "Now.",
-        "Kek."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Lāpule",
-        "Poʻakahi",
-        "Poʻalua",
-        "Poʻakolu",
-        "Poʻahā",
-        "Poʻalima",
-        "Poʻaono"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "LP",
-        "P1",
-        "P2",
-        "P3",
-        "P4",
-        "P5",
-        "P6"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_haw_US.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_haw_US.java
deleted file mode 100644
index 297f3e5..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_haw_US.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "haw_US".
- */
-public class DateTimeFormatInfoImpl_haw_US extends DateTimeFormatInfoImpl_haw {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    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
deleted file mode 100644
index 22e8538..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_he.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "he".
- */
-public class DateTimeFormatInfoImpl_he extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "לפנה\"צ",
-        "אחה\"צ"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d בMMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d בMMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "לפני הספירה",
-        "לספירה"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "לפנה״ס",
-        "לסה״נ"
-    };
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d בMMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d בMMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d בMMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d בMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d בMMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d בMMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "yyyy QQQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "yyyy Q";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ינואר",
-        "פברואר",
-        "מרס",
-        "אפריל",
-        "מאי",
-        "יוני",
-        "יולי",
-        "אוגוסט",
-        "ספטמבר",
-        "אוקטובר",
-        "נובמבר",
-        "דצמבר"
-    };
-  }
-
-  @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[] { 
-        "ינו",
-        "פבר",
-        "מרס",
-        "אפר",
-        "מאי",
-        "יונ",
-        "יול",
-        "אוג",
-        "ספט",
-        "אוק",
-        "נוב",
-        "דצמ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @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 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[] { 
-        "יום ראשון",
-        "יום שני",
-        "יום שלישי",
-        "יום רביעי",
-        "יום חמישי",
-        "יום שישי",
-        "יום שבת"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "א",
-        "ב",
-        "ג",
-        "ד",
-        "ה",
-        "ו",
-        "ש"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "יום א'",
-        "יום ב'",
-        "יום ג'",
-        "יום ד'",
-        "יום ה'",
-        "יום ו'",
-        "שבת"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @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_hi.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hi.java
deleted file mode 100644
index 454cc7f..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hi.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "hi".
- */
-public class DateTimeFormatInfoImpl_hi extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MM-yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d-M-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ईसापूर्व",
-        "सन"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ईसापूर्व",
-        "सन"
-    };
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "जनवरी",
-        "फरवरी",
-        "मार्च",
-        "अप्रैल",
-        "मई",
-        "जून",
-        "जुलाई",
-        "अगस्त",
-        "सितम्बर",
-        "अक्तूबर",
-        "नवम्बर",
-        "दिसम्बर"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ज",
-        "फ़",
-        "मा",
-        "अ",
-        "म",
-        "जू",
-        "जु",
-        "अ",
-        "सि",
-        "अ",
-        "न",
-        "दि"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "जनवरी",
-        "फरवरी",
-        "मार्च",
-        "अप्रैल",
-        "मई",
-        "जून",
-        "जुलाई",
-        "अगस्त",
-        "सितम्बर",
-        "अक्तूबर",
-        "नवम्बर",
-        "दिसम्बर"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "प्रथम चौथाई",
-        "द्वितीय चौथाई",
-        "तृतीय चौथाई",
-        "चतुर्थ चौथाई"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "प्रथम चौथाई",
-        "द्वितीय चौथाई",
-        "तृतीय चौथाई",
-        "चतुर्थ चौथाई"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "रविवार",
-        "सोमवार",
-        "मंगलवार",
-        "बुधवार",
-        "गुरुवार",
-        "शुक्रवार",
-        "शनिवार"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "र",
-        "सो",
-        "मं",
-        "बु",
-        "गु",
-        "शु",
-        "श"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_hr.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hr.java
deleted file mode 100644
index 9440857..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hr.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "hr".
- */
-public class DateTimeFormatInfoImpl_hr extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d. MMMM y.";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMMM y.";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d.M.yyyy.";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yyyy.";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Prije Krista",
-        "Poslije Krista"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "pr.n.e.",
-        "AD"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String formatMonthAbbrev() {
-    return "LLL.";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFull() {
-    return "LLLL.";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d.MMMM.";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M.";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM.y.";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y.";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM.y.";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y.";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.yyyy.";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d. M. y.";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d. MMM y.";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ. yyyy.";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q. yyyy.";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "siječnja",
-        "veljače",
-        "ožujka",
-        "travnja",
-        "svibnja",
-        "lipnja",
-        "srpnja",
-        "kolovoza",
-        "rujna",
-        "listopada",
-        "studenoga",
-        "prosinca"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "siječanj",
-        "veljača",
-        "ožujak",
-        "travanj",
-        "svibanj",
-        "lipanj",
-        "srpanj",
-        "kolovoz",
-        "rujan",
-        "listopad",
-        "studeni",
-        "prosinac"
-    };
-  }
-
-  @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[] { 
-        "01.",
-        "02.",
-        "03.",
-        "04.",
-        "05.",
-        "06.",
-        "07.",
-        "08.",
-        "09.",
-        "10.",
-        "11.",
-        "12."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. kvartal",
-        "2. kvartal",
-        "3. kvartal",
-        "4. kvartal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "1kv",
-        "2kv",
-        "3kv",
-        "4kv"
-    };
-  }
-
-  @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[] { 
-        "nedjelja",
-        "ponedjeljak",
-        "utorak",
-        "srijeda",
-        "četvrtak",
-        "petak",
-        "subota"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "n",
-        "p",
-        "u",
-        "s",
-        "č",
-        "p",
-        "s"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ned",
-        "pon",
-        "uto",
-        "sri",
-        "čet",
-        "pet",
-        "sub"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index 3e19d46..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hu.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "hu".
- */
-public class DateTimeFormatInfoImpl_hu extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "de.",
-        "du."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "y. MMMM d., EEEE";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y. MMMM d.";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy.MM.dd.";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy.MM.dd.";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "időszámításunk előtt",
-        "időszámításunk szerint"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "i. e.",
-        "i. sz."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "MMM d.";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "MMMM d.";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M.d.";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "y. MMM";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "y. MMM d.";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "y. MMMM";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "y. MMMM d.";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "y.M";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y.M.d.";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "y. MMM d., EEE";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "y/QQQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "y/Q";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "január",
-        "február",
-        "március",
-        "április",
-        "május",
-        "június",
-        "július",
-        "augusztus",
-        "szeptember",
-        "október",
-        "november",
-        "december"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "J",
-        "F",
-        "M",
-        "Á",
-        "M",
-        "J",
-        "J",
-        "A",
-        "Sz",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan.",
-        "febr.",
-        "márc.",
-        "ápr.",
-        "máj.",
-        "jún.",
-        "júl.",
-        "aug.",
-        "szept.",
-        "okt.",
-        "nov.",
-        "dec."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "I. negyedév",
-        "II. negyedév",
-        "III. negyedév",
-        "IV. negyedév"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "N1",
-        "N2",
-        "N3",
-        "N4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "vasárnap",
-        "hétfő",
-        "kedd",
-        "szerda",
-        "csütörtök",
-        "péntek",
-        "szombat"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "V",
-        "H",
-        "K",
-        "Sz",
-        "Cs",
-        "P",
-        "Sz"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "V",
-        "H",
-        "K",
-        "Sze",
-        "Cs",
-        "P",
-        "Szo"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hy.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hy.java
deleted file mode 100644
index cca8a18..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_hy.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "hy".
- */
-public class DateTimeFormatInfoImpl_hy extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "Առ․",
-        "Եր․"
-    };
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "MMMM dd, y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "MM/dd/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Ք․Ա․",
-        "Ք․Ե․"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "Ք․Ա․",
-        "Ք․Ե․"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Յունուար",
-        "Փետրուար",
-        "Մարտ",
-        "Ապրիլ",
-        "Մայիս",
-        "Յունիս",
-        "Յուլիս",
-        "Օգոստոս",
-        "Սեպտեմբեր",
-        "Հոկտեմբեր",
-        "Նոյեմբեր",
-        "Դեկտեմբեր"
-    };
-  }
-
-  @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[] { 
-        "Յնր",
-        "Փտր",
-        "Մրտ",
-        "Ապր",
-        "Մյս",
-        "Յնս",
-        "Յլս",
-        "Օգս",
-        "Սեպ",
-        "Հոկ",
-        "Նոյ",
-        "Դեկ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Կիրակի",
-        "Երկուշաբթի",
-        "Երեքշաբթի",
-        "Չորեքշաբթի",
-        "Հինգշաբթի",
-        "Ուրբաթ",
-        "Շաբաթ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Կիր",
-        "Երկ",
-        "Երք",
-        "Չոր",
-        "Հնգ",
-        "Ուր",
-        "Շաբ"
-    };
-  }
-
-  @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
deleted file mode 100644
index b3619f8..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ia.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ia".
- */
-public class DateTimeFormatInfoImpl_ia extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    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[] { 
-        "ante Christo",
-        "post Christo"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "a.Chr.",
-        "p.Chr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januario",
-        "februario",
-        "martio",
-        "april",
-        "maio",
-        "junio",
-        "julio",
-        "augusto",
-        "septembre",
-        "octobre",
-        "novembre",
-        "decembre"
-    };
-  }
-
-  @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[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "mai",
-        "jun",
-        "jul",
-        "aug",
-        "sep",
-        "oct",
-        "nov",
-        "dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1-me trimestre",
-        "2-nde trimestre",
-        "3-tie trimestre",
-        "4-te trimestre"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "T1",
-        "T2",
-        "T3",
-        "T4"
-    };
-  }
-
-  @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[] { 
-        "dominica",
-        "lunedi",
-        "martedi",
-        "mercuridi",
-        "jovedi",
-        "venerdi",
-        "sabbato"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "dom",
-        "lun",
-        "mar",
-        "mer",
-        "jov",
-        "ven",
-        "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
deleted file mode 100644
index 1a3269a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_id.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "id".
- */
-public class DateTimeFormatInfoImpl_id extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, dd MMMM yyyy";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM yyyy";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "HH.mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "HH.mm.ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Januari",
-        "Februari",
-        "Maret",
-        "April",
-        "Mei",
-        "Juni",
-        "Juli",
-        "Agustus",
-        "September",
-        "Oktober",
-        "November",
-        "Desember"
-    };
-  }
-
-  @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[] { 
-        "Jan",
-        "Feb",
-        "Mar",
-        "Apr",
-        "Mei",
-        "Jun",
-        "Jul",
-        "Agu",
-        "Sep",
-        "Okt",
-        "Nov",
-        "Des"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "kuartal pertama",
-        "kuartal kedua",
-        "kuartal ketiga",
-        "kuartal keempat"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H: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[] { 
-        "Minggu",
-        "Senin",
-        "Selasa",
-        "Rabu",
-        "Kamis",
-        "Jumat",
-        "Sabtu"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Min",
-        "Sen",
-        "Sel",
-        "Rab",
-        "Kam",
-        "Jum",
-        "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
deleted file mode 100644
index 0ad72ea..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ig.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ig".
- */
-public class DateTimeFormatInfoImpl_ig extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    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[] { 
-        "Tupu Kristi",
-        "Afọ Kristi"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "T.K.",
-        "A.K."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Jenụwarị",
-        "Febrụwarị",
-        "Maachị",
-        "Eprel",
-        "Mee",
-        "Juun",
-        "Julaị",
-        "Ọgọọst",
-        "Septemba",
-        "Ọktoba",
-        "Novemba",
-        "Disemba"
-    };
-  }
-
-  @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[] { 
-        "Jen",
-        "Feb",
-        "Maa",
-        "Epr",
-        "Mee",
-        "Juu",
-        "Jul",
-        "Ọgọ",
-        "Sep",
-        "Ọkt",
-        "Nov",
-        "Dis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Mbọsị Ụka",
-        "Mọnde",
-        "Tiuzdee",
-        "Wenezdee",
-        "Tọọzdee",
-        "Fraịdee",
-        "Satọdee"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Ụka",
-        "Mọn",
-        "Tiu",
-        "Wen",
-        "Tọọ",
-        "Fraị",
-        "Sat"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ii.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ii.java
deleted file mode 100644
index c53a35e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ii.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ii".
- */
-public class DateTimeFormatInfoImpl_ii extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    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 "yyyy-MM-dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ꃅꋊꂿ",
-        "ꃅꋊꊂ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ꃅꋊꂿ",
-        "ꃅꋊꊂ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ꋍꆪ",
-        "ꑍꆪ",
-        "ꌕꆪ",
-        "ꇖꆪ",
-        "ꉬꆪ",
-        "ꃘꆪ",
-        "ꏃꆪ",
-        "ꉆꆪ",
-        "ꈬꆪ",
-        "ꊰꆪ",
-        "ꊰꊪꆪ",
-        "ꊰꑋꆪ"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "ꃅꑌ",
-        "ꃅꎸ",
-        "ꃅꍵ",
-        "ꃅꋆ"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "ꃅꑌ",
-        "ꃅꎸ",
-        "ꃅꍵ",
-        "ꃅꋆ"
-    };
-  }
-
-  @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[] { 
-        "ꑭꆏꑍ",
-        "ꆏꊂꋍ",
-        "ꆏꊂꑍ",
-        "ꆏꊂꌕ",
-        "ꆏꊂꇖ",
-        "ꆏꊂꉬ",
-        "ꆏꊂꃘ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ꆏ",
-        "ꋍ",
-        "ꑍ",
-        "ꌕ",
-        "ꇖ",
-        "ꉬ",
-        "ꃘ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ꆏꑍ",
-        "ꆏꋍ",
-        "ꆏꑍ",
-        "ꆏꌕ",
-        "ꆏꇖ",
-        "ꆏꉬ",
-        "ꆏꃘ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ii_CN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ii_CN.java
deleted file mode 100644
index 652bef0..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ii_CN.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ii_CN".
- */
-public class DateTimeFormatInfoImpl_ii_CN extends DateTimeFormatInfoImpl_ii {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_is.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_is.java
deleted file mode 100644
index 7853afa..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_is.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "is".
- */
-public class DateTimeFormatInfoImpl_is extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "f.h.",
-        "e.h."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d.M.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d.M.yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "fyrir Krist",
-        "eftir Krist"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "fyrir Krist",
-        "eftir Krist"
-    };
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d. MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M. yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d. MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ. yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q. yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "janúar",
-        "febrúar",
-        "mars",
-        "apríl",
-        "maí",
-        "júní",
-        "júlí",
-        "ágúst",
-        "september",
-        "október",
-        "nóvember",
-        "desember"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "j",
-        "f",
-        "m",
-        "a",
-        "m",
-        "j",
-        "j",
-        "á",
-        "s",
-        "o",
-        "n",
-        "d"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "maí",
-        "jún",
-        "júl",
-        "ágú",
-        "sep",
-        "okt",
-        "nóv",
-        "des"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1st fjórðungur",
-        "2nd fjórðungur",
-        "3rd fjórðungur",
-        "4th fjórðungur"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "F1",
-        "F2",
-        "F3",
-        "F4"
-    };
-  }
-
-  @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[] { 
-        "sunnudagur",
-        "mánudagur",
-        "þriðjudagur",
-        "miðvikudagur",
-        "fimmtudagur",
-        "föstudagur",
-        "laugardagur"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "s",
-        "m",
-        "þ",
-        "m",
-        "f",
-        "f",
-        "l"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "sun",
-        "mán",
-        "þri",
-        "mið",
-        "fim",
-        "fös",
-        "lau"
-    };
-  }
-
-  @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
deleted file mode 100644
index e8c6cc9..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_it.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "it".
- */
-public class DateTimeFormatInfoImpl_it extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "m.",
-        "p."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd/MMM/y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "a.C.",
-        "d.C"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "aC",
-        "dC"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ-yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q-yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "gennaio",
-        "febbraio",
-        "marzo",
-        "aprile",
-        "maggio",
-        "giugno",
-        "luglio",
-        "agosto",
-        "settembre",
-        "ottobre",
-        "novembre",
-        "dicembre"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "Gennaio",
-        "Febbraio",
-        "Marzo",
-        "Aprile",
-        "Maggio",
-        "Giugno",
-        "Luglio",
-        "Agosto",
-        "Settembre",
-        "Ottobre",
-        "Novembre",
-        "Dicembre"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "G",
-        "F",
-        "M",
-        "A",
-        "M",
-        "G",
-        "L",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "gen",
-        "feb",
-        "mar",
-        "apr",
-        "mag",
-        "giu",
-        "lug",
-        "ago",
-        "set",
-        "ott",
-        "nov",
-        "dic"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1o trimestre",
-        "2o trimestre",
-        "3o trimestre",
-        "4o trimestre"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "T1",
-        "T2",
-        "T3",
-        "T4"
-    };
-  }
-
-  @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[] { 
-        "domenica",
-        "lunedì",
-        "martedì",
-        "mercoledì",
-        "giovedì",
-        "venerdì",
-        "sabato"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return new String[] { 
-        "Domenica",
-        "Lunedì",
-        "Martedì",
-        "Mercoledì",
-        "Giovedì",
-        "Venerdì",
-        "Sabato"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "D",
-        "L",
-        "M",
-        "M",
-        "G",
-        "V",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "dom",
-        "lun",
-        "mar",
-        "mer",
-        "gio",
-        "ven",
-        "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
deleted file mode 100644
index 582ab1a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_it_CH.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "it_CH".
- */
-public class DateTimeFormatInfoImpl_it_CH extends DateTimeFormatInfoImpl_it {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "HH.mm:ss 'h' zzzz";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_iu.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_iu.java
deleted file mode 100644
index 5b5eb61..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_iu.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "iu".
- */
-public class DateTimeFormatInfoImpl_iu 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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ᔭᓐᓄᐊᓕ",
-        "ᕕᕝᕗᐊᓕ",
-        "ᒫᑦᓯ",
-        "ᐊᐃᑉᐳᓗ",
-        "ᒪᐃ",
-        "ᔫᓂ",
-        "ᔪᓚᐃ",
-        "ᐊᐅᒡᒍᓯ",
-        "ᓰᑦᑏᕝᕙ",
-        "ᐆᑦᑑᕝᕙ",
-        "ᓅᕙᐃᕝᕙ",
-        "ᑏᓰᕝᕙ"
-    };
-  }
-
-  @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[] { 
-        "ᔭᓐᓄᐊᓕ",
-        "ᕕᕝᕗᐊᓕ",
-        "ᒫᑦᓯ",
-        "ᐊᐃᑉᐳᓗ",
-        "ᒪᐃ",
-        "ᔫᓂ",
-        "ᔪᓚᐃ",
-        "ᐊᐅᒡᒍᓯ",
-        "ᓰᑦᑏᕝᕙ",
-        "ᐆᑦᑑᕝᕙ",
-        "ᓅᕙᐃᕝᕙ",
-        "ᑏᓰᕝᕙ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "ᓈᑦᓰᖑᔭ",
-        "ᓇᒡᒐᔾᔭᐅ",
-        "ᓇᒡᒐᔾᔭᐅᓕᖅᑭ",
-        "ᐱᖓᑦᓯᖅ",
-        "ᓯᑕᒻᒥᖅ",
-        "ᑕᓪᓕᕐᒥᖅ",
-        "ᓈᑦᓰᖑᔭᓕᖅᕿ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ᓈᑦᓰᖑᔭ",
-        "ᓇᒡᒐᔾᔭᐅ",
-        "ᓇᒡᒐᔾᔭᐅᓕᖅᑭ",
-        "ᐱᖓᑦᓯᖅ",
-        "ᓯᑕᒻᒥᖅ",
-        "ᑕᓪᓕᕐᒥᖅ",
-        "ᓈᑦᓰᖑᔭᓕᖅᕿ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ja.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ja.java
deleted file mode 100644
index 0db7ea1..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ja.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ja".
- */
-public class DateTimeFormatInfoImpl_ja extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "午前",
-        "午後"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "y年M月d日EEEE";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y年M月d日";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy/MM/dd";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/MM/dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "紀元前",
-        "西暦"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "紀元前",
-        "西暦"
-    };
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "ah:mm";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "ah:mm:ss";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "M月d日";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "M月d日";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "M月d日(EEEE)";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "y年M月";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "y年M月d日";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "y年M月";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "y年M月d日";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "y/M";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y年M月d日";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "y年M月d日(EEE)";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "y/QQQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "y/Q";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1月",
-        "2月",
-        "3月",
-        "4月",
-        "5月",
-        "6月",
-        "7月",
-        "8月",
-        "9月",
-        "10月",
-        "11月",
-        "12月"
-    };
-  }
-
-  @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[] { 
-        "1月",
-        "2月",
-        "3月",
-        "4月",
-        "5月",
-        "6月",
-        "7月",
-        "8月",
-        "9月",
-        "10月",
-        "11月",
-        "12月"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "第1四半期",
-        "第2四半期",
-        "第3四半期",
-        "第4四半期"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H時mm分ss秒 zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "日曜日",
-        "月曜日",
-        "火曜日",
-        "水曜日",
-        "木曜日",
-        "金曜日",
-        "土曜日"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "日",
-        "月",
-        "火",
-        "水",
-        "木",
-        "金",
-        "土"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "日",
-        "月",
-        "火",
-        "水",
-        "木",
-        "金",
-        "土"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ka.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ka.java
deleted file mode 100644
index 2463504..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ka.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ka".
- */
-public class DateTimeFormatInfoImpl_ka extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    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[] { 
-        "ჩვენს წელთაღრიცხვამდე",
-        "ჩვენი წელთაღრიცხვით"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ჩვენს წელთაღრიცხვამდე",
-        "ჩვენი წელთაღრიცხვით"
-    };
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "იანვარი",
-        "თებერვალი",
-        "მარტი",
-        "აპრილი",
-        "მაისი",
-        "ივნისი",
-        "ივლისი",
-        "აგვისტო",
-        "სექტემბერი",
-        "ოქტომბერი",
-        "ნოემბერი",
-        "დეკემბერი"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ი",
-        "თ",
-        "მ",
-        "ა",
-        "მ",
-        "ი",
-        "ი",
-        "ა",
-        "ს",
-        "ო",
-        "ნ",
-        "დ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "იან",
-        "თებ",
-        "მარ",
-        "აპრ",
-        "მაი",
-        "ივნ",
-        "ივლ",
-        "აგვ",
-        "სექ",
-        "ოქტ",
-        "ნოე",
-        "დეკ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1-ლი კვარტალი",
-        "მე-2 კვარტალი",
-        "მე-3 კვარტალი",
-        "მე-4 კვარტალი"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "I კვ.",
-        "II კვ.",
-        "III კვ.",
-        "IV კვ."
-    };
-  }
-
-  @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[] { 
-        "კვირა",
-        "ორშაბათი",
-        "სამშაბათი",
-        "ოთხშაბათი",
-        "ხუთშაბათი",
-        "პარასკევი",
-        "შაბათი"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "კ",
-        "ო",
-        "ს",
-        "ო",
-        "ხ",
-        "პ",
-        "შ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "კვი",
-        "ორშ",
-        "სამ",
-        "ოთხ",
-        "ხუთ",
-        "პარ",
-        "შაბ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kaj.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kaj.java
deleted file mode 100644
index eba6fce..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kaj.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kaj".
- */
-public class DateTimeFormatInfoImpl_kaj extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    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[] { 
-        "Gabanin Miladi",
-        "Miladi"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "G.M.",
-        "M."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Hywan A̱yrnig",
-        "Hywan A̱hwa",
-        "Hywan A̱tat",
-        "Hywan A̱naai",
-        "Hywan A̱pfwon",
-        "Hywan A̱kitat",
-        "Hywan A̱tyirin",
-        "Hywan A̱ninai",
-        "Hywan A̱kumviriyin",
-        "Hywan Swak",
-        "Hywan Swak B'a̱yrnig",
-        "Hywan Swak B'a̱hwa"
-    };
-  }
-
-  @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[] { 
-        "A̱yr",
-        "A̱hw",
-        "A̱ta",
-        "A̱na",
-        "A̱pf",
-        "A̱ki",
-        "A̱ty",
-        "A̱ni",
-        "A̱ku",
-        "Swa",
-        "Sby",
-        "Sbh"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Ladi",
-        "Lintani",
-        "Talata",
-        "Larba",
-        "Lamit",
-        "Juma",
-        "Asabar"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Lad",
-        "Lin",
-        "Tal",
-        "Lar",
-        "Lam",
-        "Jum",
-        "Asa"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index 0024114..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kam.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kam".
- */
-public class DateTimeFormatInfoImpl_kam 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[] { 
-        "mbee wa yesu",
-        "IY"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "MY",
-        "IY"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @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"
-    };
-  }
-
-  @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[] { 
-        "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"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Jumapili",
-        "Jumatatu",
-        "Jumanne",
-        "Jumatano",
-        "Alamisi",
-        "Ijumaa",
-        "Jumamosi"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Jpl",
-        "Jtt",
-        "Jnn",
-        "Jtn",
-        "Alh",
-        "Ijm",
-        "Jms"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kam_KE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kam_KE.java
deleted file mode 100644
index d4841e0..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kam_KE.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kam_KE".
- */
-public class DateTimeFormatInfoImpl_kam_KE extends DateTimeFormatInfoImpl_kam {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
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
deleted file mode 100644
index 23f186a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kcg.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kcg".
- */
-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[] { 
-        "Gabanin Miladi",
-        "Miladi"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "GM",
-        "M"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Zwat Juwung",
-        "Zwat Swiyang",
-        "Zwat Tsat",
-        "Zwat Nyai",
-        "Zwat Tswon",
-        "Zwat Ataah",
-        "Zwat Anatat",
-        "Zwat Arinai",
-        "Zwat Akubunyung",
-        "Zwat Swag",
-        "Zwat Mangjuwang",
-        "Zwat Swag-Ma-Suyang"
-    };
-  }
-
-  @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[] { 
-        "Juw",
-        "Swi",
-        "Tsa",
-        "Nya",
-        "Tsw",
-        "Ata",
-        "Ana",
-        "Ari",
-        "Aku",
-        "Swa",
-        "Man",
-        "Mas"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Ladi",
-        "Tanii",
-        "Talata",
-        "Larba",
-        "Lamit",
-        "Juma",
-        "Asabat"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Lad",
-        "Tan",
-        "Tal",
-        "Lar",
-        "Lam",
-        "Jum",
-        "Asa"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kfo.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kfo.java
deleted file mode 100644
index 1355bd1..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kfo.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kfo".
- */
-public class DateTimeFormatInfoImpl_kfo 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[] { 
-        "Kafi Mar Wenom",
-        "Bayan Chi Wenom"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "KMW",
-        "BCW"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Fai Weyene",
-        "Fai Fani",
-        "Fai Tataka",
-        "Fai Nangra",
-        "Fai Tuyo",
-        "Fai Tsoyi",
-        "Fai Tafaka",
-        "Fai Warachi",
-        "Fai Kunobok",
-        "Fai Bansok",
-        "Fai Kom",
-        "Fai Sauk"
-    };
-  }
-
-  @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[] { 
-        "Wey",
-        "Fan",
-        "Tat",
-        "Nan",
-        "Tuy",
-        "Tso",
-        "Taf",
-        "War",
-        "Kun",
-        "Ban",
-        "Kom",
-        "Sau"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Lahadi",
-        "Je-Kubacha",
-        "Je-Gbai",
-        "Tansati",
-        "Je-Yei",
-        "Je-Koye",
-        "Sati"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Lah",
-        "Kub",
-        "Gba",
-        "Tan",
-        "Yei",
-        "Koy",
-        "Sat"
-    };
-  }
-
-  @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
deleted file mode 100644
index dde211f..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kk.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kk".
- */
-public class DateTimeFormatInfoImpl_kk extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y 'ж'.";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y 'ж'.";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.MM.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y 'ж'.";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y 'ж'.";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y 'ж'.";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "қаңтар",
-        "ақпан",
-        "наурыз",
-        "сәуір",
-        "мамыр",
-        "маусым",
-        "шілде",
-        "тамыз",
-        "қыркүйек",
-        "қазан",
-        "қараша",
-        "желтоқсан"
-    };
-  }
-
-  @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[] { 
-        "қаң.",
-        "ақп.",
-        "нау.",
-        "сәу.",
-        "мам.",
-        "мау.",
-        "шіл.",
-        "там.",
-        "қыр.",
-        "қаз.",
-        "қар.",
-        "желт."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "жексені",
-        "дуйсенбі",
-        "сейсенбі",
-        "сәренбі",
-        "бейсенбі",
-        "жұма",
-        "сенбі"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "жс.",
-        "дс.",
-        "сс.",
-        "ср.",
-        "бс.",
-        "жм.",
-        "сһ."
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kl.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kl.java
deleted file mode 100644
index 171fd46..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kl.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kl".
- */
-public class DateTimeFormatInfoImpl_kl extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "MMM dd, y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januari",
-        "februari",
-        "martsi",
-        "aprili",
-        "maji",
-        "juni",
-        "juli",
-        "augustusi",
-        "septemberi",
-        "oktoberi",
-        "novemberi",
-        "decemberi"
-    };
-  }
-
-  @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[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "maj",
-        "jun",
-        "jul",
-        "aug",
-        "sep",
-        "okt",
-        "nov",
-        "dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "sabaat",
-        "ataasinngorneq",
-        "marlunngorneq",
-        "pingasunngorneq",
-        "sisamanngorneq",
-        "tallimanngorneq",
-        "arfininngorneq"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "sab",
-        "ata",
-        "mar",
-        "pin",
-        "sis",
-        "tal",
-        "arf"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_km.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_km.java
deleted file mode 100644
index 98816a5..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_km.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "km".
- */
-public class DateTimeFormatInfoImpl_km extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ព្រឹក",
-        "ល្ងាច"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE ថ្ងៃ d ខែ MMMM ឆ្នាំ y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d ខែ MMMM ឆ្នាំ y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/M/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "មុន​គ្រិស្តសករាជ",
-        "គ្រិស្តសករាជ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "មុន​គ.ស.",
-        "គ.ស."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "មករា",
-        "កុម្ភៈ",
-        "មិនា",
-        "មេសា",
-        "ឧសភា",
-        "មិថុនា",
-        "កក្កដា",
-        "សីហា",
-        "កញ្ញា",
-        "តុលា",
-        "វិច្ឆិកា",
-        "ធ្នូ"
-    };
-  }
-
-  @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[] { 
-        "១",
-        "២",
-        "៣",
-        "៤",
-        "៥",
-        "៦",
-        "៧",
-        "៨",
-        "៩",
-        "១០",
-        "១១",
-        "១២"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "ត្រីមាសទី១",
-        "ត្រីមាសទី២",
-        "ត្រីមាសទី៣",
-        "ត្រីមាសទី៤"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "ត្រី១",
-        "ត្រី២",
-        "ត្រី៣",
-        "ត្រី៤"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H ម៉ោង m នាទី ss វិនាទី​ zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H ម៉ោង m នាទី ss វិនាទី​z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ថ្ងៃអាទិត្យ",
-        "​ថ្ងៃច័ន្ទ",
-        "ថ្ងៃអង្គារ",
-        "ថ្ងៃពុធ",
-        "ថ្ងៃព្រហស្បតិ៍",
-        "ថ្ងៃសុក្រ",
-        "ថ្ងៃសៅរ៍"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "អា",
-        "ច",
-        "អ",
-        "ពុ",
-        "ព្រ",
-        "សុ",
-        "ស"
-    };
-  }
-
-  @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
deleted file mode 100644
index 68f1a8d..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kn.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kn".
- */
-public class DateTimeFormatInfoImpl_kn extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "am",
-        "pm"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d-M-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ಈಸಪೂವ೯.",
-        "ಕ್ರಿಸ್ತ ಶಕ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ಜನವರೀ",
-        "ಫೆಬ್ರವರೀ",
-        "ಮಾರ್ಚ್",
-        "ಎಪ್ರಿಲ್",
-        "ಮೆ",
-        "ಜೂನ್",
-        "ಜುಲೈ",
-        "ಆಗಸ್ಟ್",
-        "ಸಪ್ಟೆಂಬರ್",
-        "ಅಕ್ಟೋಬರ್",
-        "ನವೆಂಬರ್",
-        "ಡಿಸೆಂಬರ್"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ಜ",
-        "ಫೆ",
-        "ಮಾ",
-        "ಎ",
-        "ಮೇ",
-        "ಜೂ",
-        "ಜು",
-        "ಆ",
-        "ಸೆ",
-        "ಅ",
-        "ನ",
-        "ಡಿ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ಜನವರೀ",
-        "ಫೆಬ್ರವರೀ",
-        "ಮಾರ್ಚ್",
-        "ಎಪ್ರಿಲ್",
-        "ಮೆ",
-        "ಜೂನ್",
-        "ಜುಲೈ",
-        "ಆಗಸ್ಟ್",
-        "ಸಪ್ಟೆಂಬರ್",
-        "ಅಕ್ಟೋಬರ್",
-        "ನವೆಂಬರ್",
-        "ಡಿಸೆಂಬರ್"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "ಒಂದು 1",
-        "ಎರಡು 2",
-        "ಮೂರು 3",
-        "ನಾಲೃಕ 4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "hh:mm:ss a zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "hh:mm:ss a z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ರವಿವಾರ",
-        "ಸೋಮವಾರ",
-        "ಮಂಗಳವಾರ",
-        "ಬುಧವಾರ",
-        "ಗುರುವಾರ",
-        "ಶುಕ್ರವಾರ",
-        "ಶನಿವಾರ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ರ",
-        "ಸೋ",
-        "ಮಂ",
-        "ಬು",
-        "ಗು",
-        "ಶು",
-        "ಶ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_ko.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ko.java
deleted file mode 100644
index 5146982..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ko.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ko".
- */
-public class DateTimeFormatInfoImpl_ko extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "오전",
-        "오후"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "y년 M월 d일 EEEE";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y년 M월 d일";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy. M. d.";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy. M. d.";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "서력기원전",
-        "서력기원"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "기원전",
-        "서기"
-    };
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "a h:mm";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "a h:mm:ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "MMM d일";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "MMMM d일";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "MMMM d일 (EEEE)";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M. d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "y년 MMM";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "y년 MMM d일";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "y년 MMMM";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "y년 MMMM d일";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy. M.";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y년 M월 d일";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "y년 MMM d일 EEE";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "y년 QQQQ분기";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "y년 Q분기";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1월",
-        "2월",
-        "3월",
-        "4월",
-        "5월",
-        "6월",
-        "7월",
-        "8월",
-        "9월",
-        "10월",
-        "11월",
-        "12월"
-    };
-  }
-
-  @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[] { 
-        "1월",
-        "2월",
-        "3월",
-        "4월",
-        "5월",
-        "6월",
-        "7월",
-        "8월",
-        "9월",
-        "10월",
-        "11월",
-        "12월"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "제 1/4분기",
-        "제 2/4분기",
-        "제 3/4분기",
-        "제 4/4분기"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "1분기",
-        "2분기",
-        "3분기",
-        "4분기"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "a hh시 mm분 ss초 zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "a hh시 mm분 ss초 z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "a h:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "a h:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "일요일",
-        "월요일",
-        "화요일",
-        "수요일",
-        "목요일",
-        "금요일",
-        "토요일"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "일",
-        "월",
-        "화",
-        "수",
-        "목",
-        "금",
-        "토"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "일",
-        "월",
-        "화",
-        "수",
-        "목",
-        "금",
-        "토"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kok.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kok.java
deleted file mode 100644
index 2e14bcb..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kok.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kok".
- */
-public class DateTimeFormatInfoImpl_kok extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "म.पू.",
-        "म.नं."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MM-yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d-M-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "क्रिस्तपूर्व",
-        "क्रिस्तशखा"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "क्रिस्तपूर्व",
-        "क्रिस्तशखा"
-    };
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "जानेवारी",
-        "फेब्रुवारी",
-        "मार्च",
-        "एप्रिल",
-        "मे",
-        "जून",
-        "जुलै",
-        "ओगस्ट",
-        "सेप्टेंबर",
-        "ओक्टोबर",
-        "नोव्हेंबर",
-        "डिसेंबर"
-    };
-  }
-
-  @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[] { 
-        "जानेवारी",
-        "फेबृवारी",
-        "मार्च",
-        "एप्रिल",
-        "मे",
-        "जून",
-        "जुलै",
-        "ओगस्ट",
-        "सेप्टेंबर",
-        "ओक्टोबर",
-        "नोव्हेंबर",
-        "डिसेंबर"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "आदित्यवार",
-        "सोमवार",
-        "मंगळार",
-        "बुधवार",
-        "गुरुवार",
-        "शुक्रवार",
-        "शनिवार"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_kpe.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kpe.java
deleted file mode 100644
index 23db0bd..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kpe.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kpe".
- */
-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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku.java
deleted file mode 100644
index d8bccce..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ku".
- */
-public class DateTimeFormatInfoImpl_ku 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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "یەکشەممە",
-        "دووشەممە",
-        "سێشەممە",
-        "چوارشەممە",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ی",
-        "د",
-        "س",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "یەکشەممە",
-        "دووشەممە",
-        "سێشەممە",
-        "چوارشەممە",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @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_ku_IR.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_IR.java
deleted file mode 100644
index cfdeb09..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_IR.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ku_IR".
- */
-public class DateTimeFormatInfoImpl_ku_IR extends DateTimeFormatInfoImpl_ku {
-
-  @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_ku_Latn.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_Latn.java
deleted file mode 100644
index 721894b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_Latn.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ku_Latn".
- */
-public class DateTimeFormatInfoImpl_ku_Latn extends DateTimeFormatInfoImpl_ku {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "BN",
-        "PN"
-    };
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/MM/dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BZ",
-        "PZ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BZ",
-        "PZ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "çile",
-        "sibat",
-        "adar",
-        "nîsan",
-        "gulan",
-        "hezîran",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ç",
-        "s",
-        "a",
-        "n",
-        "g",
-        "h",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "çil",
-        "sib",
-        "adr",
-        "nîs",
-        "gul",
-        "hez",
-        "tîr",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @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[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "y",
-        "d",
-        "s",
-        "ç",
-        "p",
-        "î",
-        "ş"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "yş",
-        "dş",
-        "sş",
-        "çş",
-        "pş",
-        "în",
-        "ş"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
-  public int weekendEnd() {
-    return 0;
-  }
-
-  @Override
-  public int weekendStart() {
-    return 6;
-  }
-}
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
deleted file mode 100644
index e7aa08e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_SY.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ku_SY".
- */
-public class DateTimeFormatInfoImpl_ku_SY extends DateTimeFormatInfoImpl_ku {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_TR.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_TR.java
deleted file mode 100644
index d82e6df..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ku_TR.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ku_TR".
- */
-public class DateTimeFormatInfoImpl_ku_TR extends DateTimeFormatInfoImpl_ku {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "BN",
-        "PN"
-    };
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/MM/dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BZ",
-        "PZ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BZ",
-        "PZ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "çile",
-        "sibat",
-        "adar",
-        "nîsan",
-        "gulan",
-        "hezîran",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ç",
-        "s",
-        "a",
-        "n",
-        "g",
-        "h",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "çil",
-        "sib",
-        "adr",
-        "nîs",
-        "gul",
-        "hez",
-        "tîr",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @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[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "y",
-        "d",
-        "s",
-        "ç",
-        "p",
-        "î",
-        "ş"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "yş",
-        "dş",
-        "sş",
-        "çş",
-        "pş",
-        "în",
-        "ş"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-
-  @Override
-  public int weekendEnd() {
-    return 0;
-  }
-
-  @Override
-  public int weekendStart() {
-    return 6;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kw.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kw.java
deleted file mode 100644
index f6205d5..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_kw.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "kw".
- */
-public class DateTimeFormatInfoImpl_kw extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "a.m.",
-        "p.m."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "RC",
-        "AD"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "RC",
-        "AD"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Mys Genver",
-        "Mys Whevrel",
-        "Mys Merth",
-        "Mys Ebrel",
-        "Mys Me",
-        "Mys Efan",
-        "Mys Gortheren",
-        "Mye Est",
-        "Mys Gwyngala",
-        "Mys Hedra",
-        "Mys Du",
-        "Mys Kevardhu"
-    };
-  }
-
-  @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[] { 
-        "Gen",
-        "Whe",
-        "Mer",
-        "Ebr",
-        "Me",
-        "Efn",
-        "Gor",
-        "Est",
-        "Gwn",
-        "Hed",
-        "Du",
-        "Kev"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "De Sul",
-        "De Lun",
-        "De Merth",
-        "De Merher",
-        "De Yow",
-        "De Gwener",
-        "De Sadorn"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Sul",
-        "Lun",
-        "Mth",
-        "Mhr",
-        "Yow",
-        "Gwe",
-        "Sad"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ky.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ky.java
deleted file mode 100644
index ce2f22b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ky.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ky".
- */
-public class DateTimeFormatInfoImpl_ky 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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index c0922fb..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ln.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ln".
- */
-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[] { 
-        "libosó ya Y.-K.",
-        "nsima ya Y.-K."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    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";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "sánzá ya yambo",
-        "sánzá ya míbalé",
-        "sánzá ya mísáto",
-        "sánzá ya mínei",
-        "sánzá ya mítáno",
-        "sánzá ya motóbá",
-        "sánzá ya nsambo",
-        "sánzá ya mwambe",
-        "sánzá ya libwa",
-        "sánzá ya zómi",
-        "sánzá ya zómi na mɔ̌kɔ́",
-        "sánzá ya zómi na míbalé"
-    };
-  }
-
-  @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[] { 
-        "s1",
-        "s2",
-        "s3",
-        "s4",
-        "s5",
-        "s6",
-        "s7",
-        "s8",
-        "s9",
-        "s10",
-        "s11",
-        "s12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    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",
-        "sánzá mísáto ya mínei"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "SM1",
-        "SM2",
-        "SM3",
-        "SM4"
-    };
-  }
-
-  @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[] { 
-        "eyenga",
-        "mokɔlɔ ya libosó",
-        "mokɔlɔ ya míbalé",
-        "mokɔlɔ ya mísáto",
-        "mokɔlɔ ya mínéi",
-        "mokɔlɔ ya mítáno",
-        "mpɔ́sɔ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "eye",
-        "m1",
-        "m2",
-        "m3",
-        "m4",
-        "m5",
-        "mps"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_lo.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_lo.java
deleted file mode 100644
index 7aac147..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_lo.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "lo".
- */
-public class DateTimeFormatInfoImpl_lo extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ກ່ອນທ່ຽງ",
-        "ຫລັງທ່ຽງ"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEEທີ d MMMM G y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/M/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ປີກ່ອນຄິດສະການທີ່",
-        "ຄ.ສ."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ປີກ່ອນຄິດສະການທີ່",
-        "ຄ.ສ."
-    };
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ມັງກອນ",
-        "ກຸມພາ",
-        "ມີນາ",
-        "ເມສາ",
-        "ພຶດສະພາ",
-        "ມິຖຸນາ",
-        "ກໍລະກົດ",
-        "ສິງຫາ",
-        "ກັນຍາ",
-        "ຕຸລາ",
-        "ພະຈິກ",
-        "ທັນວາ"
-    };
-  }
-
-  @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[] { 
-        "ມ.ກ.",
-        "ກ.ພ.",
-        "ມີ.ນ.",
-        "ມ.ສ..",
-        "ພ.ພ.",
-        "ມິ.ຖ.",
-        "ກ.ລ.",
-        "ສ.ຫ.",
-        "ກ.ຍ.",
-        "ຕ.ລ.",
-        "ພ.ຈ.",
-        "ທ.ວ."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "Hໂມງ mນາທີ ss ວິນາທີzzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H ໂມງ mນາທີss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ວັນອາທິດ",
-        "ວັນຈັນ",
-        "ວັນອັງຄານ",
-        "ວັນພຸດ",
-        "ວັນພະຫັດ",
-        "ວັນສຸກ",
-        "ວັນເສົາ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ອາ.",
-        "ຈ.",
-        "ອ.",
-        "ພ.",
-        "ພຫ.",
-        "ສກ.",
-        "ສ."
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_lt.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_lt.java
deleted file mode 100644
index 156fc9b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_lt.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "lt".
- */
-public class DateTimeFormatInfoImpl_lt extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "priešpiet",
-        "popiet"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "y 'm'. MMMM d 'd'.,EEEE";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y 'm'. MMMM d 'd'.";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy.MM.dd";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "prieš Kristų",
-        "po Kristaus"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "pr. Kr.",
-        "po Kr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "MMM-d";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "MMMM-d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M.d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "y 'm'. MMM d 'd'.";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "y 'm'. MMMM d 'd'.";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "y.M";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y.M.d";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "y 'm'. MMM d 'd'.,EEE";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "sausio",
-        "vasario",
-        "kovo",
-        "balandžio",
-        "gegužės",
-        "birželio",
-        "liepos",
-        "rugpjūčio",
-        "rugsėjo",
-        "spalio",
-        "lapkričio",
-        "gruodžio"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "Sausis",
-        "Vasaris",
-        "Kovas",
-        "Balandis",
-        "Gegužė",
-        "Birželis",
-        "Liepa",
-        "Rugpjūtis",
-        "Rugsėjis",
-        "Spalis",
-        "Lapkritis",
-        "Gruodis"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "S",
-        "V",
-        "K",
-        "B",
-        "G",
-        "B",
-        "L",
-        "R",
-        "R",
-        "S",
-        "L",
-        "G"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Sau",
-        "Vas",
-        "Kov",
-        "Bal",
-        "Geg",
-        "Bir",
-        "Lie",
-        "Rgp",
-        "Rgs",
-        "Spl",
-        "Lap",
-        "Grd"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "pirmas ketvirtis",
-        "antras ketvirtis",
-        "trečias ketvirtis",
-        "ketvirtas ketvirtis"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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[] { 
-        "sekmadienis",
-        "pirmadienis",
-        "antradienis",
-        "trečiadienis",
-        "ketvirtadienis",
-        "penktadienis",
-        "šeštadienis"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "P",
-        "A",
-        "T",
-        "K",
-        "P",
-        "Š"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Sk",
-        "Pr",
-        "An",
-        "Tr",
-        "Kt",
-        "Pn",
-        "Št"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_lv.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_lv.java
deleted file mode 100644
index 61c5a72..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_lv.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "lv".
- */
-public class DateTimeFormatInfoImpl_lv extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, y. 'gada' d. MMMM";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y. 'gada' d. MMMM";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y. 'gada' d. MMM";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "pirms mūsu ēras",
-        "mūsu ērā"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "p.m.ē.",
-        "m.ē."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d. MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "dd.mm.";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "yyyy. 'g'. MMM";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "y. 'gada' d. MMM";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "yyyy. 'g'. MMMM";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "y. 'gada' d. MMMM";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "mm.yyyy.";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, y. 'gada' d. MMM";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "janvāris",
-        "februāris",
-        "marts",
-        "aprīlis",
-        "maijs",
-        "jūnijs",
-        "jūlijs",
-        "augusts",
-        "septembris",
-        "oktobris",
-        "novembris",
-        "decembris"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "janv.",
-        "febr.",
-        "marts",
-        "apr.",
-        "maijs",
-        "jūn.",
-        "jūl.",
-        "aug.",
-        "sept.",
-        "okt.",
-        "nov.",
-        "dec."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. ceturksnis",
-        "2. ceturksnis",
-        "3. ceturksnis",
-        "4. ceturksnis"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "C1",
-        "C2",
-        "C3",
-        "C4"
-    };
-  }
-
-  @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[] { 
-        "svētdiena",
-        "pirmdiena",
-        "otrdiena",
-        "trešdiena",
-        "ceturtdiena",
-        "piektdiena",
-        "sestdiena"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "P",
-        "O",
-        "T",
-        "C",
-        "P",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Sv",
-        "Pr",
-        "Ot",
-        "Tr",
-        "Ce",
-        "Pk",
-        "Se"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mk.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mk.java
deleted file mode 100644
index 180cec5..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mk.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "mk".
- */
-public class DateTimeFormatInfoImpl_mk extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "претпладне",
-        "попладне"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.M.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.M.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "пр.н.е.",
-        "ае."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "пр.н.е.",
-        "ае."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "јануари",
-        "февруари",
-        "март",
-        "април",
-        "мај",
-        "јуни",
-        "јули",
-        "август",
-        "септември",
-        "октомври",
-        "ноември",
-        "декември"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ј",
-        "ф",
-        "м",
-        "а",
-        "м",
-        "ј",
-        "ј",
-        "а",
-        "с",
-        "о",
-        "н",
-        "д"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "јан.",
-        "фев.",
-        "мар.",
-        "апр.",
-        "мај",
-        "јун.",
-        "јул.",
-        "авг.",
-        "септ.",
-        "окт.",
-        "ноем.",
-        "декем."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "недела",
-        "понеделник",
-        "вторник",
-        "среда",
-        "четврток",
-        "петок",
-        "сабота"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "н",
-        "п",
-        "в",
-        "с",
-        "ч",
-        "п",
-        "с"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "нед.",
-        "пон.",
-        "вт.",
-        "сре.",
-        "чет.",
-        "пет.",
-        "саб."
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ml.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ml.java
deleted file mode 100644
index 6cb460e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ml.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ml".
- */
-public class DateTimeFormatInfoImpl_ml extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "am",
-        "pm"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "y, MMMM d, EEEE";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y, MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y, MMM d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ക്രിസ്തുവിനു് മുമ്പ്‌",
-        "ക്രിസ്തുവിന് പിന്‍പ്"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ക്രി.മു.",
-        "ക്രി.പി."
-    };
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "MMMM d, EEEE";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "y, MMM d";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "y, MMMM d";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "y, MMM d, EEE";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "yyyy QQQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "yyyy Q";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ജനുവരി",
-        "ഫെബ്രുവരി",
-        "മാര്‍ച്ച്",
-        "ഏപ്രില്‍",
-        "മേയ്",
-        "ജൂണ്‍",
-        "ജൂലൈ",
-        "ഓഗസ്റ്റ്",
-        "സെപ്റ്റംബര്‍",
-        "ഒക്ടോബര്‍",
-        "നവംബര്‍",
-        "ഡിസംബര്‍"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ജ",
-        "ഫെ",
-        "മാ",
-        "ഏ",
-        "മേ",
-        "ജൂ",
-        "ജൂ",
-        "ഓ",
-        "സെ",
-        "ഒ",
-        "ന",
-        "ഡി"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ജനു",
-        "ഫെബ്രു",
-        "മാര്‍",
-        "ഏപ്രി",
-        "മേയ്",
-        "ജൂണ്‍",
-        "ജൂലൈ",
-        "ഓഗ",
-        "സെപ്റ്റം",
-        "ഒക്ടോ",
-        "നവം",
-        "ഡിസം"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "ഒന്നാം പാദം",
-        "രണ്ടാം പാദം",
-        "മൂന്നാം പാദം",
-        "നാലാം പാദം"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ഞായറാഴ്ച",
-        "തിങ്കളാഴ്ച",
-        "ചൊവ്വാഴ്ച",
-        "ബുധനാഴ്ച",
-        "വ്യാഴാഴ്ച",
-        "വെള്ളിയാഴ്ച",
-        "ശനിയാഴ്ച"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ഞാ",
-        "തി",
-        "ചൊ",
-        "ബു",
-        "വ്യാ",
-        "വെ",
-        "ശ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_mn.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mn.java
deleted file mode 100644
index f3d3726..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mn.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "mn".
- */
-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[] { 
-        "манай эриний өмнөх",
-        "манай эриний"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "м.э.ө",
-        "м.э."
-    };
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Хулгана",
-        "Үхэр",
-        "Бар",
-        "Туулай",
-        "Луу",
-        "Могой",
-        "Морь",
-        "Хонь",
-        "Бич",
-        "Тахиа",
-        "Нохой",
-        "Гахай"
-    };
-  }
-
-  @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[] { 
-        "хул",
-        "үхэ",
-        "бар",
-        "туу",
-        "луу",
-        "мог",
-        "мор",
-        "хон",
-        "бич",
-        "тах",
-        "нох",
-        "гах"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "дөрөвний нэг",
-        "дөрөвний хоёр",
-        "дөрөвний гурав",
-        "дөрөвний дөрөв"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "1/4",
-        "2/4",
-        "3/4",
-        "4/4"
-    };
-  }
-
-  @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[] { 
-        "ням",
-        "даваа",
-        "мягмар",
-        "лхагва",
-        "пүрэв",
-        "баасан",
-        "бямба"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Ня",
-        "Да",
-        "Мя",
-        "Лх",
-        "Пү",
-        "Ба",
-        "Бя"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mr.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mr.java
deleted file mode 100644
index f408178..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mr.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "mr".
- */
-public class DateTimeFormatInfoImpl_mr extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "am",
-        "pm"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d-M-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ईसवीसनपूर्व",
-        "ईसवीसन"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ई.स.पू.",
-        "ई.स."
-    };
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "h-mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "h-mm-ss a";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H-mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H-mm-ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "जानेवारी",
-        "फेब्रुवारी",
-        "मार्च",
-        "एप्रिल",
-        "मे",
-        "जून",
-        "जुलै",
-        "ऑगस्ट",
-        "सप्टेंबर",
-        "ऑक्टोबर",
-        "नोव्हेंबर",
-        "डिसेंबर"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "जा",
-        "फे",
-        "मा",
-        "ए",
-        "मे",
-        "जू",
-        "जु",
-        "ऑ",
-        "स",
-        "ऑ",
-        "नो",
-        "डि"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "जानेवारी",
-        "फेब्रुवारी",
-        "मार्च",
-        "एप्रिल",
-        "मे",
-        "जून",
-        "जुलै",
-        "ऑगस्ट",
-        "सप्टेंबर",
-        "ऑक्टोबर",
-        "नोव्हेंबर",
-        "डिसेंबर"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    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[] { 
-        "रविवार",
-        "सोमवार",
-        "मंगळवार",
-        "बुधवार",
-        "गुरुवार",
-        "शुक्रवार",
-        "शनिवार"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "र",
-        "सो",
-        "मं",
-        "बु",
-        "गु",
-        "शु",
-        "श"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_ms.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ms.java
deleted file mode 100644
index 61646d6..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ms.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ms".
- */
-public class DateTimeFormatInfoImpl_ms extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd MMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "S.M.",
-        "T.M."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "S.M.",
-        "T.M."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Januari",
-        "Februari",
-        "Mac",
-        "April",
-        "Mei",
-        "Jun",
-        "Julai",
-        "Ogos",
-        "September",
-        "Oktober",
-        "November",
-        "Disember"
-    };
-  }
-
-  @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[] { 
-        "Jan",
-        "Feb",
-        "Mac",
-        "Apr",
-        "Mei",
-        "Jun",
-        "Jul",
-        "Ogos",
-        "Sep",
-        "Okt",
-        "Nov",
-        "Dis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "suku pertama",
-        "suku kedua",
-        "suku ketiga",
-        "suku keempat"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "S1",
-        "S2",
-        "S3",
-        "S4"
-    };
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "h:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Ahad",
-        "Isnin",
-        "Selasa",
-        "Rabu",
-        "Khamis",
-        "Jumaat",
-        "Sabtu"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Ahd",
-        "Isn",
-        "Sel",
-        "Rab",
-        "Kha",
-        "Jum",
-        "Sab"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ms_BN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ms_BN.java
deleted file mode 100644
index 9cc4899..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ms_BN.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ms_BN".
- */
-public class DateTimeFormatInfoImpl_ms_BN extends DateTimeFormatInfoImpl_ms {
-
-  @Override
-  public String dateFormatFull() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "h:mm:ss aa zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mt.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mt.java
deleted file mode 100644
index 01cd209..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_mt.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "mt".
- */
-public class DateTimeFormatInfoImpl_mt extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "QN",
-        "WN"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d 'ta'’ MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d 'ta'’ MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Qabel Kristu",
-        "Wara Kristu"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "QK",
-        "WK"
-    };
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d 'ta'’ MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d 'ta'’ MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d 'ta'’ MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Jannar",
-        "Frar",
-        "Marzu",
-        "April",
-        "Mejju",
-        "Ġunju",
-        "Lulju",
-        "Awwissu",
-        "Settembru",
-        "Ottubru",
-        "Novembru",
-        "Diċembru"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "J",
-        "F",
-        "M",
-        "A",
-        "M",
-        "Ġ",
-        "L",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Jan",
-        "Fra",
-        "Mar",
-        "Apr",
-        "Mej",
-        "Ġun",
-        "Lul",
-        "Aww",
-        "Set",
-        "Ott",
-        "Nov",
-        "Diċ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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[] { 
-        "Il-Ħadd",
-        "It-Tnejn",
-        "It-Tlieta",
-        "L-Erbgħa",
-        "Il-Ħamis",
-        "Il-Ġimgħa",
-        "Is-Sibt"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "Ħ",
-        "T",
-        "T",
-        "E",
-        "Ħ",
-        "Ġ",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Ħad",
-        "Tne",
-        "Tli",
-        "Erb",
-        "Ħam",
-        "Ġim",
-        "Sib"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_my.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_my.java
deleted file mode 100644
index 1601343..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_my.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "my".
- */
-public class DateTimeFormatInfoImpl_my extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    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[] { 
-        "ခရစ်တော် မပေါ်မီကာလ",
-        "ခရစ်တော် ပေါ်ထွန်းပြီးကာလ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ဘီစီ",
-        "အေဒီ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ဇန်နဝါရီ",
-        "ဖေဖော်ဝါရီ",
-        "မတ်",
-        "ဧပြီ",
-        "မေ",
-        "ဇွန်",
-        "ဇူလိုင်",
-        "ဩဂုတ်",
-        "စက်တင်ဘာ",
-        "အောက်တိုဘာ",
-        "နိုဝင်ဘာ",
-        "ဒီဇင်ဘာ"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ဇ",
-        "ဖ",
-        "မ",
-        "ဧ",
-        "မ",
-        "ဇ",
-        "ဇ",
-        "ဩ",
-        "စ",
-        "အ",
-        "န",
-        "ဒ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ဇန်",
-        "ဖေ",
-        "မတ်",
-        "ဧ",
-        "မေ",
-        "ဇွန်",
-        "ဇူ",
-        "ဩ",
-        "စက်",
-        "အောက်",
-        "နို",
-        "ဒီ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "ပထမ သုံးလပတ်",
-        "ဒုတိယ သုံးလပတ်",
-        "တတိယ သုံးလပတ်",
-        "စတုတ္ထ သုံးလပတ်"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "ပ-စိတ်",
-        "ဒု-စိတ်",
-        "တ-စိတ်",
-        "စ-စိတ်"
-    };
-  }
-
-  @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[] { 
-        "တနင်္ဂနွေ",
-        "တနင်္လာ",
-        "အင်္ဂါ",
-        "ဗုဒ္ဓဟူး",
-        "ကြာသပတေး",
-        "သောကြာ",
-        "စနေ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "တ",
-        "တ",
-        "အ",
-        "ဗ",
-        "က",
-        "သ",
-        "စ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "နွေ",
-        "လာ",
-        "ဂါ",
-        "ဟူး",
-        "တေး",
-        "ကြာ",
-        "နေ"
-    };
-  }
-
-  @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
deleted file mode 100644
index 5c6afc7..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nb.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "nb".
- */
-public class DateTimeFormatInfoImpl_nb extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "f.Kr.",
-        "e.Kr."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "f.Kr.",
-        "e.Kr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMinuteSecond() {
-    return "mm.ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d. MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d. MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januar",
-        "februar",
-        "mars",
-        "april",
-        "mai",
-        "juni",
-        "juli",
-        "august",
-        "september",
-        "oktober",
-        "november",
-        "desember"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan.",
-        "feb.",
-        "mars",
-        "apr.",
-        "mai",
-        "juni",
-        "juli",
-        "aug.",
-        "sep.",
-        "okt.",
-        "nov.",
-        "des."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. kvartal",
-        "2. kvartal",
-        "3. kvartal",
-        "4. kvartal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "søndag",
-        "mandag",
-        "tirsdag",
-        "onsdag",
-        "torsdag",
-        "fredag",
-        "lørdag"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "T",
-        "O",
-        "T",
-        "F",
-        "L"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "søn.",
-        "man.",
-        "tir.",
-        "ons.",
-        "tor.",
-        "fre.",
-        "lør."
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index ddee894..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nds.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "nds".
- */
-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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "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
deleted file mode 100644
index f4a36a1..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ne.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ne".
- */
-public class DateTimeFormatInfoImpl_ne extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    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[] { 
-        "ईसा पूर्व",
-        "सन्"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ईसा पूर्व",
-        "सन्"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "जनवरी",
-        "फेब्रुअरी",
-        "मार्च",
-        "अप्रिल",
-        "मे",
-        "जुन",
-        "जुलाई",
-        "अगस्त",
-        "सेप्टेम्बर",
-        "अक्टोबर",
-        "नोभेम्बर",
-        "डिसेम्बर"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "१",
-        "२",
-        "३",
-        "४",
-        "५",
-        "६",
-        "७",
-        "८",
-        "९",
-        "१०",
-        "११",
-        "१२"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "जन",
-        "फेब",
-        "मार्च",
-        "अप्रि",
-        "मे",
-        "जुन",
-        "जुला",
-        "अग",
-        "सेप्ट",
-        "अक्टो",
-        "नोभे",
-        "डिसे"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "पहिलो सत्र",
-        "दोस्रो सत्र",
-        "तेस्रो सत्र",
-        "चौथो सत्र"
-    };
-  }
-
-  @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[] { 
-        "आइतबार",
-        "सोमबार",
-        "मङ्गलबार",
-        "बुधबार",
-        "बिहीबार",
-        "शुक्रबार",
-        "शनिबार"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "१",
-        "२",
-        "३",
-        "४",
-        "५",
-        "६",
-        "७"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "आइत",
-        "सोम",
-        "मङ्गल",
-        "बुध",
-        "बिही",
-        "शुक्र",
-        "शनि"
-    };
-  }
-
-  @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
deleted file mode 100644
index c7186cc..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ne_IN.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ne_IN".
- */
-public class DateTimeFormatInfoImpl_ne_IN extends DateTimeFormatInfoImpl_ne {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-
-  @Override
-  public int weekendStart() {
-    return 0;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nl.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nl.java
deleted file mode 100644
index d1fce42..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nl.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "nl".
- */
-public class DateTimeFormatInfoImpl_nl extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd-MM-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Voor Christus",
-        "Anno Domini"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "v. Chr.",
-        "n. Chr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januari",
-        "februari",
-        "maart",
-        "april",
-        "mei",
-        "juni",
-        "juli",
-        "augustus",
-        "september",
-        "oktober",
-        "november",
-        "december"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan.",
-        "feb.",
-        "mrt.",
-        "apr.",
-        "mei",
-        "jun.",
-        "jul.",
-        "aug.",
-        "sep.",
-        "okt.",
-        "nov.",
-        "dec."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1e kwartaal",
-        "2e kwartaal",
-        "3e kwartaal",
-        "4e kwartaal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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[] { 
-        "zondag",
-        "maandag",
-        "dinsdag",
-        "woensdag",
-        "donderdag",
-        "vrijdag",
-        "zaterdag"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "Z",
-        "M",
-        "D",
-        "W",
-        "D",
-        "V",
-        "Z"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "zo",
-        "ma",
-        "di",
-        "wo",
-        "do",
-        "vr",
-        "za"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index 860c1b6..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nl_BE.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "nl_BE".
- */
-public class DateTimeFormatInfoImpl_nl_BE extends DateTimeFormatInfoImpl_nl {
-
-  @Override
-  public String dateFormatMedium() {
-    return "d-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/MM/yy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nn.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nn.java
deleted file mode 100644
index f158adb..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nn.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "nn".
- */
-public class DateTimeFormatInfoImpl_nn extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "formiddag",
-        "ettermiddag"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d. MMM. y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "f.Kr.",
-        "e.Kr."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "f.Kr.",
-        "e.Kr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d. MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januar",
-        "februar",
-        "mars",
-        "april",
-        "mai",
-        "juni",
-        "juli",
-        "august",
-        "september",
-        "oktober",
-        "november",
-        "desember"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "mai",
-        "jun",
-        "jul",
-        "aug",
-        "sep",
-        "okt",
-        "nov",
-        "des"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. kvartal",
-        "2. kvartal",
-        "3. kvartal",
-        "4. kvartal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "søndag",
-        "måndag",
-        "tysdag",
-        "onsdag",
-        "torsdag",
-        "fredag",
-        "laurdag"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "T",
-        "O",
-        "T",
-        "F",
-        "L"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "sø.",
-        "må.",
-        "ty.",
-        "on.",
-        "to.",
-        "fr.",
-        "la."
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nr.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nr.java
deleted file mode 100644
index 9fbd015..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nr.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "nr".
- */
-public class DateTimeFormatInfoImpl_nr 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"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Janabari",
-        "uFeberbari",
-        "uMatjhi",
-        "u-Apreli",
-        "Meyi",
-        "Juni",
-        "Julayi",
-        "Arhostosi",
-        "Septemba",
-        "Oktoba",
-        "Usinyikhaba",
-        "Disemba"
-    };
-  }
-
-  @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[] { 
-        "Jan",
-        "Feb",
-        "Mat",
-        "Apr",
-        "Mey",
-        "Jun",
-        "Jul",
-        "Arh",
-        "Sep",
-        "Okt",
-        "Usi",
-        "Dis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "uSonto",
-        "uMvulo",
-        "uLesibili",
-        "Lesithathu",
-        "uLesine",
-        "ngoLesihlanu",
-        "umGqibelo"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Son",
-        "Mvu",
-        "Bil",
-        "Tha",
-        "Ne",
-        "Hla",
-        "Gqi"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nso.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nso.java
deleted file mode 100644
index 7ba539a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_nso.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "nso".
- */
-public class DateTimeFormatInfoImpl_nso 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"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Janaware",
-        "Feberware",
-        "Matšhe",
-        "Aporele",
-        "Mei",
-        "June",
-        "Julae",
-        "Agostose",
-        "Setemere",
-        "Oktobore",
-        "Nofemere",
-        "Disemere"
-    };
-  }
-
-  @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[] { 
-        "Jan",
-        "Feb",
-        "Mat",
-        "Apo",
-        "Mei",
-        "Jun",
-        "Jul",
-        "Ago",
-        "Set",
-        "Okt",
-        "Nof",
-        "Dis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Sontaga",
-        "Mosupalogo",
-        "Labobedi",
-        "Laboraro",
-        "Labone",
-        "Labohlano",
-        "Mokibelo"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Son",
-        "Mos",
-        "Bed",
-        "Rar",
-        "Ne",
-        "Hla",
-        "Mok"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index 44e0544..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ny.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ny".
- */
-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"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Januwale",
-        "Febuluwale",
-        "Malichi",
-        "Epulo",
-        "Mei",
-        "Juni",
-        "Julai",
-        "Ogasiti",
-        "Seputemba",
-        "Okutoba",
-        "Novemba",
-        "Disemba"
-    };
-  }
-
-  @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[] { 
-        "Jan",
-        "Feb",
-        "Mal",
-        "Epu",
-        "Mei",
-        "Jun",
-        "Jul",
-        "Oga",
-        "Sep",
-        "Oku",
-        "Nov",
-        "Dis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Lamulungu",
-        "Lolemba",
-        "Lachiwiri",
-        "Lachitatu",
-        "Lachinayi",
-        "Lachisanu",
-        "Loweruka"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Mul",
-        "Lem",
-        "Wir",
-        "Tat",
-        "Nai",
-        "San",
-        "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
deleted file mode 100644
index dacb4e2..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_oc.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "oc".
- */
-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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "genièr",
-        "febrièr",
-        "març",
-        "abril",
-        "mai",
-        "junh",
-        "julhet",
-        "agost",
-        "setembre",
-        "octòbre",
-        "novembre",
-        "dezembre"
-    };
-  }
-
-  @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[] { 
-        "genièr",
-        "febrièr",
-        "març",
-        "abril",
-        "mai",
-        "junh",
-        "julhet",
-        "agost",
-        "setembre",
-        "octòbre",
-        "novembre",
-        "dezembre"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Dimenge",
-        "diluns",
-        "dimarç",
-        "dimècres",
-        "dijòus",
-        "divèndres",
-        "dissabte"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Dimenge",
-        "diluns",
-        "dimarç",
-        "dimècres",
-        "dijòus",
-        "divèndres",
-        "dissabte"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_om.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_om.java
deleted file mode 100644
index 9021ff1..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_om.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "om".
- */
-public class DateTimeFormatInfoImpl_om extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "WD",
-        "WB"
-    };
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "KD",
-        "KB"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "KD",
-        "KB"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Amajjii",
-        "Guraandhala",
-        "Bitooteessa",
-        "Elba",
-        "Caamsa",
-        "Waxabajjii",
-        "Adooleessa",
-        "Hagayya",
-        "Fuulbana",
-        "Onkololeessa",
-        "Sadaasa",
-        "Muddee"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Ama",
-        "Gur",
-        "Bit",
-        "Elb",
-        "Cam",
-        "Wax",
-        "Ado",
-        "Hag",
-        "Ful",
-        "Onk",
-        "Sad",
-        "Mud"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Dilbata",
-        "Wiixata",
-        "Qibxata",
-        "Roobii",
-        "Kamiisa",
-        "Jimaata",
-        "Sanbata"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Dil",
-        "Wix",
-        "Qib",
-        "Rob",
-        "Kam",
-        "Jim",
-        "San"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_om_ET.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_om_ET.java
deleted file mode 100644
index 590b08a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_om_ET.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "om_ET".
- */
-public class DateTimeFormatInfoImpl_om_ET extends DateTimeFormatInfoImpl_om {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_om_KE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_om_KE.java
deleted file mode 100644
index ea3c47a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_om_KE.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "om_KE".
- */
-public class DateTimeFormatInfoImpl_om_KE extends DateTimeFormatInfoImpl_om {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
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
deleted file mode 100644
index 2425b34..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_or.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "or".
- */
-public class DateTimeFormatInfoImpl_or extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "am",
-        "pm"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d-M-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ଜାନୁଆରୀ",
-        "ଫେବ୍ରୁୟାରୀ",
-        "ମାର୍ଚ୍ଚ",
-        "ଅପ୍ରେଲ",
-        "ମେ",
-        "ଜୁନ",
-        "ଜୁଲାଇ",
-        "ଅଗଷ୍ଟ",
-        "ସେପ୍ଟେମ୍ବର",
-        "ଅକ୍ଟୋବର",
-        "ନଭେମ୍ବର",
-        "ଡିସେମ୍ବର"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ଜା",
-        "ଫେ",
-        "ମା",
-        "ଅ",
-        "ମେ",
-        "ଜୁ",
-        "ଜୁ",
-        "ଅ",
-        "ସେ",
-        "ଅ",
-        "ନ",
-        "ଡି"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ଜାନୁଆରୀ",
-        "ଫେବ୍ରୁୟାରୀ",
-        "ମାର୍ଚ୍ଚ",
-        "ଅପ୍ରେଲ",
-        "ମେ",
-        "ଜୁନ",
-        "ଜୁଲାଇ",
-        "ଅଗଷ୍ଟ",
-        "ସେପ୍ଟେମ୍ବର",
-        "ଅକ୍ଟୋବର",
-        "ନଭେମ୍ବର",
-        "ଡିସେମ୍ବର"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ରବିବାର",
-        "ସୋମବାର",
-        "ମଙ୍ଗଳବାର",
-        "ବୁଧବାର",
-        "ଗୁରୁବାର",
-        "ଶୁକ୍ରବାର",
-        "ଶନିବାର"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ର",
-        "ସୋ",
-        "ମ",
-        "ବୁ",
-        "ଗୁ",
-        "ଶୁ",
-        "ଶ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_pa.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa.java
deleted file mode 100644
index 344b975..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "pa".
- */
-public class DateTimeFormatInfoImpl_pa extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ਸਵੇਰੇ",
-        "ਸ਼ਾਮ"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ਈਸਾਪੂਰਵ",
-        "ਸੰਨ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ਜਨਵਰੀ",
-        "ਫ਼ਰਵਰੀ",
-        "ਮਾਰਚ",
-        "ਅਪ੍ਰੈਲ",
-        "ਮਈ",
-        "ਜੂਨ",
-        "ਜੁਲਾਈ",
-        "ਅਗਸਤ",
-        "ਸਤੰਬਰ",
-        "ਅਕਤੂਬਰ",
-        "ਨਵੰਬਰ",
-        "ਦਸੰਬਰ"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ਜ",
-        "ਫ",
-        "ਮਾ",
-        "ਅ",
-        "ਮ",
-        "ਜੂ",
-        "ਜੁ",
-        "ਅ",
-        "ਸ",
-        "ਅ",
-        "ਨ",
-        "ਦ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ਜਨਵਰੀ",
-        "ਫ਼ਰਵਰੀ",
-        "ਮਾਰਚ",
-        "ਅਪ੍ਰੈਲ",
-        "ਮਈ",
-        "ਜੂਨ",
-        "ਜੁਲਾਈ",
-        "ਅਗਸਤ",
-        "ਸਤੰਬਰ",
-        "ਅਕਤੂਬਰ",
-        "ਨਵੰਬਰ",
-        "ਦਸੰਬਰ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "ਪਹਿਲਾਂ ਚੌਥਾਈ",
-        "ਦੂਜਾ ਚੌਥਾਈ",
-        "ਤੀਜਾ ਚੌਥਾਈ",
-        "ਚੌਥਾ ਚੌਥਾਈ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ਐਤਵਾਰ",
-        "ਸੋਮਵਾਰ",
-        "ਮੰਗਲਵਾਰ",
-        "ਬੁਧਵਾਰ",
-        "ਵੀਰਵਾਰ",
-        "ਸ਼ੁੱਕਰਵਾਰ",
-        "ਸ਼ਨੀਚਰਵਾਰ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ਐ",
-        "ਸੋ",
-        "ਮੰ",
-        "ਬੁੱ",
-        "ਵੀ",
-        "ਸ਼ੁੱ",
-        "ਸ਼"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_pa_Arab.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa_Arab.java
deleted file mode 100644
index a272627..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa_Arab.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "pa_Arab".
- */
-public class DateTimeFormatInfoImpl_pa_Arab extends DateTimeFormatInfoImpl_pa {
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ايساپورو",
-        "سں"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "جنوری",
-        "فروری",
-        "مارچ",
-        "اپریل",
-        "مئ",
-        "جون",
-        "جولائی",
-        "اگست",
-        "ستمبر",
-        "اکتوبر",
-        "نومبر",
-        "دسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "جنوری",
-        "فروری",
-        "مارچ",
-        "اپریل",
-        "مئ",
-        "جون",
-        "جولائی",
-        "اگست",
-        "ستمبر",
-        "اکتوبر",
-        "نومبر",
-        "دسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "چوتھاي پہلاں",
-        "چوتھاي دوجا",
-        "چوتھاي تيجا",
-        "چوتھاي چوتھا"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "اتوار",
-        "پیر",
-        "منگل",
-        "بُدھ",
-        "جمعرات",
-        "جمعہ",
-        "ہفتہ"
-    };
-  }
-
-  @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_pa_Arab_PK.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa_Arab_PK.java
deleted file mode 100644
index 84a4754..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa_Arab_PK.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "pa_Arab_PK".
- */
-public class DateTimeFormatInfoImpl_pa_Arab_PK extends DateTimeFormatInfoImpl_pa_Arab {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    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
deleted file mode 100644
index f01a6df..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pa_PK.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "pa_PK".
- */
-public class DateTimeFormatInfoImpl_pa_PK extends DateTimeFormatInfoImpl_pa {
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ايساپورو",
-        "سں"
-    };
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "جنوری",
-        "فروری",
-        "مارچ",
-        "اپریل",
-        "مئ",
-        "جون",
-        "جولائی",
-        "اگست",
-        "ستمبر",
-        "اکتوبر",
-        "نومبر",
-        "دسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "جنوری",
-        "فروری",
-        "مارچ",
-        "اپریل",
-        "مئ",
-        "جون",
-        "جولائی",
-        "اگست",
-        "ستمبر",
-        "اکتوبر",
-        "نومبر",
-        "دسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "چوتھاي پہلاں",
-        "چوتھاي دوجا",
-        "چوتھاي تيجا",
-        "چوتھاي چوتھا"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "اتوار",
-        "پیر",
-        "منگل",
-        "بُدھ",
-        "جمعرات",
-        "جمعہ",
-        "ہفتہ"
-    };
-  }
-
-  @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
deleted file mode 100644
index fbe52a9..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pl.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "pl".
- */
-public class DateTimeFormatInfoImpl_pl extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MM-yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd-MM-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "p.n.e.",
-        "n.e."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "p.n.e.",
-        "n.e."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "d MMMM EEEE";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "LLL y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "LLLL y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "yyyy QQQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "yyyy Q";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "stycznia",
-        "lutego",
-        "marca",
-        "kwietnia",
-        "maja",
-        "czerwca",
-        "lipca",
-        "sierpnia",
-        "września",
-        "października",
-        "listopada",
-        "grudnia"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "styczeń",
-        "luty",
-        "marzec",
-        "kwiecień",
-        "maj",
-        "czerwiec",
-        "lipiec",
-        "sierpień",
-        "wrzesień",
-        "październik",
-        "listopad",
-        "grudzień"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "s",
-        "l",
-        "m",
-        "k",
-        "m",
-        "c",
-        "l",
-        "s",
-        "w",
-        "p",
-        "l",
-        "g"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "sty",
-        "lut",
-        "mar",
-        "kwi",
-        "maj",
-        "cze",
-        "lip",
-        "sie",
-        "wrz",
-        "paź",
-        "lis",
-        "gru"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "I kwartał",
-        "II kwartał",
-        "III kwartał",
-        "IV kwartał"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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[] { 
-        "niedziela",
-        "poniedziałek",
-        "wtorek",
-        "środa",
-        "czwartek",
-        "piątek",
-        "sobota"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "N",
-        "P",
-        "W",
-        "Ś",
-        "C",
-        "P",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "niedz.",
-        "pon.",
-        "wt.",
-        "śr.",
-        "czw.",
-        "pt.",
-        "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
deleted file mode 100644
index 3e30994..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ps.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ps".
- */
-public class DateTimeFormatInfoImpl_ps extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "غ.م.",
-        "غ.و."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE د y د MMMM d";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "د y د MMMM d";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy/M/d";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ق.م.",
-        "م."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ق.م.",
-        "م."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "د y د MMM d";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "د y د MMMM d";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y/M/d";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE د y د MMM d";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "جنوري",
-        "فبروري",
-        "مارچ",
-        "اپریل",
-        "می",
-        "جون",
-        "جولای",
-        "اګست",
-        "سپتمبر",
-        "اکتوبر",
-        "نومبر",
-        "دسمبر"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "مـی",
-        "جون",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H:mm:ss (zzzz)";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss (z)";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "یکشنبه",
-        "دوشنبه",
-        "سه‌شنبه",
-        "چهارشنبه",
-        "پنجشنبه",
-        "جمعه",
-        "شنبه"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @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.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt.java
deleted file mode 100644
index abe5ec1..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "pt".
- */
-public class DateTimeFormatInfoImpl_pt extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d 'de' MMMM 'de' y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d 'de' MMMM 'de' y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Antes de Cristo",
-        "Ano do Senhor"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "a.C.",
-        "d.C."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMinuteSecond() {
-    return "mm'min'ss's'";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d 'de' MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d 'de' MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d 'de' MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM 'de' y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d 'de' MMM 'de' y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM 'de' y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d 'de' MMMM 'de' y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "MM/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d 'de' MMM 'de' y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "yyyy QQQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "yyyy Q";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "janeiro",
-        "fevereiro",
-        "março",
-        "abril",
-        "maio",
-        "junho",
-        "julho",
-        "agosto",
-        "setembro",
-        "outubro",
-        "novembro",
-        "dezembro"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan",
-        "fev",
-        "mar",
-        "abr",
-        "mai",
-        "jun",
-        "jul",
-        "ago",
-        "set",
-        "out",
-        "nov",
-        "dez"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1º trimestre",
-        "2º trimestre",
-        "3º trimestre",
-        "4º trimestre"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "T1",
-        "T2",
-        "T3",
-        "T4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "HH'h'mm'min'ss's' zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "HH'h'mm'min'ss's' z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "domingo",
-        "segunda-feira",
-        "terça-feira",
-        "quarta-feira",
-        "quinta-feira",
-        "sexta-feira",
-        "sábado"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "D",
-        "S",
-        "T",
-        "Q",
-        "Q",
-        "S",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "dom",
-        "seg",
-        "ter",
-        "qua",
-        "qui",
-        "sex",
-        "sáb"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index a59307e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_pt_PT.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "pt_PT".
- */
-public class DateTimeFormatInfoImpl_pt_PT extends DateTimeFormatInfoImpl_pt {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "Antes do meio-dia",
-        "Depois do meio-dia"
-    };
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d 'de' MMM 'de' yyyy";
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "h:mm";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "h:mm:ss";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQ 'de' yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "QQQ 'de' yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Janeiro",
-        "Fevereiro",
-        "Março",
-        "Abril",
-        "Maio",
-        "Junho",
-        "Julho",
-        "Agosto",
-        "Setembro",
-        "Outubro",
-        "Novembro",
-        "Dezembro"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Jan",
-        "Fev",
-        "Mar",
-        "Abr",
-        "Mai",
-        "Jun",
-        "Jul",
-        "Ago",
-        "Set",
-        "Out",
-        "Nov",
-        "Dez"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1.º trimestre",
-        "2.º trimestre",
-        "3.º trimestre",
-        "4.º trimestre"
-    };
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ro.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ro.java
deleted file mode 100644
index b3d634d..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ro.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ro".
- */
-public class DateTimeFormatInfoImpl_ro extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.MM.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "înainte de Hristos",
-        "după Hristos"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "î.Hr.",
-        "d.Hr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "'trimestrul' QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "'trimestrul' Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ianuarie",
-        "februarie",
-        "martie",
-        "aprilie",
-        "mai",
-        "iunie",
-        "iulie",
-        "august",
-        "septembrie",
-        "octombrie",
-        "noiembrie",
-        "decembrie"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "I",
-        "F",
-        "M",
-        "A",
-        "M",
-        "I",
-        "I",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ian.",
-        "feb.",
-        "mar.",
-        "apr.",
-        "mai",
-        "iun.",
-        "iul.",
-        "aug.",
-        "sept.",
-        "oct.",
-        "nov.",
-        "dec."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "trimestrul I",
-        "trimestrul al II-lea",
-        "trimestrul al III-lea",
-        "trimestrul al IV-lea"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "trim. I",
-        "trim. II",
-        "trim. III",
-        "trim. IV"
-    };
-  }
-
-  @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[] { 
-        "duminică",
-        "luni",
-        "marți",
-        "miercuri",
-        "joi",
-        "vineri",
-        "sâmbătă"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "D",
-        "L",
-        "M",
-        "M",
-        "J",
-        "V",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Du",
-        "Lu",
-        "Ma",
-        "Mi",
-        "Jo",
-        "Vi",
-        "Sâ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ru.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ru.java
deleted file mode 100644
index b00cd88..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ru.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ru".
- */
-public class DateTimeFormatInfoImpl_ru extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y 'г'.";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y 'г'.";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.MM.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "до н.э.",
-        "н.э."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "до н.э.",
-        "н.э."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "LLL y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y 'г'.";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "LLLL y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y 'г'.";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y 'г'.";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "января",
-        "февраля",
-        "марта",
-        "апреля",
-        "мая",
-        "июня",
-        "июля",
-        "августа",
-        "сентября",
-        "октября",
-        "ноября",
-        "декабря"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "Январь",
-        "Февраль",
-        "Март",
-        "Апрель",
-        "Май",
-        "Июнь",
-        "Июль",
-        "Август",
-        "Сентябрь",
-        "Октябрь",
-        "Ноябрь",
-        "Декабрь"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "Я",
-        "Ф",
-        "М",
-        "А",
-        "М",
-        "И",
-        "И",
-        "А",
-        "С",
-        "О",
-        "Н",
-        "Д"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "янв.",
-        "февр.",
-        "марта",
-        "апр.",
-        "мая",
-        "июня",
-        "июля",
-        "авг.",
-        "сент.",
-        "окт.",
-        "нояб.",
-        "дек."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return new String[] { 
-        "янв.",
-        "февр.",
-        "март",
-        "апр.",
-        "май",
-        "июнь",
-        "июль",
-        "авг.",
-        "сент.",
-        "окт.",
-        "нояб.",
-        "дек."
-    };
-  }
-
-  @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 timeFormatFull() {
-    return "H:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "воскресенье",
-        "понедельник",
-        "вторник",
-        "среда",
-        "четверг",
-        "пятница",
-        "суббота"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return new String[] { 
-        "Воскресенье",
-        "Понедельник",
-        "Вторник",
-        "Среда",
-        "Четверг",
-        "Пятница",
-        "Суббота"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "В",
-        "П",
-        "В",
-        "С",
-        "Ч",
-        "П",
-        "С"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Вс",
-        "Пн",
-        "Вт",
-        "Ср",
-        "Чт",
-        "Пт",
-        "Сб"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index 1458bf1..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ru_UA.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ru_UA".
- */
-public class DateTimeFormatInfoImpl_ru_UA extends DateTimeFormatInfoImpl_ru {
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "HH:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @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";
-  }
-}
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
deleted file mode 100644
index 7939abc..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_rw.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "rw".
- */
-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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    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[] { 
-        "Mutarama",
-        "Gashyantare",
-        "Werurwe",
-        "Mata",
-        "Gicuransi",
-        "Kamena",
-        "Nyakanga",
-        "Kanama",
-        "Nzeli",
-        "Ukwakira",
-        "Ugushyingo",
-        "Ukuboza"
-    };
-  }
-
-  @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[] { 
-        "mut.",
-        "gas.",
-        "wer.",
-        "mat.",
-        "gic.",
-        "kam.",
-        "nya.",
-        "kan.",
-        "nze.",
-        "ukw.",
-        "ugu.",
-        "uku."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "igihembwe cya mbere",
-        "igihembwe cya kabiri",
-        "igihembwe cya gatatu",
-        "igihembwe cya kane"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "I1",
-        "I2",
-        "I3",
-        "I4"
-    };
-  }
-
-  @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[] { 
-        "Ku cyumweru",
-        "Kuwa mbere",
-        "Kuwa kabiri",
-        "Kuwa gatatu",
-        "Kuwa kane",
-        "Kuwa gatanu",
-        "Kuwa gatandatu"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "cyu.",
-        "mbe.",
-        "kab.",
-        "gtu.",
-        "kan.",
-        "gnu.",
-        "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
deleted file mode 100644
index c4a8edf..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sa.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sa".
- */
-public class DateTimeFormatInfoImpl_sa extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MM-yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d-MM-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "hh:mm:ss a zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "hh:mm:ss a z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "hh:mm:ss a";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "hh:mm a";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sa_IN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sa_IN.java
deleted file mode 100644
index 3d9dca3..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sa_IN.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sa_IN".
- */
-public class DateTimeFormatInfoImpl_sa_IN extends DateTimeFormatInfoImpl_sa {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-
-  @Override
-  public int weekendStart() {
-    return 0;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_se.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_se.java
deleted file mode 100644
index 986f50c..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_se.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "se".
- */
-public class DateTimeFormatInfoImpl_se 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[] { 
-        "ovdal Kristtusa",
-        "maŋŋel Kristtusa"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "o.Kr.",
-        "m.Kr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ođđajagemánnu",
-        "guovvamánnu",
-        "njukčamánnu",
-        "cuoŋománnu",
-        "miessemánnu",
-        "geassemánnu",
-        "suoidnemánnu",
-        "borgemánnu",
-        "čakčamánnu",
-        "golggotmánnu",
-        "skábmamánnu",
-        "juovlamánnu"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "O",
-        "G",
-        "N",
-        "C",
-        "M",
-        "G",
-        "S",
-        "B",
-        "Č",
-        "G",
-        "S",
-        "J"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ođđj",
-        "guov",
-        "njuk",
-        "cuo",
-        "mies",
-        "geas",
-        "suoi",
-        "borg",
-        "čakč",
-        "golg",
-        "skáb",
-        "juov"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "Q1",
-        "K2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "sotnabeaivi",
-        "vuossárga",
-        "maŋŋebárga",
-        "gaskavahkku",
-        "duorasdat",
-        "bearjadat",
-        "lávvardat"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "s",
-        "v",
-        "m",
-        "g",
-        "d",
-        "b",
-        "L"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "sotn",
-        "vuos",
-        "maŋ",
-        "gask",
-        "duor",
-        "bear",
-        "láv"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_se_FI.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_se_FI.java
deleted file mode 100644
index 38be7d0..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_se_FI.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "se_FI".
- */
-public class DateTimeFormatInfoImpl_se_FI extends DateTimeFormatInfoImpl_se {
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "maŋŋel Kristtusa"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "m.Kr."
-    };
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ođđajage",
-        "guovva",
-        "njukča",
-        "cuoŋo",
-        "miesse",
-        "geasse",
-        "suoidne",
-        "borge",
-        "čakča",
-        "golggot",
-        "skábma",
-        "juovla"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "aejlege",
-        "måanta",
-        "däjsta",
-        "gaskevahkoe",
-        "dåarsta",
-        "bearjadahke",
-        "laavadahke"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "D",
-        "G",
-        "D",
-        "B",
-        "L"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sh.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sh.java
deleted file mode 100644
index 32ba951..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sh.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sh".
- */
-public class DateTimeFormatInfoImpl_sh extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "pre podne",
-        "popodne"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, dd. MMMM y.";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd. MMMM y.";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.MM.y.";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d.M.yy.";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Pre nove ere",
-        "Nove ere"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "p. n. e.",
-        "n. e"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "hh.mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "hh.mm.ss a";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "HH.mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "HH.mm.ss";
-  }
-
-  @Override
-  public String formatMinuteSecond() {
-    return "mm.ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "MMM d.";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "MMMM d.";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d. MMMM";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y.";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y.";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y.";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d. MMM y.";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januar",
-        "februar",
-        "mart",
-        "april",
-        "maj",
-        "jun",
-        "jul",
-        "avgust",
-        "septembar",
-        "oktobar",
-        "novembar",
-        "decembar"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "j",
-        "f",
-        "m",
-        "a",
-        "m",
-        "j",
-        "j",
-        "a",
-        "s",
-        "o",
-        "n",
-        "d"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "maj",
-        "jun",
-        "jul",
-        "avg",
-        "sep",
-        "okt",
-        "nov",
-        "dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. kvartal",
-        "2. kvartal",
-        "3. kvartal",
-        "4. kvartal"
-    };
-  }
-
-  @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[] { 
-        "nedelja",
-        "ponedeljak",
-        "utorak",
-        "sreda",
-        "četvrtak",
-        "petak",
-        "subota"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "n",
-        "p",
-        "u",
-        "s",
-        "č",
-        "p",
-        "s"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ned",
-        "pon",
-        "uto",
-        "sre",
-        "čet",
-        "pet",
-        "sub"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
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
deleted file mode 100644
index 67b57c7..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_si.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "si".
- */
-public class DateTimeFormatInfoImpl_si extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "පෙ.ව.",
-        "ප.ව."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, y MMMM d";
-  }
-
-  @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[] { 
-        "ක්‍රිස්තු පූර්‍ව",
-        "ක්‍රිස්තු වර්‍ෂ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ක්‍රි.පූ.",
-        "ක්‍රි.ව."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y/M/d";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ජනවාර",
-        "පෙබරවාර",
-        "මාර්ත",
-        "අප්‍රේල්",
-        "මැයි",
-        "ජූන",
-        "ජූලි",
-        "අගෝස්තු",
-        "සැප්තැම්බර්",
-        "ඔක්තෝබර්",
-        "නොවැම්බර්",
-        "දෙසැම්බර්"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ජ",
-        "පෙ",
-        "මා",
-        "අ",
-        "මැ",
-        "ජූ",
-        "ජූ",
-        "අ",
-        "සැ",
-        "ඔ",
-        "නො",
-        "දෙ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ජන",
-        "පෙබ",
-        "මාර්ත",
-        "අප්‍රේල",
-        "මැය",
-        "ජූන",
-        "ජූල",
-        "අගෝ",
-        "සැප",
-        "ඔක",
-        "නොවැ",
-        "දෙසැ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @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[] { 
-        "ඉරිදා",
-        "සඳුදා",
-        "අඟහරුවාදා",
-        "බදාදා",
-        "බ්‍රහස්පතින්දා",
-        "සිකුරාදා",
-        "සෙනසුරාදා"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ඉ",
-        "ස",
-        "අ",
-        "බ",
-        "බ්‍ර",
-        "සි",
-        "සෙ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ඉරි",
-        "සඳු",
-        "අඟ",
-        "බදා",
-        "බ්‍රහ",
-        "සිකු",
-        "සෙන"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sid.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sid.java
deleted file mode 100644
index f4076d3..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sid.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sid".
- */
-public class DateTimeFormatInfoImpl_sid extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "soodo",
-        "hawwaro"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, MMMM dd, y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "YIA",
-        "YIG"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "YIA",
-        "YIG"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Sambata",
-        "Sanyo",
-        "Maakisanyo",
-        "Roowe",
-        "Hamuse",
-        "Arbe",
-        "Qidaame"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "S",
-        "M",
-        "R",
-        "H",
-        "A",
-        "Q"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Sam",
-        "San",
-        "Mak",
-        "Row",
-        "Ham",
-        "Arb",
-        "Qid"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sid_ET.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sid_ET.java
deleted file mode 100644
index 0f9b731..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sid_ET.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sid_ET".
- */
-public class DateTimeFormatInfoImpl_sid_ET extends DateTimeFormatInfoImpl_sid {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
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
deleted file mode 100644
index 728a9c7..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sk.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sk".
- */
-public class DateTimeFormatInfoImpl_sk extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "dopoludnia",
-        "popoludní"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d.M.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d.M.yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "pred n.l.",
-        "n.l."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "pred n.l.",
-        "n.l."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d. MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M.";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "LLL y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "LLLL y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d. MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januára",
-        "februára",
-        "marca",
-        "apríla",
-        "mája",
-        "júna",
-        "júla",
-        "augusta",
-        "septembra",
-        "októbra",
-        "novembra",
-        "decembra"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "január",
-        "február",
-        "marec",
-        "apríl",
-        "máj",
-        "jún",
-        "júl",
-        "august",
-        "september",
-        "október",
-        "november",
-        "december"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "j",
-        "f",
-        "m",
-        "a",
-        "m",
-        "j",
-        "j",
-        "a",
-        "s",
-        "o",
-        "n",
-        "d"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "máj",
-        "jún",
-        "júl",
-        "aug",
-        "sep",
-        "okt",
-        "nov",
-        "dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. štvrťrok",
-        "2. štvrťrok",
-        "3. štvrťrok",
-        "4. štvrťrok"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H:mm:ss zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "nedeľa",
-        "pondelok",
-        "utorok",
-        "streda",
-        "štvrtok",
-        "piatok",
-        "sobota"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "N",
-        "P",
-        "U",
-        "S",
-        "Š",
-        "P",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ne",
-        "po",
-        "ut",
-        "st",
-        "št",
-        "pi",
-        "so"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sl.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sl.java
deleted file mode 100644
index da42280..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sl.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sl".
- */
-public class DateTimeFormatInfoImpl_sl extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "dop.",
-        "pop."
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, dd. MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd. MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d. MMM. yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d. MM. yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "pred našim štetjem",
-        "naše štetje"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "pr. n. št.",
-        "po Kr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d. MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d. MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d. M.";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d. M. y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d. MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ/y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q/y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januar",
-        "februar",
-        "marec",
-        "april",
-        "maj",
-        "junij",
-        "julij",
-        "avgust",
-        "september",
-        "oktober",
-        "november",
-        "december"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "j",
-        "f",
-        "m",
-        "a",
-        "m",
-        "j",
-        "j",
-        "a",
-        "s",
-        "o",
-        "n",
-        "d"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "maj",
-        "jun",
-        "jul",
-        "avg",
-        "sep",
-        "okt",
-        "nov",
-        "dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. četrtletje",
-        "2. četrtletje",
-        "3. četrtletje",
-        "4. četrtletje"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H: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[] { 
-        "nedelja",
-        "ponedeljek",
-        "torek",
-        "sreda",
-        "četrtek",
-        "petek",
-        "sobota"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "n",
-        "p",
-        "t",
-        "s",
-        "č",
-        "p",
-        "s"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ned",
-        "pon",
-        "tor",
-        "sre",
-        "čet",
-        "pet",
-        "sob"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_so.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_so.java
deleted file mode 100644
index 24e8edc..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_so.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "so".
- */
-public class DateTimeFormatInfoImpl_so extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "sn",
-        "gn"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, MMMM dd, y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Ciise ka hor",
-        "Ciise ka dib"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "Ciise ka hor",
-        "Ciise ka dib"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Bisha Koobaad",
-        "Bisha Labaad",
-        "Bisha Saddexaad",
-        "Bisha Afraad",
-        "Bisha Shanaad",
-        "Bisha Lixaad",
-        "Bisha Todobaad",
-        "Bisha Sideedaad",
-        "Bisha Sagaalaad",
-        "Bisha Tobnaad",
-        "Bisha Kow iyo Tobnaad",
-        "Bisha Laba iyo Tobnaad"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "K",
-        "L",
-        "S",
-        "A",
-        "S",
-        "L",
-        "T",
-        "S",
-        "S",
-        "T",
-        "K",
-        "L"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Kob",
-        "Lab",
-        "Sad",
-        "Afr",
-        "Sha",
-        "Lix",
-        "Tod",
-        "Sid",
-        "Sag",
-        "Tob",
-        "KIT",
-        "LIT"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Axad",
-        "Isniin",
-        "Salaaso",
-        "Arbaco",
-        "Khamiis",
-        "Jimco",
-        "Sabti"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "A",
-        "I",
-        "S",
-        "A",
-        "K",
-        "J",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Axa",
-        "Isn",
-        "Sal",
-        "Arb",
-        "Kha",
-        "Jim",
-        "Sab"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sq.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sq.java
deleted file mode 100644
index 78b91fa..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sq.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sq".
- */
-public class DateTimeFormatInfoImpl_sq extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "PD",
-        "MD"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy-MM-dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "p.e.r.",
-        "n.e.r."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "p.e.r.",
-        "n.e.r."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "h.mm.a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "h.mm.ss.a";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H.mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H.mm.ss";
-  }
-
-  @Override
-  public String formatMinuteSecond() {
-    return "mm.ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.yyyy";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "janar",
-        "shkurt",
-        "mars",
-        "prill",
-        "maj",
-        "qershor",
-        "korrik",
-        "gusht",
-        "shtator",
-        "tetor",
-        "nëntor",
-        "dhjetor"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "J",
-        "S",
-        "M",
-        "P",
-        "M",
-        "Q",
-        "K",
-        "G",
-        "S",
-        "T",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Jan",
-        "Shk",
-        "Mar",
-        "Pri",
-        "Maj",
-        "Qer",
-        "Kor",
-        "Gsh",
-        "Sht",
-        "Tet",
-        "Nën",
-        "Dhj"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "e diel",
-        "e hënë",
-        "e martë",
-        "e mërkurë",
-        "e enjte",
-        "e premte",
-        "e shtunë"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "D",
-        "H",
-        "M",
-        "M",
-        "E",
-        "P",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Die",
-        "Hën",
-        "Mar",
-        "Mër",
-        "Enj",
-        "Pre",
-        "Sht"
-    };
-  }
-
-  @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
deleted file mode 100644
index 5d85b5e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sr".
- */
-public class DateTimeFormatInfoImpl_sr extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "пре подне",
-        "поподне"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, dd. MMMM y.";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd. MMMM y.";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.MM.y.";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d.M.yy.";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Пре нове ере",
-        "Нове ере"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "п. н. е.",
-        "н. е"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "hh.mm a";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "hh.mm.ss a";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "HH.mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "HH.mm.ss";
-  }
-
-  @Override
-  public String formatMinuteSecond() {
-    return "mm.ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "MMM d.";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "MMMM d.";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d. MMMM";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM. y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d. MMM y.";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM. y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d. MMMM y.";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y.";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d. MMM y.";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "јануар",
-        "фебруар",
-        "март",
-        "април",
-        "мај",
-        "јун",
-        "јул",
-        "август",
-        "септембар",
-        "октобар",
-        "новембар",
-        "децембар"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ј",
-        "ф",
-        "м",
-        "а",
-        "м",
-        "ј",
-        "ј",
-        "а",
-        "с",
-        "о",
-        "н",
-        "д"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "јан",
-        "феб",
-        "мар",
-        "апр",
-        "мај",
-        "јун",
-        "јул",
-        "авг",
-        "сеп",
-        "окт",
-        "нов",
-        "дец"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Прво тромесечје",
-        "Друго тромесечје",
-        "Треће тромесечје",
-        "Четврто тромесечје"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "К1",
-        "К2",
-        "К3",
-        "К4"
-    };
-  }
-
-  @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[] { 
-        "недеља",
-        "понедељак",
-        "уторак",
-        "среда",
-        "четвртак",
-        "петак",
-        "субота"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "н",
-        "п",
-        "у",
-        "с",
-        "ч",
-        "п",
-        "с"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "нед",
-        "пон",
-        "уто",
-        "сре",
-        "чет",
-        "пет",
-        "суб"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr_BA.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr_BA.java
deleted file mode 100644
index d11c51b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr_BA.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sr_BA".
- */
-public class DateTimeFormatInfoImpl_sr_BA extends DateTimeFormatInfoImpl_sr {
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy-MM-dd";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "HH:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y-M-d";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "јануар",
-        "фебруар",
-        "март",
-        "април",
-        "мај",
-        "јуни",
-        "јули",
-        "август",
-        "септембар",
-        "октобар",
-        "новембар",
-        "децембар"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "HH 'часова', mm 'минута', ss 'секунди' zzzz";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "HH:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "HH:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "недеља",
-        "понедељак",
-        "уторак",
-        "сриједа",
-        "четвртак",
-        "петак",
-        "субота"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "нед",
-        "пон",
-        "уто",
-        "сри",
-        "чет",
-        "пет",
-        "суб"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr_Latn.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr_Latn.java
deleted file mode 100644
index fd06c1e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr_Latn.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sr_Latn".
- */
-public class DateTimeFormatInfoImpl_sr_Latn extends DateTimeFormatInfoImpl_sr {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "pre podne",
-        "popodne"
-    };
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Pre nove ere",
-        "Nove ere"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "p. n. e.",
-        "n. e"
-    };
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "y MMM";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "y MMMM";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januar",
-        "februar",
-        "mart",
-        "april",
-        "maj",
-        "jun",
-        "jul",
-        "avgust",
-        "septembar",
-        "oktobar",
-        "novembar",
-        "decembar"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "j",
-        "f",
-        "m",
-        "a",
-        "m",
-        "j",
-        "j",
-        "a",
-        "s",
-        "o",
-        "n",
-        "d"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "maj",
-        "jun",
-        "jul",
-        "avg",
-        "sep",
-        "okt",
-        "nov",
-        "dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. kvartal",
-        "2. kvartal",
-        "3. kvartal",
-        "4. kvartal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "nedelja",
-        "ponedeljak",
-        "utorak",
-        "sreda",
-        "četvrtak",
-        "petak",
-        "subota"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "n",
-        "p",
-        "u",
-        "s",
-        "č",
-        "p",
-        "s"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ned",
-        "pon",
-        "uto",
-        "sre",
-        "čet",
-        "pet",
-        "sub"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr_ME.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr_ME.java
deleted file mode 100644
index 94c1028..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sr_ME.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sr_ME".
- */
-public class DateTimeFormatInfoImpl_sr_ME extends DateTimeFormatInfoImpl_sr {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "pre podne",
-        "popodne"
-    };
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d.MM.yyyy.";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Pre nove ere",
-        "Nove ere"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "p. n. e.",
-        "n. e"
-    };
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "y MMM";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "y MMMM";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januar",
-        "februar",
-        "mart",
-        "april",
-        "maj",
-        "jun",
-        "jul",
-        "avgust",
-        "septembar",
-        "oktobar",
-        "novembar",
-        "decembar"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "j",
-        "f",
-        "m",
-        "a",
-        "m",
-        "j",
-        "j",
-        "a",
-        "s",
-        "o",
-        "n",
-        "d"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "maj",
-        "jun",
-        "jul",
-        "avg",
-        "sep",
-        "okt",
-        "nov",
-        "dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. kvartal",
-        "2. kvartal",
-        "3. kvartal",
-        "4. kvartal"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "nedelja",
-        "ponedeljak",
-        "utorak",
-        "sreda",
-        "četvrtak",
-        "petak",
-        "subota"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "n",
-        "p",
-        "u",
-        "s",
-        "č",
-        "p",
-        "s"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ned",
-        "pon",
-        "uto",
-        "sre",
-        "čet",
-        "pet",
-        "sub"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ss.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ss.java
deleted file mode 100644
index 6db513b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ss.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ss".
- */
-public class DateTimeFormatInfoImpl_ss 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"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Bhimbidvwane",
-        "iNdlovana",
-        "iNdlovu-lenkhulu",
-        "Mabasa",
-        "iNkhwekhweti",
-        "iNhlaba",
-        "Kholwane",
-        "iNgci",
-        "iNyoni",
-        "iMphala",
-        "Lweti",
-        "iNgongoni"
-    };
-  }
-
-  @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[] { 
-        "Bhi",
-        "Van",
-        "Vol",
-        "Mab",
-        "Nkh",
-        "Nhl",
-        "Kho",
-        "Ngc",
-        "Nyo",
-        "Mph",
-        "Lwe",
-        "Ngo"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Lisontfo",
-        "uMsombuluko",
-        "Lesibili",
-        "Lesitsatfu",
-        "Lesine",
-        "Lesihlanu",
-        "uMgcibelo"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Son",
-        "Mso",
-        "Bil",
-        "Tsa",
-        "Ne",
-        "Hla",
-        "Mgc"
-    };
-  }
-
-  @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
deleted file mode 100644
index 55071fe..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_st.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "st".
- */
-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"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Phesekgong",
-        "Hlakola",
-        "Hlakubele",
-        "Mmese",
-        "Motsheanong",
-        "Phupjane",
-        "Phupu",
-        "Phata",
-        "Leotshe",
-        "Mphalane",
-        "Pundungwane",
-        "Tshitwe"
-    };
-  }
-
-  @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[] { 
-        "Phe",
-        "Kol",
-        "Ube",
-        "Mme",
-        "Mot",
-        "Jan",
-        "Upu",
-        "Pha",
-        "Leo",
-        "Mph",
-        "Pun",
-        "Tsh"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Sontaha",
-        "Mmantaha",
-        "Labobedi",
-        "Laboraru",
-        "Labone",
-        "Labohlane",
-        "Moqebelo"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Son",
-        "Mma",
-        "Bed",
-        "Rar",
-        "Ne",
-        "Hla",
-        "Moq"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sv.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sv.java
deleted file mode 100644
index 04dad6f..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sv.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sv".
- */
-public class DateTimeFormatInfoImpl_sv extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "fm",
-        "em"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "före Kristus",
-        "efter Kristus"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "f.Kr.",
-        "e.Kr."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d:'e' MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d:'e' MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy-MM";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE'en' 'den' d:'e' MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "yyyy QQQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "yyyy Q";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "januari",
-        "februari",
-        "mars",
-        "april",
-        "maj",
-        "juni",
-        "juli",
-        "augusti",
-        "september",
-        "oktober",
-        "november",
-        "december"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "jan",
-        "feb",
-        "mar",
-        "apr",
-        "maj",
-        "jun",
-        "jul",
-        "aug",
-        "sep",
-        "okt",
-        "nov",
-        "dec"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1:a kvartalet",
-        "2:a kvartalet",
-        "3:e kvartalet",
-        "4:e kvartalet"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "söndag",
-        "måndag",
-        "tisdag",
-        "onsdag",
-        "torsdag",
-        "fredag",
-        "lördag"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "T",
-        "O",
-        "T",
-        "F",
-        "L"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "sön",
-        "mån",
-        "tis",
-        "ons",
-        "tors",
-        "fre",
-        "lör"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sw.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sw.java
deleted file mode 100644
index ce8c396..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sw.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sw".
- */
-public class DateTimeFormatInfoImpl_sw 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[] { 
-        "Kabla ya Kristo",
-        "Baada ya Kristo"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "KK",
-        "BK"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Januari",
-        "Februari",
-        "Machi",
-        "Aprili",
-        "Mei",
-        "Juni",
-        "Julai",
-        "Agosti",
-        "Septemba",
-        "Oktoba",
-        "Novemba",
-        "Desemba"
-    };
-  }
-
-  @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[] { 
-        "Jan",
-        "Feb",
-        "Mac",
-        "Apr",
-        "Mei",
-        "Jun",
-        "Jul",
-        "Ago",
-        "Sep",
-        "Okt",
-        "Nov",
-        "Des"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "robo ya kwanza",
-        "robo ya pili",
-        "robo ya tatu",
-        "robo ya nne"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "R1",
-        "R2",
-        "R3",
-        "R4"
-    };
-  }
-
-  @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[] { 
-        "Jumapili",
-        "Jumatatu",
-        "Jumanne",
-        "Jumatano",
-        "Alhamisi",
-        "Ijumaa",
-        "Jumamosi"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Jpi",
-        "Jtt",
-        "Jnn",
-        "Jtn",
-        "Alh",
-        "Iju",
-        "Jmo"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sw_KE.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sw_KE.java
deleted file mode 100644
index b9abe55..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_sw_KE.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "sw_KE".
- */
-public class DateTimeFormatInfoImpl_sw_KE extends DateTimeFormatInfoImpl_sw {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_syr.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_syr.java
deleted file mode 100644
index 71d6f90..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_syr.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "syr".
- */
-public class DateTimeFormatInfoImpl_syr extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "dd MMMM, y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM, y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "܏ܟܢ ܏ܒ",
-        "ܫܒܛ",
-        "ܐܕܪ",
-        "ܢܝܣܢ",
-        "ܐܝܪ",
-        "ܚܙܝܪܢ",
-        "ܬܡܘܙ",
-        "ܐܒ",
-        "ܐܝܠܘܠ",
-        "܏ܬܫ ܏ܐ",
-        "܏ܬܫ ܏ܒ",
-        "܏ܟܢ ܏ܐ"
-    };
-  }
-
-  @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[] { 
-        "܏ܟܢ ܏ܒ",
-        "ܫܒܛ",
-        "ܐܕܪ",
-        "ܢܝܣܢ",
-        "ܐܝܪ",
-        "ܚܙܝܪܢ",
-        "ܬܡܘܙ",
-        "ܐܒ",
-        "ܐܝܠܘܠ",
-        "܏ܬܫ ܏ܐ",
-        "܏ܬܫ ܏ܒ",
-        "܏ܟܢ ܏ܐ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "h:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "h:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_syr_SY.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_syr_SY.java
deleted file mode 100644
index e187a95..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_syr_SY.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "syr_SY".
- */
-public class DateTimeFormatInfoImpl_syr_SY extends DateTimeFormatInfoImpl_syr {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-
-  @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_ta.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ta.java
deleted file mode 100644
index 148cf8a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ta.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ta".
- */
-public class DateTimeFormatInfoImpl_ta extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "am",
-        "pm"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM, y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM, y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d-M-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "கிறிஸ்துவுக்கு முன்",
-        "அனோ டோமினி"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "கிமு",
-        "கிபி"
-    };
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ஜனவரி",
-        "பிப்ரவரி",
-        "மார்ச்",
-        "ஏப்ரல்",
-        "மே",
-        "ஜூன்",
-        "ஜூலை",
-        "ஆகஸ்ட்",
-        "செப்டம்பர்",
-        "அக்டோபர்",
-        "நவம்பர்",
-        "டிசம்பர்"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ஜ",
-        "பி",
-        "மா",
-        "ஏ",
-        "மே",
-        "ஜூ",
-        "ஜூ",
-        "ஆ",
-        "செ",
-        "அ",
-        "ந",
-        "டி"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ஜன.",
-        "பிப்.",
-        "மார்.",
-        "ஏப்.",
-        "மே",
-        "ஜூன்",
-        "ஜூலை",
-        "ஆக.",
-        "செப்.",
-        "அக்.",
-        "நவ.",
-        "டிச."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1ஆம் காலாண்டு",
-        "2ஆம் காலாண்டு",
-        "3ஆம் காலாண்டு",
-        "4ஆம் காலாண்டு"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ஞாயிறு",
-        "திங்கள்",
-        "செவ்வாய்",
-        "புதன்",
-        "வியாழன்",
-        "வெள்ளி",
-        "சனி"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ஞா",
-        "தி",
-        "செ",
-        "பு",
-        "வி",
-        "வெ",
-        "ச"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_te.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_te.java
deleted file mode 100644
index 20674d0..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_te.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "te".
- */
-public class DateTimeFormatInfoImpl_te extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "am",
-        "pm"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd-MM-yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ఈసాపూర్వ.",
-        "సన్."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d-M-y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "జనవరి",
-        "ఫిబ్రవరి",
-        "మార్చి",
-        "ఏప్రిల్",
-        "మే",
-        "జూన్",
-        "జూలై",
-        "ఆగస్టు",
-        "సెప్టెంబర్",
-        "అక్టోబర్",
-        "నవంబర్",
-        "డిసెంబర్"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "జ",
-        "ఫి",
-        "మ",
-        "ఎ",
-        "మె",
-        "జు",
-        "జు",
-        "ఆ",
-        "సె",
-        "అ",
-        "న",
-        "డి"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "జనవరి",
-        "ఫిబ్రవరి",
-        "మార్చి",
-        "ఏప్రిల్",
-        "మే",
-        "జూన్",
-        "జూలై",
-        "ఆగస్టు",
-        "సెప్టెంబర్",
-        "అక్టోబర్",
-        "నవంబర్",
-        "డిసెంబర్"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "ఒకటి 1",
-        "రెండు 2",
-        "మూడు 3",
-        "నాలుగు 4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ఆదివారం",
-        "సోమవారం",
-        "మంగళవారం",
-        "బుధవారం",
-        "గురువారం",
-        "శుక్రవారం",
-        "శనివారం"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ఆ",
-        "సో",
-        "మ",
-        "భు",
-        "గు",
-        "శు",
-        "శ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_tg.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tg.java
deleted file mode 100644
index 37f909e..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tg.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "tg".
- */
-public class DateTimeFormatInfoImpl_tg extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    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[] { 
-        "Пеш аз милод",
-        "ПаМ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ПеМ",
-        "ПаМ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Январ",
-        "Феврал",
-        "Март",
-        "Апрел",
-        "Май",
-        "Июн",
-        "Июл",
-        "Август",
-        "Сентябр",
-        "Октябр",
-        "Ноябр",
-        "Декабр"
-    };
-  }
-
-  @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[] { 
-        "Янв",
-        "Фев",
-        "Мар",
-        "Апр",
-        "Май",
-        "Июн",
-        "Июл",
-        "Авг",
-        "Сен",
-        "Окт",
-        "Ноя",
-        "Дек"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Якшанбе",
-        "Душанбе",
-        "Сешанбе",
-        "Чоршанбе",
-        "Панҷшанбе",
-        "Ҷумъа",
-        "Шанбе"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Яшб",
-        "Дшб",
-        "Сшб",
-        "Чшб",
-        "Пшб",
-        "Ҷмъ",
-        "Шнб"
-    };
-  }
-
-  @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
deleted file mode 100644
index 0ecb342..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_th.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "th".
- */
-public class DateTimeFormatInfoImpl_th extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ก่อนเที่ยง",
-        "หลังเที่ยง"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEEที่ d MMMM G y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/M/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ปีก่อนคริสต์ศักราช",
-        "คริสต์ศักราช"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ปีก่อน ค.ศ.",
-        "ค.ศ."
-    };
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @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";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d ├'F3': MMMM┤";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "d ├'F3': MMMM┤ ├'F6': EEEE┤";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M ├'F7': d┤";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "y ├'F3': MMM┤";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "y ├'F3': MMMM┤";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "y ├'F3': M┤";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "d MMM y ├'F6': EEE┤";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "y ├'F2': QQQQ┤";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "y ├'F2': Q┤";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "มกราคม",
-        "กุมภาพันธ์",
-        "มีนาคม",
-        "เมษายน",
-        "พฤษภาคม",
-        "มิถุนายน",
-        "กรกฎาคม",
-        "สิงหาคม",
-        "กันยายน",
-        "ตุลาคม",
-        "พฤศจิกายน",
-        "ธันวาคม"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ม.ค.",
-        "ก.พ.",
-        "มี.ค.",
-        "เม.ย.",
-        "พ.ค.",
-        "มิ.ย.",
-        "ก.ค.",
-        "ส.ค.",
-        "ก.ย.",
-        "ต.ค.",
-        "พ.ย.",
-        "ธ.ค."
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ม.ค.",
-        "ก.พ.",
-        "มี.ค.",
-        "เม.ย.",
-        "พ.ค.",
-        "มิ.ย.",
-        "ก.ค.",
-        "ส.ค.",
-        "ก.ย.",
-        "ต.ค.",
-        "พ.ย.",
-        "ธ.ค."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "ไตรมาส 1",
-        "ไตรมาส 2",
-        "ไตรมาส 3",
-        "ไตรมาส 4"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H นาฬิกา m นาที ss วินาที zzzz";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H นาฬิกา m นาที ss วินาที z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "วันอาทิตย์",
-        "วันจันทร์",
-        "วันอังคาร",
-        "วันพุธ",
-        "วันพฤหัสบดี",
-        "วันศุกร์",
-        "วันเสาร์"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "อ",
-        "จ",
-        "อ",
-        "พ",
-        "พ",
-        "ศ",
-        "ส"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "อา.",
-        "จ.",
-        "อ.",
-        "พ.",
-        "พฤ.",
-        "ศ.",
-        "ส."
-    };
-  }
-
-  @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
deleted file mode 100644
index a059e8c..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ti.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ti".
- */
-public class DateTimeFormatInfoImpl_ti extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ንጉሆ ሰዓተ",
-        "ድሕር ሰዓት"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE፣ dd MMMM መዓልቲ y G";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ዓ/ዓ",
-        "ዓ/ም"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ዓ/ዓ",
-        "ዓ/ም"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ጃንዩወሪ",
-        "ፌብሩወሪ",
-        "ማርች",
-        "ኤፕረል",
-        "ሜይ",
-        "ጁን",
-        "ጁላይ",
-        "ኦገስት",
-        "ሴፕቴምበር",
-        "ኦክተውበር",
-        "ኖቬምበር",
-        "ዲሴምበር"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ጃ",
-        "ፌ",
-        "ማ",
-        "ኤ",
-        "ሜ",
-        "ጁ",
-        "ጁ",
-        "ኦ",
-        "ሴ",
-        "ኦ",
-        "ኖ",
-        "ዲ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ጃንዩ",
-        "ፌብሩ",
-        "ማርች",
-        "ኤፕረ",
-        "ሜይ",
-        "ጁን",
-        "ጁላይ",
-        "ኦገስ",
-        "ሴፕቴ",
-        "ኦክተ",
-        "ኖቬም",
-        "ዲሴም"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ሰንበት",
-        "ሰኑይ",
-        "ሠሉስ",
-        "ረቡዕ",
-        "ኃሙስ",
-        "ዓርቢ",
-        "ቀዳም"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ሰ",
-        "ሰ",
-        "ሠ",
-        "ረ",
-        "ኃ",
-        "ዓ",
-        "ቀ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ሰንበ",
-        "ሰኑይ",
-        "ሠሉስ",
-        "ረቡዕ",
-        "ኃሙስ",
-        "ዓርቢ",
-        "ቀዳም"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ti_ER.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ti_ER.java
deleted file mode 100644
index 490eea4..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ti_ER.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ti_ER".
- */
-public class DateTimeFormatInfoImpl_ti_ER extends DateTimeFormatInfoImpl_ti {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE፡ dd MMMM መዓልቲ y G";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ጥሪ",
-        "ለካቲት",
-        "መጋቢት",
-        "ሚያዝያ",
-        "ግንቦት",
-        "ሰነ",
-        "ሓምለ",
-        "ነሓሰ",
-        "መስከረም",
-        "ጥቅምቲ",
-        "ሕዳር",
-        "ታሕሳስ"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ጥሪ",
-        "ለካቲ",
-        "መጋቢ",
-        "ሚያዝ",
-        "ግንቦ",
-        "ሰነ",
-        "ሓምለ",
-        "ነሓሰ",
-        "መስከ",
-        "ጥቅም",
-        "ሕዳር",
-        "ታሕሳ"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ሰንበት",
-        "ሰኑይ",
-        "ሰሉስ",
-        "ረቡዕ",
-        "ሓሙስ",
-        "ዓርቢ",
-        "ቀዳም"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ሰንበ",
-        "ሰኑይ",
-        "ሰሉስ",
-        "ረቡዕ",
-        "ሓሙስ",
-        "ዓርቢ",
-        "ቀዳም"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tig.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tig.java
deleted file mode 100644
index 83f9d50..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tig.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "tig".
- */
-public class DateTimeFormatInfoImpl_tig extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ቀደም ሰርምዕል",
-        "ሓቆ ስርምዕል"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE፡ dd MMMM ዮም y G";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ዓ/ዓ",
-        "ዓ/ም"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ዓ/ዓ",
-        "ዓ/ም"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ጃንዩወሪ",
-        "ፌብሩወሪ",
-        "ማርች",
-        "ኤፕረል",
-        "ሜይ",
-        "ጁን",
-        "ጁላይ",
-        "ኦገስት",
-        "ሴፕቴምበር",
-        "ኦክተውበር",
-        "ኖቬምበር",
-        "ዲሴምበር"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ጃ",
-        "ፌ",
-        "ማ",
-        "ኤ",
-        "ሜ",
-        "ጁ",
-        "ጁ",
-        "ኦ",
-        "ሴ",
-        "ኦ",
-        "ኖ",
-        "ዲ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ጃንዩ",
-        "ፌብሩ",
-        "ማርች",
-        "ኤፕረ",
-        "ሜይ",
-        "ጁን",
-        "ጁላይ",
-        "ኦገስ",
-        "ሴፕቴ",
-        "ኦክተ",
-        "ኖቬም",
-        "ዲሴም"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ሰንበት ዓባይ",
-        "ሰኖ",
-        "ታላሸኖ",
-        "ኣረርባዓ",
-        "ከሚሽ",
-        "ጅምዓት",
-        "ሰንበት ንኢሽ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ሰ",
-        "ሰ",
-        "ታ",
-        "ኣ",
-        "ከ",
-        "ጅ",
-        "ሰ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ሰ/ዓ",
-        "ሰኖ",
-        "ታላሸ",
-        "ኣረር",
-        "ከሚሽ",
-        "ጅምዓ",
-        "ሰ/ን"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tig_ER.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tig_ER.java
deleted file mode 100644
index c3cdbab..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tig_ER.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "tig_ER".
- */
-public class DateTimeFormatInfoImpl_tig_ER extends DateTimeFormatInfoImpl_tig {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tl.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tl.java
deleted file mode 100644
index 5b92e54..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tl.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "tl".
- */
-public class DateTimeFormatInfoImpl_tl extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, MMMM dd y";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy-M";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Enero",
-        "Pebrero",
-        "Marso",
-        "Abril",
-        "Mayo",
-        "Hunyo",
-        "Hulyo",
-        "Agosto",
-        "Setyembre",
-        "Oktubre",
-        "Nobyembre",
-        "Disyembre"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "E",
-        "P",
-        "M",
-        "A",
-        "M",
-        "H",
-        "H",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Ene",
-        "Peb",
-        "Mar",
-        "Abr",
-        "May",
-        "Hun",
-        "Hul",
-        "Ago",
-        "Set",
-        "Okt",
-        "Nob",
-        "Dis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Linggo",
-        "Lunes",
-        "Martes",
-        "Miyerkules",
-        "Huwebes",
-        "Biyernes",
-        "Sabado"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "L",
-        "L",
-        "M",
-        "M",
-        "H",
-        "B",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Lin",
-        "Lun",
-        "Mar",
-        "Mye",
-        "Huw",
-        "Bye",
-        "Sab"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return new String[] { 
-        "Lin",
-        "Lun",
-        "Mar",
-        "Miy",
-        "Huw",
-        "Biy",
-        "Sab"
-    };
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tn.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tn.java
deleted file mode 100644
index 7d0d09a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tn.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "tn".
- */
-public class DateTimeFormatInfoImpl_tn 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"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Ferikgong",
-        "Tlhakole",
-        "Mopitlo",
-        "Moranang",
-        "Motsheganang",
-        "Seetebosigo",
-        "Phukwi",
-        "Phatwe",
-        "Lwetse",
-        "Diphalane",
-        "Ngwanatsele",
-        "Sedimonthole"
-    };
-  }
-
-  @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[] { 
-        "Fer",
-        "Tlh",
-        "Mop",
-        "Mor",
-        "Mot",
-        "See",
-        "Phu",
-        "Pha",
-        "Lwe",
-        "Dip",
-        "Ngw",
-        "Sed"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Tshipi",
-        "Mosopulogo",
-        "Labobedi",
-        "Laboraro",
-        "Labone",
-        "Labotlhano",
-        "Matlhatso"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Tsh",
-        "Mos",
-        "Bed",
-        "Rar",
-        "Ne",
-        "Tla",
-        "Mat"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_to.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_to.java
deleted file mode 100644
index dd32915..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_to.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "to".
- */
-public class DateTimeFormatInfoImpl_to extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "HH",
-        "EA"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd-MM-yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ki muʻa",
-        "taʻu ʻo Sīsū"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "KM",
-        "TS"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d/M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "yyyy QQQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "yyyy Q";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Sānuali",
-        "Fēpueli",
-        "Maʻasi",
-        "ʻEpeleli",
-        "Mē",
-        "Sune",
-        "Siulai",
-        "ʻAokosi",
-        "Sēpitema",
-        "ʻOkatopa",
-        "Nōvema",
-        "Tisema"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "S",
-        "F",
-        "M",
-        "E",
-        "M",
-        "S",
-        "S",
-        "A",
-        "S",
-        "O",
-        "N",
-        "T"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Sān",
-        "Fēp",
-        "Maʻa",
-        "ʻEpe",
-        "Mē",
-        "Sun",
-        "Siu",
-        "ʻAok",
-        "Sēp",
-        "ʻOka",
-        "Nōv",
-        "Tis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "kuata ʻuluaki",
-        "kuata ua",
-        "kuata tolu",
-        "kuata fā"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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[] { 
-        "Sāpate",
-        "Mōnite",
-        "Tusite",
-        "Pulelulu",
-        "Tuʻapulelulu",
-        "Falaite",
-        "Tokonaki"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "T",
-        "P",
-        "T",
-        "F",
-        "T"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Sāp",
-        "Mōn",
-        "Tus",
-        "Pul",
-        "Tuʻa",
-        "Fal",
-        "Tok"
-    };
-  }
-
-  @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
deleted file mode 100644
index 6747902..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tr.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "tr".
- */
-public class DateTimeFormatInfoImpl_tr extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "dd MMMM y EEEE";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd MM yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "Milattan Önce",
-        "Milattan Sonra"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "MÖ",
-        "MS"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "dd MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "dd MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "dd MMMM EEEE";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "dd/MM";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/yyyy";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "d MMM y EEE";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Ocak",
-        "Şubat",
-        "Mart",
-        "Nisan",
-        "Mayıs",
-        "Haziran",
-        "Temmuz",
-        "Ağustos",
-        "Eylül",
-        "Ekim",
-        "Kasım",
-        "Aralık"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "O",
-        "Ş",
-        "M",
-        "N",
-        "M",
-        "H",
-        "T",
-        "A",
-        "E",
-        "E",
-        "K",
-        "A"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Oca",
-        "Şub",
-        "Mar",
-        "Nis",
-        "May",
-        "Haz",
-        "Tem",
-        "Ağu",
-        "Eyl",
-        "Eki",
-        "Kas",
-        "Ara"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1. çeyrek",
-        "2. çeyrek",
-        "3. çeyrek",
-        "4. çeyrek"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "Ç1",
-        "Ç2",
-        "Ç3",
-        "Ç4"
-    };
-  }
-
-  @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[] { 
-        "Pazar",
-        "Pazartesi",
-        "Salı",
-        "Çarşamba",
-        "Perşembe",
-        "Cuma",
-        "Cumartesi"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "P",
-        "P",
-        "S",
-        "Ç",
-        "P",
-        "C",
-        "C"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Paz",
-        "Pzt",
-        "Sal",
-        "Çar",
-        "Per",
-        "Cum",
-        "Cmt"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_trv.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_trv.java
deleted file mode 100644
index 53d79a5..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_trv.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "trv".
- */
-public class DateTimeFormatInfoImpl_trv extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "Brax kndaax",
-        "Baubau kndaax"
-    };
-  }
-
-  @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[] { 
-        "Brah jikan Yisu Thulang",
-        "Bukuy jikan Yisu Thulang"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BRY",
-        "BUY"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Kingal idas",
-        "Dha idas",
-        "Tru idas",
-        "Spat idas",
-        "Rima idas",
-        "Mataru idas",
-        "Empitu idas",
-        "Maspat idas",
-        "Mngari idas",
-        "Maxal idas",
-        "Maxal kingal idas",
-        "Maxal dha idas"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "K",
-        "D",
-        "T",
-        "S",
-        "R",
-        "M",
-        "E",
-        "P",
-        "A",
-        "M",
-        "K",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Kii",
-        "Dhi",
-        "Tri",
-        "Spi",
-        "Rii",
-        "Mti",
-        "Emi",
-        "Mai",
-        "Mni",
-        "Mxi",
-        "Mxk",
-        "Mxd"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "mnprxan",
-        "mndha",
-        "mntru",
-        "mnspat"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "mn1",
-        "mn2",
-        "mn3",
-        "mn4"
-    };
-  }
-
-  @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[] { 
-        "Jiyax sngayan",
-        "tgKingal jiyax iyax sngayan",
-        "tgDha jiyax iyax sngayan",
-        "tgTru jiyax iyax sngayan",
-        "tgSpac jiyax iyax sngayan",
-        "tgRima jiyax iyax sngayan",
-        "tgMataru jiyax iyax sngayan"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "E",
-        "K",
-        "D",
-        "T",
-        "S",
-        "R",
-        "M"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Emp",
-        "Kin",
-        "Dha",
-        "Tru",
-        "Spa",
-        "Rim",
-        "Mat"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_trv_TW.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_trv_TW.java
deleted file mode 100644
index 550c46a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_trv_TW.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "trv_TW".
- */
-public class DateTimeFormatInfoImpl_trv_TW extends DateTimeFormatInfoImpl_trv {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ts.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ts.java
deleted file mode 100644
index 8b4c7de..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ts.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ts".
- */
-public class DateTimeFormatInfoImpl_ts 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[] { 
-        "BC",
-        "AD"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Sunguti",
-        "Nyenyenyani",
-        "Nyenyankulu",
-        "Dzivamisoko",
-        "Mudyaxihi",
-        "Khotavuxika",
-        "Mawuwani",
-        "Mhawuri",
-        "Ndzhati",
-        "Nhlangula",
-        "Hukuri",
-        "N'wendzamhala"
-    };
-  }
-
-  @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[] { 
-        "Sun",
-        "Yan",
-        "Kul",
-        "Dzi",
-        "Mud",
-        "Kho",
-        "Maw",
-        "Mha",
-        "Ndz",
-        "Nhl",
-        "Huk",
-        "N'w"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Kotara yo sungula",
-        "Kotara ya vumbirhi",
-        "Kotara ya vunharhu",
-        "Kotara ya vumune"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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[] { 
-        "Sonto",
-        "Musumbhunuku",
-        "Ravumbirhi",
-        "Ravunharhu",
-        "Ravumune",
-        "Ravuntlhanu",
-        "Mugqivela"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Son",
-        "Mus",
-        "Bir",
-        "Har",
-        "Ne",
-        "Tlh",
-        "Mug"
-    };
-  }
-
-  @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
deleted file mode 100644
index 42edd19..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_tt.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "tt".
- */
-public class DateTimeFormatInfoImpl_tt extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd.MM.yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss z";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ug.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ug.java
deleted file mode 100644
index 70af2a3..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ug.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ug".
- */
-public class DateTimeFormatInfoImpl_ug 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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ug_Arab.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ug_Arab.java
deleted file mode 100644
index 8cb6f8d..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ug_Arab.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ug_Arab".
- */
-public class DateTimeFormatInfoImpl_ug_Arab extends DateTimeFormatInfoImpl_ug {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ug_Arab_CN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ug_Arab_CN.java
deleted file mode 100644
index 7dee26f..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ug_Arab_CN.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ug_Arab_CN".
- */
-public class DateTimeFormatInfoImpl_ug_Arab_CN extends DateTimeFormatInfoImpl_ug_Arab {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 0;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uk.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uk.java
deleted file mode 100644
index e910f67..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uk.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "uk".
- */
-public class DateTimeFormatInfoImpl_uk extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "дп",
-        "пп"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d MMMM y 'р'.";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y 'р'.";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd.MM.yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "до нашої ери",
-        "нашої ери"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "до н.е.",
-        "н.е."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d.M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "LLL y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y 'р'.";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "LLLL y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y 'р'.";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M.y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d.M.y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y 'р'.";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y 'р'.";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y 'р'.";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "січня",
-        "лютого",
-        "березня",
-        "квітня",
-        "травня",
-        "червня",
-        "липня",
-        "серпня",
-        "вересня",
-        "жовтня",
-        "листопада",
-        "грудня"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "Січень",
-        "Лютий",
-        "Березень",
-        "Квітень",
-        "Травень",
-        "Червень",
-        "Липень",
-        "Серпень",
-        "Вересень",
-        "Жовтень",
-        "Листопад",
-        "Грудень"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "С",
-        "Л",
-        "Б",
-        "К",
-        "Т",
-        "Ч",
-        "Л",
-        "С",
-        "В",
-        "Ж",
-        "Л",
-        "Г"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "січ.",
-        "лют.",
-        "бер.",
-        "квіт.",
-        "трав.",
-        "черв.",
-        "лип.",
-        "серп.",
-        "вер.",
-        "жовт.",
-        "лист.",
-        "груд."
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return new String[] { 
-        "Січ",
-        "Лют",
-        "Бер",
-        "Кві",
-        "Тра",
-        "Чер",
-        "Лип",
-        "Сер",
-        "Вер",
-        "Жов",
-        "Лис",
-        "Гру"
-    };
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "I квартал",
-        "II квартал",
-        "III квартал",
-        "IV квартал"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "I кв.",
-        "II кв.",
-        "III кв.",
-        "IV кв."
-    };
-  }
-
-  @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[] { 
-        "Неділя",
-        "Понеділок",
-        "Вівторок",
-        "Середа",
-        "Четвер",
-        "Пʼятниця",
-        "Субота"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "Н",
-        "П",
-        "В",
-        "С",
-        "Ч",
-        "П",
-        "С"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Нд",
-        "Пн",
-        "Вт",
-        "Ср",
-        "Чт",
-        "Пт",
-        "Сб"
-    };
-  }
-
-  @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
deleted file mode 100644
index 403ce7a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ur.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ur".
- */
-public class DateTimeFormatInfoImpl_ur extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "قبل دوپہر",
-        "بعد دوپہر"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, d, MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d, MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d, MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "d/M/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "قبل مسيح",
-        "عيسوی سن"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ق م",
-        "عيسوی سن"
-    };
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d, MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d, MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d, MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "جنوری",
-        "فروری",
-        "مار چ",
-        "اپريل",
-        "مئ",
-        "جون",
-        "جولائ",
-        "اگست",
-        "ستمبر",
-        "اکتوبر",
-        "نومبر",
-        "دسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ج",
-        "ف",
-        "م",
-        "ا",
-        "م",
-        "ج",
-        "ج",
-        "ا",
-        "س",
-        "ا",
-        "ن",
-        "د"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "جنوری",
-        "فروری",
-        "مار چ",
-        "اپريل",
-        "مئ",
-        "جون",
-        "جولائ",
-        "اگست",
-        "ستمبر",
-        "اکتوبر",
-        "نومبر",
-        "دسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "پہلی سہ ماہی",
-        "دوسری سہ ماہی",
-        "تيسری سہ ماہی",
-        "چوتهی سہ ماہی"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "1سہ ماہی",
-        "2سہ ماہی",
-        "3سہ ماہی",
-        "4سہ ماہی"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "اتوار",
-        "پير",
-        "منگل",
-        "بده",
-        "جمعرات",
-        "جمعہ",
-        "ہفتہ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ا",
-        "پ",
-        "م",
-        "ب",
-        "ج",
-        "ج",
-        "ہ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "اتوار",
-        "پير",
-        "منگل",
-        "بده",
-        "جمعرات",
-        "جمعہ",
-        "ہفتہ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ur_IN.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ur_IN.java
deleted file mode 100644
index d3851aa..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ur_IN.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ur_IN".
- */
-public class DateTimeFormatInfoImpl_ur_IN extends DateTimeFormatInfoImpl_ur {
-
-  @Override
-  public int weekendStart() {
-    return 0;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz.java
deleted file mode 100644
index 110ec50..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "uz".
- */
-public class DateTimeFormatInfoImpl_uz 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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Муҳаррам",
-        "Сафар",
-        "Рабиул-аввал",
-        "Рабиул-охир",
-        "Жумодиул-уло",
-        "Жумодиул-ухро",
-        "Ражаб",
-        "Шаъбон",
-        "Рамазон",
-        "Шаввол",
-        "Зил-қаъда",
-        "Зил-ҳижжа"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "Я",
-        "Ф",
-        "М",
-        "А",
-        "М",
-        "И",
-        "И",
-        "А",
-        "С",
-        "О",
-        "Н",
-        "Д"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Янв",
-        "Фев",
-        "Мар",
-        "Апр",
-        "Май",
-        "Июн",
-        "Июл",
-        "Авг",
-        "Сен",
-        "Окт",
-        "Ноя",
-        "Дек"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "якшанба",
-        "душанба",
-        "сешанба",
-        "чоршанба",
-        "пайшанба",
-        "жума",
-        "шанба"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "Я",
-        "Д",
-        "С",
-        "Ч",
-        "П",
-        "Ж",
-        "Ш"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Якш",
-        "Душ",
-        "Сеш",
-        "Чор",
-        "Пай",
-        "Жум",
-        "Шан"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_AF.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_AF.java
deleted file mode 100644
index 72bf96c..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_AF.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "uz_AF".
- */
-public class DateTimeFormatInfoImpl_uz_AF extends DateTimeFormatInfoImpl_uz {
-
-  @Override
-  public String dateFormatFull() {
-    return "y نچی ییل d نچی MMMM EEEE کونی";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d نچی MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy/M/d";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ق.م.",
-        "م."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ق.م.",
-        "م."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "جنوری",
-        "فبروری",
-        "مارچ",
-        "اپریل",
-        "می",
-        "جون",
-        "جولای",
-        "اگست",
-        "سپتمبر",
-        "اکتوبر",
-        "نومبر",
-        "دسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "جنو",
-        "فبر",
-        "مار",
-        "اپر",
-        "مـی",
-        "جون",
-        "جول",
-        "اگس",
-        "سپت",
-        "اکت",
-        "نوم",
-        "دسم"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H:mm:ss (zzzz)";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss (z)";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "یکشنبه",
-        "دوشنبه",
-        "سه‌شنبه",
-        "چهارشنبه",
-        "پنجشنبه",
-        "جمعه",
-        "شنبه"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    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_uz_Arab.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_Arab.java
deleted file mode 100644
index 644487a..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_Arab.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "uz_Arab".
- */
-public class DateTimeFormatInfoImpl_uz_Arab extends DateTimeFormatInfoImpl_uz {
-
-  @Override
-  public String dateFormatFull() {
-    return "y نچی ییل d نچی MMMM EEEE کونی";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d نچی MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy/M/d";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "ق.م.",
-        "م."
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "ق.م.",
-        "م."
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "جنوری",
-        "فبروری",
-        "مارچ",
-        "اپریل",
-        "می",
-        "جون",
-        "جولای",
-        "اگست",
-        "سپتمبر",
-        "اکتوبر",
-        "نومبر",
-        "دسمبر"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "جنو",
-        "فبر",
-        "مار",
-        "اپر",
-        "مـی",
-        "جون",
-        "جول",
-        "اگس",
-        "سپت",
-        "اکت",
-        "نوم",
-        "دسم"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "H:mm:ss (zzzz)";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "H:mm:ss (z)";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "H:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "یکشنبه",
-        "دوشنبه",
-        "سه‌شنبه",
-        "چهارشنبه",
-        "پنجشنبه",
-        "جمعه",
-        "شنبه"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ی.",
-        "د.",
-        "س.",
-        "چ.",
-        "پ.",
-        "ج.",
-        "ش."
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_Arab_AF.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_Arab_AF.java
deleted file mode 100644
index 6c165e0..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_Arab_AF.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "uz_Arab_AF".
- */
-public class DateTimeFormatInfoImpl_uz_Arab_AF extends DateTimeFormatInfoImpl_uz_Arab {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_Latn.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_Latn.java
deleted file mode 100644
index 2b48fcb..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_uz_Latn.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "uz_Latn".
- */
-public class DateTimeFormatInfoImpl_uz_Latn extends DateTimeFormatInfoImpl_uz {
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y/M/d";
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "Y",
-        "F",
-        "M",
-        "A",
-        "M",
-        "I",
-        "I",
-        "A",
-        "S",
-        "O",
-        "N",
-        "D"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Yanv",
-        "Fev",
-        "Mar",
-        "Apr",
-        "May",
-        "Iyun",
-        "Iyul",
-        "Avg",
-        "Sen",
-        "Okt",
-        "Noya",
-        "Dek"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "yakshanba",
-        "dushanba",
-        "seshanba",
-        "chorshanba",
-        "payshanba",
-        "juma",
-        "shanba"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "Y",
-        "D",
-        "S",
-        "C",
-        "P",
-        "J",
-        "S"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Yaksh",
-        "Dush",
-        "Sesh",
-        "Chor",
-        "Pay",
-        "Jum",
-        "Shan"
-    };
-  }
-
-  @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
deleted file mode 100644
index 879f223..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_ve.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "ve".
- */
-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"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Phando",
-        "Luhuhi",
-        "Ṱhafamuhwe",
-        "Lambamai",
-        "Shundunthule",
-        "Fulwi",
-        "Fulwana",
-        "Ṱhangule",
-        "Khubvumedzi",
-        "Tshimedzi",
-        "Ḽara",
-        "Nyendavhusiku"
-    };
-  }
-
-  @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[] { 
-        "Pha",
-        "Luh",
-        "Ṱha",
-        "Lam",
-        "Shu",
-        "Lwi",
-        "Lwa",
-        "Ṱha",
-        "Khu",
-        "Tsh",
-        "Ḽar",
-        "Nye"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Kotara ya u thoma",
-        "Kotara ya vhuvhili",
-        "Kotara ya vhuraru",
-        "Kotara ya vhuṋa"
-    };
-  }
-
-  @Override
-  public String[] quartersShort() {
-    return new String[] { 
-        "K1",
-        "K2",
-        "K3",
-        "K4"
-    };
-  }
-
-  @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[] { 
-        "Swondaha",
-        "Musumbuluwo",
-        "Ḽavhuvhili",
-        "Ḽavhuraru",
-        "Ḽavhuṋa",
-        "Ḽavhuṱanu",
-        "Mugivhela"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Swo",
-        "Mus",
-        "Vhi",
-        "Rar",
-        "Ṋa",
-        "Ṱan",
-        "Mug"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_vi.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_vi.java
deleted file mode 100644
index c0d2706..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_vi.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "vi".
- */
-public class DateTimeFormatInfoImpl_vi extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "SA",
-        "CH"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE, 'ngày' dd MMMM 'năm' y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "'Ngày' dd 'tháng' M 'năm' y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MM-yyyy";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yyyy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "tr. CN",
-        "sau CN"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "tr. CN",
-        "sau CN"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "d MMM";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "d MMMM";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE d MMMM";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "d-M";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "'Ngày' d 'tháng' MMM 'năm' y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "'Ngày' d 'tháng' MMMM 'năm' y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M-y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "'Ngày' d 'tháng' M 'năm' y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, 'ngày' d MMM 'năm' y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ yyyy";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q yyyy";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "tháng một",
-        "tháng hai",
-        "tháng ba",
-        "tháng tư",
-        "tháng năm",
-        "tháng sáu",
-        "tháng bảy",
-        "tháng tám",
-        "tháng chín",
-        "tháng mười",
-        "tháng mười một",
-        "tháng mười hai"
-    };
-  }
-
-  @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[] { 
-        "thg 1",
-        "thg 2",
-        "thg 3",
-        "thg 4",
-        "thg 5",
-        "thg 6",
-        "thg 7",
-        "thg 8",
-        "thg 9",
-        "thg 10",
-        "thg 11",
-        "thg 12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Chủ nhật",
-        "Thứ hai",
-        "Thứ ba",
-        "Thứ tư",
-        "Thứ năm",
-        "Thứ sáu",
-        "Thứ bảy"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "CN",
-        "Th 2",
-        "Th 3",
-        "Th 4",
-        "Th 5",
-        "Th 6",
-        "Th 7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_wal.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_wal.java
deleted file mode 100644
index 3c0f82b..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_wal.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "wal".
- */
-public class DateTimeFormatInfoImpl_wal extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "ማለዶ",
-        "ቃማ"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE፥ dd MMMM ጋላሳ y G";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "dd-MMM-y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "አዳ ዎዴ",
-        "ግሮተታ ላይታ"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "አዳ ዎዴ",
-        "ግሮተታ ላይታ"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "ጃንዩወሪ",
-        "ፌብሩወሪ",
-        "ማርች",
-        "ኤፕረል",
-        "ሜይ",
-        "ጁን",
-        "ጁላይ",
-        "ኦገስት",
-        "ሴፕቴምበር",
-        "ኦክተውበር",
-        "ኖቬምበር",
-        "ዲሴምበር"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return monthsFull();
-  }
-
-  @Override
-  public String[] monthsNarrow() {
-    return new String[] { 
-        "ጃ",
-        "ፌ",
-        "ማ",
-        "ኤ",
-        "ሜ",
-        "ጁ",
-        "ጁ",
-        "ኦ",
-        "ሴ",
-        "ኦ",
-        "ኖ",
-        "ዲ"
-    };
-  }
-
-  @Override
-  public String[] monthsNarrowStandalone() {
-    return monthsNarrow();
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "ጃንዩ",
-        "ፌብሩ",
-        "ማርች",
-        "ኤፕረ",
-        "ሜይ",
-        "ጁን",
-        "ጁላይ",
-        "ኦገስ",
-        "ሴፕቴ",
-        "ኦክተ",
-        "ኖቬም",
-        "ዲሴም"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "ወጋ",
-        "ሳይኖ",
-        "ማቆሳኛ",
-        "አሩዋ",
-        "ሃሙሳ",
-        "አርባ",
-        "ቄራ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "ወ",
-        "ሳ",
-        "ማ",
-        "አ",
-        "ሃ",
-        "አ",
-        "ቄ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "ወጋ",
-        "ሳይኖ",
-        "ማቆሳኛ",
-        "አሩዋ",
-        "ሃሙሳ",
-        "አርባ",
-        "ቄራ"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_wal_ET.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_wal_ET.java
deleted file mode 100644
index 4c9a837..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_wal_ET.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "wal_ET".
- */
-public class DateTimeFormatInfoImpl_wal_ET extends DateTimeFormatInfoImpl_wal {
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 6;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_wo.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_wo.java
deleted file mode 100644
index 63f72e5..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_wo.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "wo".
- */
-public class DateTimeFormatInfoImpl_wo 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[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "BCE",
-        "CE"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7",
-        "8",
-        "9",
-        "10",
-        "11",
-        "12"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_xh.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_xh.java
deleted file mode 100644
index 2987f5d..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_xh.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "xh".
- */
-public class DateTimeFormatInfoImpl_xh 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[] { 
-        "BC",
-        "umnyaka wokuzalwa kukaYesu"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "MMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "MMMM d, y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "M/d/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, MMM d, y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Janyuwari",
-        "Februwari",
-        "Matshi",
-        "Epreli",
-        "Meyi",
-        "Juni",
-        "Julayi",
-        "Agasti",
-        "Septemba",
-        "Okthoba",
-        "Novemba",
-        "Disemba"
-    };
-  }
-
-  @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[] { 
-        "Jan",
-        "Feb",
-        "Mat",
-        "Epr",
-        "Mey",
-        "Jun",
-        "Jul",
-        "Aga",
-        "Sep",
-        "Okt",
-        "Nov",
-        "Dis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "1 unyangantathu",
-        "2 unyangantathu",
-        "3 unyangantathu",
-        "4 unyangantathu"
-    };
-  }
-
-  @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[] { 
-        "Cawe",
-        "Mvulo",
-        "Lwesibini",
-        "Lwesithathu",
-        "Lwesine",
-        "Lwesihlanu",
-        "Mgqibelo"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Caw",
-        "Mvu",
-        "Bin",
-        "Tha",
-        "Sin",
-        "Hla",
-        "Mgq"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_yo.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_yo.java
deleted file mode 100644
index 3326d09..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_yo.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "yo".
- */
-public class DateTimeFormatInfoImpl_yo extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "àárọ̀",
-        "ọ̀sán"
-    };
-  }
-
-  @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[] { 
-        "Saju Kristi",
-        "Lehin Kristi"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "SK",
-        "LK"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "EEEE, MMMM d";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "MMM y";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "M/y";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "d/M/y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE, d MMM y";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "QQQQ y";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "Q y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Oṣù Ṣẹ́rẹ́",
-        "Oṣù Èrèlè",
-        "Oṣù Ẹrẹ̀nà",
-        "Oṣù Ìgbé",
-        "Oṣù Ẹ̀bibi",
-        "Oṣù Òkúdu",
-        "Oṣù Agẹmọ",
-        "Oṣù Ògún",
-        "Oṣù Owewe",
-        "Oṣù Ọ̀wàrà",
-        "Oṣù Bélú",
-        "Oṣù Ọ̀pẹ̀"
-    };
-  }
-
-  @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[] { 
-        "Ṣẹ́rẹ́",
-        "Èrèlè",
-        "Ẹrẹ̀nà",
-        "Ìgbé",
-        "Ẹ̀bibi",
-        "Òkúdu",
-        "Agẹmọ",
-        "Ògún",
-        "Owewe",
-        "Ọ̀wàrà",
-        "Bélú",
-        "Ọ̀pẹ̀"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @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[] { 
-        "Ọjọ́ Àìkú",
-        "Ọjọ́ Ajé",
-        "Ọjọ́ Ìsẹ́gun",
-        "Ọjọ́rú",
-        "Ọjọ́ Àṣẹ̀ṣẹ̀dáiyé",
-        "Ọjọ́ Ẹtì",
-        "Ọjọ́ Àbámẹ́ta"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "1",
-        "2",
-        "3",
-        "4",
-        "5",
-        "6",
-        "7"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Àìkú",
-        "Ajé",
-        "Ìsẹ́gun",
-        "Ọjọ́rú",
-        "Àṣẹ̀ṣẹ̀dáiyé",
-        "Ẹtì",
-        "Àbámẹ́ta"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh.java
deleted file mode 100644
index 539b8c7..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "zh".
- */
-public class DateTimeFormatInfoImpl_zh extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String[] ampms() {
-    return new String[] { 
-        "上午",
-        "下午"
-    };
-  }
-
-  @Override
-  public String dateFormatFull() {
-    return "y年M月d日EEEE";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y年M月d日";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy-M-d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy-M-d";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "公元前",
-        "公元"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "公元前",
-        "公元"
-    };
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "ah:mm";
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "ah:mm:ss";
-  }
-
-  @Override
-  public String formatHour24Minute() {
-    return "H:mm";
-  }
-
-  @Override
-  public String formatHour24MinuteSecond() {
-    return "H:mm:ss";
-  }
-
-  @Override
-  public String formatMonthAbbrevDay() {
-    return "MMMd日";
-  }
-
-  @Override
-  public String formatMonthFullDay() {
-    return "MMMMd日";
-  }
-
-  @Override
-  public String formatMonthFullWeekdayDay() {
-    return "MMMMd日EEEE";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "y年MMM";
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "y年MMMd日";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "y年MMMM";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "y年MMMMd日";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy-M";
-  }
-
-  @Override
-  public String formatYearMonthNumDay() {
-    return "y年M月d日";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "y年MMMd日EEE";
-  }
-
-  @Override
-  public String formatYearQuarterFull() {
-    return "y年QQQ";
-  }
-
-  @Override
-  public String formatYearQuarterShort() {
-    return "y年QQQ";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "1月",
-        "2月",
-        "3月",
-        "4月",
-        "5月",
-        "6月",
-        "7月",
-        "8月",
-        "9月",
-        "10月",
-        "11月",
-        "12月"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "一月",
-        "二月",
-        "三月",
-        "四月",
-        "五月",
-        "六月",
-        "七月",
-        "八月",
-        "九月",
-        "十月",
-        "十一月",
-        "十二月"
-    };
-  }
-
-  @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[] { 
-        "1月",
-        "2月",
-        "3月",
-        "4月",
-        "5月",
-        "6月",
-        "7月",
-        "8月",
-        "9月",
-        "10月",
-        "11月",
-        "12月"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return new String[] { 
-        "一月",
-        "二月",
-        "三月",
-        "四月",
-        "五月",
-        "六月",
-        "七月",
-        "八月",
-        "九月",
-        "十月",
-        "十一月",
-        "十二月"
-    };
-  }
-
-  @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 timeFormatFull() {
-    return "zzzzah时mm分ss秒";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "zah时mm分ss秒";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "ahh:mm:ss";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "ah:mm";
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "星期日",
-        "星期一",
-        "星期二",
-        "星期三",
-        "星期四",
-        "星期五",
-        "星期六"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "日",
-        "一",
-        "二",
-        "三",
-        "四",
-        "五",
-        "六"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "周日",
-        "周一",
-        "周二",
-        "周三",
-        "周四",
-        "周五",
-        "周六"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_HK.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_HK.java
deleted file mode 100644
index cabc4ba..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_HK.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "zh_HK".
- */
-public class DateTimeFormatInfoImpl_zh_HK extends DateTimeFormatInfoImpl_zh {
-
-  @Override
-  public String dateFormatMedium() {
-    return "y年M月d日";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy年M月d日";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "西元前",
-        "西元"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "西元前",
-        "西元"
-    };
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "ahh:mm:ss";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "y年M月";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "y年M月";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy/M";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "y年M月d日EEE";
-  }
-
-  @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[] quartersFull() {
-    return new String[] { 
-        "第1季",
-        "第2季",
-        "第3季",
-        "第4季"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "zzzzah時mm分ss秒";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "zah時mm分ss秒";
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "週日",
-        "週一",
-        "週二",
-        "週三",
-        "週四",
-        "週五",
-        "週六"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_MO.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_MO.java
deleted file mode 100644
index e5634e7..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_MO.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "zh_MO".
- */
-public class DateTimeFormatInfoImpl_zh_MO extends DateTimeFormatInfoImpl_zh {
-
-  @Override
-  public String dateFormatFull() {
-    return "y年MM月dd日EEEE";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "y年MM月dd日";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "y年M月d日";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy年M月d日";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "西元前",
-        "西元"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "西元前",
-        "西元"
-    };
-  }
-
-  @Override
-  public String formatHour12MinuteSecond() {
-    return "ahh:mm:ss";
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "y年M月";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "y年M月";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy/M";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "y年M月d日EEE";
-  }
-
-  @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[] quartersFull() {
-    return new String[] { 
-        "第1季",
-        "第2季",
-        "第3季",
-        "第4季"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "zzzzah時mm分ss秒";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "zah時mm分ss秒";
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "週日",
-        "週一",
-        "週二",
-        "週三",
-        "週四",
-        "週五",
-        "週六"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_SG.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_SG.java
deleted file mode 100644
index cd2acdb..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_SG.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "zh_SG".
- */
-public class DateTimeFormatInfoImpl_zh_SG extends DateTimeFormatInfoImpl_zh {
-
-  @Override
-  public String dateFormatShort() {
-    return "dd/MM/yy";
-  }
-
-  @Override
-  public String formatHour12Minute() {
-    return "ahh:mm";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "ahh:mm:ssz";
-  }
-
-  @Override
-  public String timeFormatShort() {
-    return "ahh:mm";
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_TW.java b/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_TW.java
deleted file mode 100644
index 3c83ac7..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zh_TW.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "zh_TW".
- */
-public class DateTimeFormatInfoImpl_zh_TW extends DateTimeFormatInfoImpl_zh {
-
-  @Override
-  public String dateFormatMedium() {
-    return "yyyy/M/d";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yy/M/d";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "西元前",
-        "西元"
-    };
-  }
-
-  @Override
-  public String[] erasShort() {
-    return new String[] { 
-        "西元前",
-        "西元"
-    };
-  }
-
-  @Override
-  public String formatMonthNumDay() {
-    return "M/d";
-  }
-
-  @Override
-  public String formatYearMonthAbbrev() {
-    return "y年M月";
-  }
-
-  @Override
-  public String formatYearMonthFull() {
-    return "y年M月";
-  }
-
-  @Override
-  public String formatYearMonthNum() {
-    return "yyyy/M";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "y年M月d日EEE";
-  }
-
-  @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[] quartersFull() {
-    return new String[] { 
-        "第1季",
-        "第2季",
-        "第3季",
-        "第4季"
-    };
-  }
-
-  @Override
-  public String timeFormatFull() {
-    return "zzzzah時mm分ss秒";
-  }
-
-  @Override
-  public String timeFormatLong() {
-    return "zah時mm分ss秒";
-  }
-
-  @Override
-  public String timeFormatMedium() {
-    return "ah:mm:ss";
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "週日",
-        "週一",
-        "週二",
-        "週三",
-        "週四",
-        "週五",
-        "週六"
-    };
-  }
-
-  @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
deleted file mode 100644
index 3106f60..0000000
--- a/user/src/com/google/gwt/i18n/client/impl/cldr/DateTimeFormatInfoImpl_zu.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client.impl.cldr;
-
-// DO NOT EDIT - GENERATED FROM CLDR DATA
-
-/**
- * Implementation of DateTimeFormatInfo for locale "zu".
- */
-public class DateTimeFormatInfoImpl_zu extends DateTimeFormatInfoImpl {
-
-  @Override
-  public String dateFormatFull() {
-    return "EEEE dd MMMM y";
-  }
-
-  @Override
-  public String dateFormatLong() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String dateFormatMedium() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String dateFormatShort() {
-    return "yyyy-MM-dd";
-  }
-
-  @Override
-  public String[] erasFull() {
-    return new String[] { 
-        "BC",
-        "AD"
-    };
-  }
-
-  @Override
-  public int firstDayOfTheWeek() {
-    return 1;
-  }
-
-  @Override
-  public String formatYearMonthAbbrevDay() {
-    return "d MMM y";
-  }
-
-  @Override
-  public String formatYearMonthFullDay() {
-    return "d MMMM y";
-  }
-
-  @Override
-  public String formatYearMonthWeekdayDay() {
-    return "EEE d MMM y";
-  }
-
-  @Override
-  public String[] monthsFull() {
-    return new String[] { 
-        "Januwari",
-        "Februwari",
-        "Mashi",
-        "Apreli",
-        "Meyi",
-        "Juni",
-        "Julayi",
-        "Agasti",
-        "Septhemba",
-        "Okthoba",
-        "Novemba",
-        "Disemba"
-    };
-  }
-
-  @Override
-  public String[] monthsFullStandalone() {
-    return new String[] { 
-        "uJanuwari",
-        "uFebruwari",
-        "uMashi",
-        "u-Apreli",
-        "uMeyi",
-        "uJuni",
-        "uJulayi",
-        "uAgasti",
-        "uSepthemba",
-        "u-Okthoba",
-        "uNovemba",
-        "uDisemba"
-    };
-  }
-
-  @Override
-  public String[] monthsShort() {
-    return new String[] { 
-        "Jan",
-        "Feb",
-        "Mas",
-        "Apr",
-        "Mey",
-        "Jun",
-        "Jul",
-        "Aga",
-        "Sep",
-        "Okt",
-        "Nov",
-        "Dis"
-    };
-  }
-
-  @Override
-  public String[] monthsShortStandalone() {
-    return monthsShort();
-  }
-
-  @Override
-  public String[] quartersFull() {
-    return new String[] { 
-        "Q1",
-        "Q2",
-        "Q3",
-        "Q4"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFull() {
-    return new String[] { 
-        "Sonto",
-        "Msombuluko",
-        "Lwesibili",
-        "Lwesithathu",
-        "uLwesine",
-        "Lwesihlanu",
-        "Mgqibelo"
-    };
-  }
-
-  @Override
-  public String[] weekdaysFullStandalone() {
-    return weekdaysFull();
-  }
-
-  @Override
-  public String[] weekdaysNarrow() {
-    return new String[] { 
-        "S",
-        "M",
-        "B",
-        "T",
-        "S",
-        "H",
-        "M"
-    };
-  }
-
-  @Override
-  public String[] weekdaysNarrowStandalone() {
-    return weekdaysNarrow();
-  }
-
-  @Override
-  public String[] weekdaysShort() {
-    return new String[] { 
-        "Son",
-        "Mso",
-        "Bil",
-        "Tha",
-        "Sin",
-        "Hla",
-        "Mgq"
-    };
-  }
-
-  @Override
-  public String[] weekdaysShortStandalone() {
-    return weekdaysShort();
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/rebind/CustomDateTimeFormatGenerator.java b/user/src/com/google/gwt/i18n/rebind/CustomDateTimeFormatGenerator.java
deleted file mode 100644
index dc3ea14..0000000
--- a/user/src/com/google/gwt/i18n/rebind/CustomDateTimeFormatGenerator.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright 2008 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.rebind;
-
-import com.google.gwt.core.ext.Generator;
-import com.google.gwt.core.ext.GeneratorContext;
-import com.google.gwt.core.ext.PropertyOracle;
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.typeinfo.JClassType;
-import com.google.gwt.core.ext.typeinfo.JMethod;
-import com.google.gwt.core.ext.typeinfo.JType;
-import com.google.gwt.core.ext.typeinfo.NotFoundException;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
-import com.google.gwt.i18n.client.CustomDateTimeFormat;
-import com.google.gwt.i18n.client.DateTimeFormat;
-import com.google.gwt.i18n.client.CustomDateTimeFormat.Pattern;
-import com.google.gwt.i18n.shared.GwtLocale;
-import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
-import com.google.gwt.user.rebind.SourceWriter;
-
-import java.io.PrintWriter;
-
-/**
- * Generator used to generate an implementation of a
- * {@link CustomDateTimeFormat} interface, computing the best matching localized
- * format patterns at compile time.
- */
-public class CustomDateTimeFormatGenerator extends Generator {
-
-  /**
-   * Generate an implementation for the given type.
-   * 
-   * @param logger error logger
-   * @param context generator context
-   * @param typeName target type name
-   * @return generated class name
-   * @throws UnableToCompleteException
-   */
-  @Override
-  public final String generate(TreeLogger logger, final GeneratorContext context,
-      String typeName) throws UnableToCompleteException {
-    TypeOracle typeOracle = context.getTypeOracle();
-    // Get the current locale and interface type.
-    PropertyOracle propertyOracle = context.getPropertyOracle();
-    LocaleUtils localeUtils = LocaleUtils.getInstance(logger,
-        propertyOracle);
-
-    JClassType targetClass;
-    try {
-      targetClass = typeOracle.getType(typeName);
-    } catch (NotFoundException e) {
-      logger.log(TreeLogger.ERROR, "No such type " + typeName, e);
-      throw new UnableToCompleteException();
-    }
-    JClassType cdtfClass;
-    try {
-      cdtfClass = typeOracle.getType(CustomDateTimeFormat.class.getName());
-    } catch (NotFoundException e) {
-      logger.log(TreeLogger.ERROR, "No such type "
-          + CustomDateTimeFormat.class.getName(), e);
-      throw new UnableToCompleteException();
-    }
-    if (!cdtfClass.isAssignableFrom(targetClass)) {
-      logger.log(TreeLogger.ERROR, typeName + " is not assignable to "
-          + CustomDateTimeFormat.class.getName());
-      throw new UnableToCompleteException();
-    }
-    JClassType dateTimeFormat;
-    try {
-      dateTimeFormat = typeOracle.getType(DateTimeFormat.class.getName());
-    } catch (NotFoundException e) {
-      logger.log(TreeLogger.ERROR, "No DateTimeFormat type?", e);
-      throw new UnableToCompleteException();
-    }
-    // TODO(jat): runtime locales support
-    GwtLocale gwtLocale = localeUtils.getCompileLocale();
-    DateTimePatternGenerator dtpg = new DateTimePatternGenerator(gwtLocale);
-    String packageName = targetClass.getPackage().getName();
-    String className = targetClass.getName().replace('.', '_') + "_"
-        + gwtLocale.getAsString();
-    PrintWriter pw = context.tryCreate(logger, packageName, className);
-    if (pw != null) {
-      ClassSourceFileComposerFactory factory = new ClassSourceFileComposerFactory(
-          packageName, className);
-      factory.addImplementedInterface(targetClass.getQualifiedSourceName());
-      factory.addImport("com.google.gwt.i18n.client.DateTimeFormat");
-      SourceWriter writer = factory.createSourceWriter(context, pw);
-      writer.indent();
-      for (JMethod method : targetClass.getMethods()) {
-        JType returnType = method.getReturnType();
-        if (returnType != dateTimeFormat) {
-          logger.log(TreeLogger.ERROR, typeName + "." + method.getName()
-              + " must return DateTimeFormat");
-          throw new UnableToCompleteException();
-        }
-        Pattern annotation = method.getAnnotation(Pattern.class);
-        if (annotation == null) {
-          logger.log(TreeLogger.ERROR, typeName + "." + method.getName()
-              + " must have an @Pattern annotation");
-          throw new UnableToCompleteException();
-        }
-        String pattern = annotation.value();
-        pattern = dtpg.getBestPattern(pattern); 
-        writer.println();
-        writer.println("public "
-            + method.getReturnType().getQualifiedSourceName() + " "
-            + method.getName() + "() {");
-        writer.println("  return DateTimeFormat.getFormat(\"" + pattern
-            + "\");");
-        writer.println("}");
-      }
-      writer.commit(logger);
-    }
-    return packageName + "." + className;
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/rebind/DateTimePatternGenerator.java b/user/src/com/google/gwt/i18n/rebind/DateTimePatternGenerator.java
deleted file mode 100644
index b84d04a..0000000
--- a/user/src/com/google/gwt/i18n/rebind/DateTimePatternGenerator.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.rebind;
-
-import com.google.gwt.i18n.shared.GwtLocale;
-
-import com.ibm.icu.util.ULocale;
-
-/**
- * Helper class to create a localized date/time pattern based on a pattern
- * skeleton.
- */
-class DateTimePatternGenerator {
-  // TODO(jat): Currently uses ICU4J's DateTimePatternGenerator, but should
-  // probably be rewritten to avoid that dependency.
-
-  private final com.ibm.icu.text.DateTimePatternGenerator dtpg;
-
-  /**
-   * Construct a DateTimePatternGenerator for a given locale.
-   * 
-   * @param gwtLocale
-   */
-  public DateTimePatternGenerator(GwtLocale gwtLocale) {
-    String localeName = gwtLocale.getAsString();
-    localeName = ULocale.canonicalize(localeName);
-    ULocale locale = new ULocale(localeName);
-    dtpg = com.ibm.icu.text.DateTimePatternGenerator.getInstance(locale);
-  }
-
-  /**
-   * Get the best matching localized pattern for the requested skeleton
-   * pattern.
-   * 
-   * @param skeleton a skeleton pattern consisting of groups of pattern
-   *     characters - spaces and punctuation are ignored
-   * @return a localized pattern suitable for use with
-   *     {@link com.google.gwt.i18n.client.DateTimeFormat}.
-   */
-  public String getBestPattern(String skeleton) {
-    return dtpg.getBestPattern(skeleton);
-  }
-}
diff --git a/user/src/com/google/gwt/i18n/rebind/LocaleInfoGenerator.java b/user/src/com/google/gwt/i18n/rebind/LocaleInfoGenerator.java
index 50c58c2..fd1ba61 100644
--- a/user/src/com/google/gwt/i18n/rebind/LocaleInfoGenerator.java
+++ b/user/src/com/google/gwt/i18n/rebind/LocaleInfoGenerator.java
@@ -228,8 +228,8 @@
       factory.addImport("com.google.gwt.i18n.client.LocaleInfo");
       factory.addImport("com.google.gwt.i18n.client.constants.NumberConstants");
       factory.addImport("com.google.gwt.i18n.client.constants.NumberConstantsImpl");
-      factory.addImport("com.google.gwt.i18n.client.DateTimeFormatInfo");
-      factory.addImport("com.google.gwt.i18n.client.impl.cldr.DateTimeFormatInfoImpl");
+      factory.addImport("com.google.gwt.i18n.client.constants.DateTimeConstants");
+      factory.addImport("com.google.gwt.i18n.client.constants.DateTimeConstantsImpl");
       SourceWriter writer = factory.createSourceWriter(context, pw);
       writer.println("@Override");
       writer.println("public String getLocaleName() {");
@@ -243,13 +243,13 @@
       writer.println("}");
       writer.println();
       writer.println("@Override");
-      writer.println("public DateTimeFormatInfo getDateTimeFormatInfo() {");
+      writer.println("public DateTimeConstants getDateTimeConstants() {");
       LocalizableGenerator localizableGenerator = new LocalizableGenerator();
       // Avoid warnings for trying to create the same type multiple times
       GeneratorContext subContext = new CachedGeneratorContext(context);
       generateConstantsLookup(logger, subContext, writer, localizableGenerator,
           runtimeLocales, locale,
-          "com.google.gwt.i18n.client.impl.cldr.DateTimeFormatInfoImpl");
+          "com.google.gwt.i18n.client.constants.DateTimeConstantsImpl");
       writer.println("}");
       writer.println();
       writer.println("@Override");
diff --git a/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java b/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java
index bd65d7c..4513ab0 100644
--- a/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java
+++ b/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java
@@ -26,7 +26,6 @@
 import com.google.gwt.i18n.client.DateTimeFormat;
 import com.google.gwt.i18n.client.NumberFormat;
 import com.google.gwt.i18n.client.PluralRule;
-import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
 import com.google.gwt.i18n.client.Messages.Optional;
 import com.google.gwt.i18n.client.Messages.PluralCount;
 import com.google.gwt.i18n.client.Messages.PluralText;
@@ -52,9 +51,8 @@
    * Implements {x,date...} references in MessageFormat.
    */
   private static class DateFormatter implements ValueFormatter {
-    // TODO(jat): should we issue warnings for this formatter?
-    public String format(GwtLocale locale, StringGenerator out,
-        String subformat, String argName, JType argType) {
+    public String format(StringGenerator out, String subformat, String argName,
+        JType argType) {
       if (!"java.util.Date".equals(argType.getQualifiedSourceName())) {
         return "Only java.util.Date acceptable for date format";
       }
@@ -79,50 +77,11 @@
   }
 
   /**
-   * Implements {x,localdatetime,skeleton} references in MessageFormat.
-   */
-  private static class LocalDateTimeFormatter implements ValueFormatter {
-    private static final String PREDEF = "predef:";
-
-    public String format(GwtLocale locale, StringGenerator out,
-        String subformat, String argName, JType argType) {
-      if (!"java.util.Date".equals(argType.getQualifiedSourceName())) {
-        return "Only java.util.Date acceptable for localdatetime format";
-      }
-      if (subformat == null || subformat.length() == 0) {
-        return "localdatetime format requires a skeleton pattern";
-      }
-      if (subformat.startsWith(PREDEF)) {
-        // TODO(jat): error checking/logging
-        PredefinedFormat predef;
-        try {
-          predef = PredefinedFormat.valueOf(subformat.substring(
-              PREDEF.length()));
-        } catch (IllegalArgumentException e) {
-          return e.getMessage();
-        }
-        out.appendExpression(dtFormatClassName + ".getFormat("
-            + PredefinedFormat.class.getName() + "." + predef.toString()
-            + ").format(" + argName + ")", true);
-        return null;
-      }
-      DateTimePatternGenerator dtpg = new DateTimePatternGenerator(locale);
-      String pattern = dtpg.getBestPattern(subformat);
-      if (pattern == null) {
-        return "Invalid localdatetime skeleton pattern \"" + subformat + "\"";
-      }
-      out.appendExpression(dtFormatClassName + ".getFormat("
-          + wrap(pattern) + ").format(" + argName + ")", true);
-      return null;
-    }
-  }
-
-  /**
    * Implements {x,number...} references in MessageFormat.
    */
   private static class NumberFormatter implements ValueFormatter {
-    public String format(GwtLocale locale, StringGenerator out,
-        String subformat, String argName, JType argType) {
+    public String format(StringGenerator out, String subformat, String argName,
+        JType argType) {
       JPrimitiveType argPrimType = argType.isPrimitive();
       if (argPrimType != null) {
         if (argPrimType == JPrimitiveType.BOOLEAN
@@ -275,9 +234,8 @@
    * Implements {x,time...} references in MessageFormat.
    */
   private static class TimeFormatter implements ValueFormatter {
-    // TODO(jat): should we issue warnings for this formatter?
-    public String format(GwtLocale locale, StringGenerator out,
-        String subformat, String argName, JType argType) {
+    public String format(StringGenerator out, String subformat, String argName,
+        JType argType) {
       if (!"java.util.Date".equals(argType.getQualifiedSourceName())) {
         return "Only java.util.Date acceptable for date format";
       }
@@ -305,17 +263,14 @@
     /**
      * Creates code to format a value according to a format string.
      * 
-     * @param locale current locale
      * @param out StringBuffer to append to
      * @param subformat the remainder of the format string
      * @param argName the name of the argument to use in the generated code
      * @param argType the type of the argument
      * @return null if no error or an appropriate error message
      */
-    // TODO(jat): change to pass in logger and return boolean, also enable
-    //     dynamic data supplied in other parameters
-    String format(GwtLocale locale, StringGenerator out, String subformat,
-        String argName, JType argType);
+    String format(StringGenerator out, String subformat, String argName,
+        JType argType);
   }
 
   /**
@@ -337,7 +292,6 @@
     formatters.put("date", new DateFormatter());
     formatters.put("number", new NumberFormatter());
     formatters.put("time", new TimeFormatter());
-    formatters.put("localdatetime", new LocalDateTimeFormatter());
     // TODO: implement ChoiceFormat and PluralFormat
   }
 
@@ -408,7 +362,7 @@
           generated.append("  // " + pluralForms[i].getName() + " - "
               + pluralForms[i].getDescription() + "\n");
           generated.append("  case " + i + ": return ");
-          generateString(logger, locale, template, params, seenFlags, generated);
+          generateString(logger, template, params, seenFlags, generated);
           generated.append(";\n");
         } else if (pluralForms[i].getWarnIfMissing()) {
           logger.log(TreeLogger.WARN, "No plural form '"
@@ -421,7 +375,7 @@
     }
     generated.append("return ");
     String template = resourceList.getRequiredStringExt(key, null);
-    generateString(logger, locale, template, params, seenFlags, generated);
+    generateString(logger, template, params, seenFlags, generated);
 
     // Generate an error if any required parameter was not used somewhere.
     for (int i = 0; i < numParams; ++i) {
@@ -501,9 +455,9 @@
    * @throws UnableToCompleteException
    */
   @SuppressWarnings("fallthrough")
-  private void generateString(TreeLogger logger, GwtLocale locale,
-      String template, JParameter[] params, boolean[] seenFlag,
-      StringBuffer outputBuf) throws UnableToCompleteException {
+  private void generateString(TreeLogger logger, String template,
+      JParameter[] params, boolean[] seenFlag, StringBuffer outputBuf)
+      throws UnableToCompleteException {
     StringGenerator buf = new StringGenerator(outputBuf);
     try {
       for (TemplateChunk chunk : MessageFormatParser.parse(template)) {
@@ -523,10 +477,7 @@
             String subformat = argChunk.getSubFormat();
             ValueFormatter formatter = formatters.get(format);
             if (formatter != null) {
-              // TODO(jat): add support for specifying additional dynamic data
-              //     in another argument -- examples would be the currency code
-              //     for a number format or the timezone for a date/time format.
-              String err = formatter.format(locale, buf, subformat, arg,
+              String err = formatter.format(buf, subformat, arg,
                   params[argNumber].getType());
               if (err != null) {
                 throw error(logger, err);
diff --git a/user/src/com/google/gwt/user/datepicker/client/CalendarModel.java b/user/src/com/google/gwt/user/datepicker/client/CalendarModel.java
index 4eb1e3d..0ea4bda 100644
--- a/user/src/com/google/gwt/user/datepicker/client/CalendarModel.java
+++ b/user/src/com/google/gwt/user/datepicker/client/CalendarModel.java
@@ -17,7 +17,6 @@
 package com.google.gwt.user.datepicker.client;
 
 import com.google.gwt.i18n.client.DateTimeFormat;
-import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
 
 import java.util.Date;
 
@@ -166,7 +165,7 @@
    * @return the day of month formatter
    */
   protected DateTimeFormat getDayOfMonthFormatter() {
-    return DateTimeFormat.getFormat(PredefinedFormat.DAY);
+    return DateTimeFormat.getFormat("d");
   }
 
   /**
@@ -184,7 +183,7 @@
    * @return the month and year formatter
    */
   protected DateTimeFormat getMonthAndYearFormatter() {
-    return DateTimeFormat.getFormat(PredefinedFormat.YEAR_MONTH_ABBR);
+    return DateTimeFormat.getFormat("MMM yyyy");
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/datepicker/client/CalendarUtil.java b/user/src/com/google/gwt/user/datepicker/client/CalendarUtil.java
index f085b1c..5ad66b2 100644
--- a/user/src/com/google/gwt/user/datepicker/client/CalendarUtil.java
+++ b/user/src/com/google/gwt/user/datepicker/client/CalendarUtil.java
@@ -17,8 +17,8 @@
 package com.google.gwt.user.datepicker.client;
 
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.i18n.client.DateTimeFormatInfo;
 import com.google.gwt.i18n.client.LocaleInfo;
+import com.google.gwt.i18n.client.constants.DateTimeConstants;
 
 import java.util.Date;
 
@@ -27,17 +27,20 @@
  */
 public class CalendarUtil {
 
+  static DateTimeConstants intlConstants;
+
   private static int firstDayOfWeekend;
+
   private static int lastDayOfWeekend;
   private static int startingDay;
 
   static {
     if (GWT.isClient()) {
-      DateTimeFormatInfo dateTimeFormatInfo = LocaleInfo.getCurrentLocale().getDateTimeFormatInfo();
+      intlConstants = LocaleInfo.getCurrentLocale().getDateTimeConstants();
       // Finding the start and end of weekend
-      firstDayOfWeekend = dateTimeFormatInfo.weekendStart();
-      lastDayOfWeekend = dateTimeFormatInfo.weekendEnd();
-      startingDay = dateTimeFormatInfo.firstDayOfTheWeek();
+      firstDayOfWeekend = Integer.parseInt(intlConstants.weekendRange()[0]) - 1;
+      lastDayOfWeekend = Integer.parseInt(intlConstants.weekendRange()[1]) - 1;
+      startingDay = Integer.parseInt(CalendarUtil.intlConstants.firstDayOfTheWeek()) - 1;
     }
   }
 
diff --git a/user/test/com/google/gwt/i18n/client/DateTimeFormatTestBase.java b/user/test/com/google/gwt/i18n/client/DateTimeFormatTestBase.java
deleted file mode 100644
index ae4da68..0000000
--- a/user/test/com/google/gwt/i18n/client/DateTimeFormatTestBase.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.i18n.client;
-
-import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
-import com.google.gwt.junit.client.GWTTestCase;
-
-import java.util.Date;
-
-/**
- * Base class for date/time format tests.
- */
-public abstract class DateTimeFormatTestBase extends GWTTestCase {
-
-  /**
-   * The timezone used by any tests which use a fixed timezone.
-   */
-  protected static final TimeZone TEST_TIMEZONE = TimeZone.createTimeZone(300);
-
-  /**
-   * Class for getting customized date/time formats.
-   */
-  public interface MyFormats extends CustomDateTimeFormat {
-
-    /**
-     * @return a pattern for abbreviated year, month, and date.
-     */
-    @Pattern("yMMMd")
-    DateTimeFormat yearMonthDayAbbrev();
-
-    /**
-     * @return a pattern for full year, month, and date.
-     */
-    @Pattern("yyyyMMMMd")
-    DateTimeFormat yearMonthDayFull();
-
-    /**
-     * @return a pattern for full year, month, and date.
-     */
-    @Pattern("MMMM d, yyyy")
-    DateTimeFormat yearMonthDayFull2();
-  }
-
-  /**
-   * Test date/time formats in messages.
-   */
-  public interface MyMessages extends Messages {
-    @DefaultMessage("It is {0,localdatetime,dMMMy}")
-    String getCustomizedDate(Date date);
-  }
-
-  @SuppressWarnings("deprecation")
-  public void testIso8601() {
-    DateTimeFormat dtf = DateTimeFormat.getFormat(PredefinedFormat.ISO_8601);
-    Date date = new Date(Date.UTC(2006 - 1900, 6, 27, 13, 10, 10));
-    String str = dtf.format(date, TEST_TIMEZONE);
-    assertEquals("2006-07-27T08:10:10.000-05:00", str);
-  }
-
-  @SuppressWarnings("deprecation")
-  public void testRfc2822() {
-    DateTimeFormat dtf = DateTimeFormat.getFormat(PredefinedFormat.RFC_2822);
-    Date date = new Date(Date.UTC(2006 - 1900, 6, 27, 13, 10, 10));
-    String str = dtf.format(date, TEST_TIMEZONE);
-    assertEquals("Thu, 27 Jul 2006 08:10:10 -0500", str);
-  }
-}
\ No newline at end of file
diff --git a/user/test/com/google/gwt/i18n/client/DateTimeFormat_de_Test.java b/user/test/com/google/gwt/i18n/client/DateTimeFormat_de_Test.java
index abe3c3e..d0c0bee 100644
--- a/user/test/com/google/gwt/i18n/client/DateTimeFormat_de_Test.java
+++ b/user/test/com/google/gwt/i18n/client/DateTimeFormat_de_Test.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.i18n.client;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.junit.client.GWTTestCase;
 
 import java.util.Date;
 
@@ -24,7 +24,7 @@
  * language.
  */
 @SuppressWarnings("deprecation")
-public class DateTimeFormat_de_Test extends DateTimeFormatTestBase {
+public class DateTimeFormat_de_Test extends GWTTestCase {
 
   @Override
   public String getModuleName() {
@@ -214,18 +214,4 @@
     assertEquals("02006.J.27 n. Chr. 01:10 nachm.", DateTimeFormat.getFormat(
         "yyyyy.MMMMM.dd GGG hh:mm aaa").format(date));
   }
-
-  public void testCustomFormats() {
-    MyFormats m = GWT.create(MyFormats.class);
-    Date d = new Date(2010 - 1900, 1, 15, 12, 0, 0);
-    assertEquals("15. Feb 2010", m.yearMonthDayAbbrev().format(d));
-    assertEquals("15. Februar 2010", m.yearMonthDayFull().format(d));
-    assertEquals("15. Februar 2010", m.yearMonthDayFull2().format(d));
-  }
-
-  public void testMessageDateTime() {
-    MyMessages m = GWT.create(MyMessages.class);
-    Date d = new Date(2010 - 1900, 1, 15, 12, 0, 0);
-    assertEquals("Es ist 15. Feb 2010", m.getCustomizedDate(d));
-  }
 }
diff --git a/user/test/com/google/gwt/i18n/client/DateTimeFormat_en_Test.java b/user/test/com/google/gwt/i18n/client/DateTimeFormat_en_Test.java
index 5694748..15178cc 100644
--- a/user/test/com/google/gwt/i18n/client/DateTimeFormat_en_Test.java
+++ b/user/test/com/google/gwt/i18n/client/DateTimeFormat_en_Test.java
@@ -17,7 +17,7 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.i18n.client.constants.TimeZoneConstants;
-import com.google.gwt.i18n.client.impl.cldr.DateTimeFormatInfoImpl_de;
+import com.google.gwt.junit.client.GWTTestCase;
 
 import java.util.Date;
 
@@ -26,22 +26,11 @@
  * language.
  */
 @SuppressWarnings("deprecation")
-public class DateTimeFormat_en_Test extends DateTimeFormatTestBase {
-
-  private static class GermanDTF extends DateTimeFormat {
-
-    public static DateTimeFormat getFormat(String pattern) {
-      return DateTimeFormat.getFormat(pattern, new DateTimeFormatInfoImpl_de());
-    }
-
-    protected GermanDTF(String pattern) {
-      super(pattern);
-    }
-  }
+public class DateTimeFormat_en_Test extends GWTTestCase {
 
   @Override
   public String getModuleName() {
-    return "com.google.gwt.i18n.I18NTest_en";
+    return "com.google.gwt.i18n.I18NTest";
   }
 
   public void test_ccc() {
@@ -133,6 +122,48 @@
     Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
     assertEquals("J", DateTimeFormat.getFormat("LLLLL").format(date));
   }
+  
+  public void test_S() {
+    Date date = new Date(0);
+    assertEquals("0", DateTimeFormat.getFormat("S").format(date));
+    
+    date = new Date(55);
+    assertEquals("1", DateTimeFormat.getFormat("S").format(date));
+    
+    date = new Date(555);
+    assertEquals("6", DateTimeFormat.getFormat("S").format(date));
+    
+    date = new Date(999);
+    assertEquals("9", DateTimeFormat.getFormat("S").format(date));
+  }
+  
+  public void test_SS() {
+    Date date = new Date(0);
+    assertEquals("00", DateTimeFormat.getFormat("SS").format(date));
+    
+    date = new Date(55);
+    assertEquals("06", DateTimeFormat.getFormat("SS").format(date));
+    
+    date = new Date(555);
+    assertEquals("56", DateTimeFormat.getFormat("SS").format(date));
+    
+    date = new Date(999);
+    assertEquals("99", DateTimeFormat.getFormat("SS").format(date));
+  }
+  
+  public void test_SSS() {    
+    Date date = new Date(0);
+    assertEquals("000", DateTimeFormat.getFormat("SSS").format(date));
+    
+    date = new Date(55);
+    assertEquals("055", DateTimeFormat.getFormat("SSS").format(date));
+    
+    date = new Date(555);
+    assertEquals("555", DateTimeFormat.getFormat("SSS").format(date));
+    
+    date = new Date(999);
+    assertEquals("999", DateTimeFormat.getFormat("SSS").format(date));
+  }
 
   public void test_predefinedFormat() {
     Date date = new Date(2006 - 1900, 7, 4, 13, 49, 24);
@@ -180,7 +211,7 @@
         usPacific);
     assertEquals("8/4/06 1:49 PM", shortFormat);
   }
-  
+
   public void test_QQQQyy() {
     Date date;
 
@@ -232,7 +263,7 @@
     assertEquals("4th quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
         date));
   }
-  
+
   public void test_QQyyyy() {
     Date date = new Date(2006 - 1900, 0, 27);
     date.setHours(13);
@@ -295,7 +326,7 @@
     date.setSeconds(10);
     assertEquals("Q4 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
   }
-  
+
   public void test_quote() {
     Date date = new Date(2006 - 1900, 6, 27);
     date.setHours(13);
@@ -308,20 +339,6 @@
     assertEquals("13 '", DateTimeFormat.getFormat("HH ''").format(date));
   }
 
-  public void test_S() {
-    Date date = new Date(0);
-    assertEquals("0", DateTimeFormat.getFormat("S").format(date));
-    
-    date = new Date(55);
-    assertEquals("1", DateTimeFormat.getFormat("S").format(date));
-    
-    date = new Date(555);
-    assertEquals("6", DateTimeFormat.getFormat("S").format(date));
-    
-    date = new Date(999);
-    assertEquals("9", DateTimeFormat.getFormat("S").format(date));
-  }
-
   public void test_simepleTimezonev() {
     TimeZone simpleTimeZone = TimeZone.createTimeZone(480);
 
@@ -370,41 +387,13 @@
     assertEquals("07/27/2006 06:10:10 -0700", DateTimeFormat.getFormat(
         "MM/dd/yyyy HH:mm:ss ZZ").format(date, simpleTimeZone));
 
-    assertEquals("07/27/2006 06:10:10 -07:00", DateTimeFormat.getFormat(
+    assertEquals("07/27/2006 06:10:10 -0700", DateTimeFormat.getFormat(
         "MM/dd/yyyy HH:mm:ss ZZZ").format(date, simpleTimeZone));
 
     assertEquals("07/27/2006 06:10:10 GMT-07:00", DateTimeFormat.getFormat(
         "MM/dd/yyyy HH:mm:ss ZZZZ").format(date, simpleTimeZone));
   }
 
-  public void test_SS() {
-    Date date = new Date(0);
-    assertEquals("00", DateTimeFormat.getFormat("SS").format(date));
-    
-    date = new Date(55);
-    assertEquals("06", DateTimeFormat.getFormat("SS").format(date));
-    
-    date = new Date(555);
-    assertEquals("56", DateTimeFormat.getFormat("SS").format(date));
-    
-    date = new Date(999);
-    assertEquals("99", DateTimeFormat.getFormat("SS").format(date));
-  }
-
-  public void test_SSS() {    
-    Date date = new Date(0);
-    assertEquals("000", DateTimeFormat.getFormat("SSS").format(date));
-    
-    date = new Date(55);
-    assertEquals("055", DateTimeFormat.getFormat("SSS").format(date));
-    
-    date = new Date(555);
-    assertEquals("555", DateTimeFormat.getFormat("SSS").format(date));
-    
-    date = new Date(999);
-    assertEquals("999", DateTimeFormat.getFormat("SSS").format(date));
-  }
-
   public void test_timezonev() {
     TimeZoneConstants timeZoneData = GWT.create(TimeZoneConstants.class);
     String str = timeZoneData.americaLosAngeles();
@@ -480,7 +469,7 @@
     assertEquals("07/27/2006 06:10:10 -0700", DateTimeFormat.getFormat(
         "MM/dd/yyyy HH:mm:ss ZZ").format(date, usPacific));
 
-    assertEquals("07/27/2006 06:10:10 -07:00", DateTimeFormat.getFormat(
+    assertEquals("07/27/2006 06:10:10 -0700", DateTimeFormat.getFormat(
         "MM/dd/yyyy HH:mm:ss ZZZ").format(date, usPacific));
 
     assertEquals("07/27/2006 06:10:10 GMT-07:00", DateTimeFormat.getFormat(
@@ -493,7 +482,7 @@
     assertEquals("02/27/2006 05:10:10 -0800", DateTimeFormat.getFormat(
         "MM/dd/yyyy HH:mm:ss ZZ").format(date, usPacific));
 
-    assertEquals("02/27/2006 05:10:10 -08:00", DateTimeFormat.getFormat(
+    assertEquals("02/27/2006 05:10:10 -0800", DateTimeFormat.getFormat(
         "MM/dd/yyyy HH:mm:ss ZZZ").format(date, usPacific));
 
     assertEquals("02/27/2006 05:10:10 GMT-08:00", DateTimeFormat.getFormat(
@@ -505,29 +494,7 @@
     assertEquals("02006.J.27 AD 01:10 PM", DateTimeFormat.getFormat(
         "yyyyy.MMMMM.dd GGG hh:mm aaa").format(date));
   }
-
-  public void testCustomFormats() {
-    MyFormats m = GWT.create(MyFormats.class);
-    Date d = new Date(2010 - 1900, 1, 15, 12, 0, 0);
-    assertEquals("Feb 15, 2010", m.yearMonthDayAbbrev().format(d));
-    assertEquals("February 15, 2010", m.yearMonthDayFull().format(d));
-    assertEquals("February 15, 2010", m.yearMonthDayFull2().format(d));
-  }
-
-  public void testMessageDateTime() {
-    MyMessages m = GWT.create(MyMessages.class);
-    Date d = new Date(2010 - 1900, 1, 15, 12, 0, 0);
-    assertEquals("It is Feb 15, 2010", m.getCustomizedDate(d));
-  }
-
-  public void testPatternCaching() {
-    DateTimeFormat dtf = DateTimeFormat.getFormat("MMMM d");
-    Date d = new Date(2010 - 1900, 1, 15, 12, 0, 0);
-    assertEquals("February 15", dtf.format(d));
-    dtf = GermanDTF.getFormat("MMMM d");
-    assertEquals("Februar 15", dtf.format(d));
-  }
-
+  
   public void testPre1970Milliseconds() {
     Date date = new Date(-631151998945L); // Jan 1, 1950 00:00:01.055 UTC
     
diff --git a/user/test_i18n_bar/com/google/gwt/i18n/client/DateTimeFormatTestBase_MyMessages_de.properties b/user/test_i18n_bar/com/google/gwt/i18n/client/DateTimeFormatTestBase_MyMessages_de.properties
deleted file mode 100644
index 1d7bbce..0000000
--- a/user/test_i18n_bar/com/google/gwt/i18n/client/DateTimeFormatTestBase_MyMessages_de.properties
+++ /dev/null
@@ -1 +0,0 @@
-getCustomizedDate=Es ist {0,localdatetime,dMMMy}
\ No newline at end of file
diff --git a/user/test_i18n_bar/com/google/gwt/i18n/client/DateTimeFormatTestBase_MyMessages_en.properties b/user/test_i18n_bar/com/google/gwt/i18n/client/DateTimeFormatTestBase_MyMessages_en.properties
deleted file mode 100644
index 78b180c..0000000
--- a/user/test_i18n_bar/com/google/gwt/i18n/client/DateTimeFormatTestBase_MyMessages_en.properties
+++ /dev/null
@@ -1 +0,0 @@
-getCustomizedDate=It is {0,localdatetime,dMMMy}
\ No newline at end of file
