diff --git a/user/src/com/google/gwt/i18n/client/CurrencyData.java b/user/src/com/google/gwt/i18n/client/CurrencyData.java
index a2dae16..0e286f5 100644
--- a/user/src/com/google/gwt/i18n/client/CurrencyData.java
+++ b/user/src/com/google/gwt/i18n/client/CurrencyData.java
@@ -43,13 +43,6 @@
   String getPortableCurrencySymbol();
 
   /**
-   * Returns the simplest symbol to use for this currency, which is not guaranteed
-   * to be unique -- for example, this might return "$" for both USD and CAD.  It
-   * is acceptable to return the same value as {@link #getCurrencySymbol()}.
-   */
-  String getSimpleCurrencySymbol();
-
-  /**
    * Returns true if this currency is deprecated and should not be returned by
    * default in currency lists.
    */
diff --git a/user/src/com/google/gwt/i18n/client/CurrencyList.java b/user/src/com/google/gwt/i18n/client/CurrencyList.java
index ad5a5a3..0dbf144 100644
--- a/user/src/com/google/gwt/i18n/client/CurrencyList.java
+++ b/user/src/com/google/gwt/i18n/client/CurrencyList.java
@@ -137,7 +137,6 @@
    * 
    * Deprecated currencies will not be included.
    */
-  @Override
   public final Iterator<CurrencyData> iterator() {
     return iterator(false);
   }
@@ -207,7 +206,7 @@
    * Generated implementations override this method.
    */
   protected CurrencyData getDefaultJava() {
-    return new CurrencyDataImpl("USD", "$", 2, "US$", "$");
+    return new CurrencyDataImpl("USD", "$", 2, "US$");
   }
 
   /**
@@ -226,10 +225,10 @@
    */
   protected HashMap<String, CurrencyData> loadCurrencyMapJava() {
     HashMap<String, CurrencyData> result = new HashMap<String, CurrencyData>();
-    result.put("USD", new CurrencyDataImpl("USD", "$", 2, "US$", "$"));
-    result.put("EUR", new CurrencyDataImpl("EUR", "€", 2, "€", "€"));
-    result.put("GBP", new CurrencyDataImpl("GBP", "UK£", 2, "UK£", "£"));
-    result.put("JPY", new CurrencyDataImpl("JPY", "¥", 0, "JP¥", "¥"));
+    result.put("USD", new CurrencyDataImpl("USD", "$", 2));
+    result.put("EUR", new CurrencyDataImpl("EUR", "€", 2));
+    result.put("GBP", new CurrencyDataImpl("GBP", "UK£", 2));
+    result.put("JPY", new CurrencyDataImpl("JPY", "¥", 0));
     return result;
   }
 
diff --git a/user/src/com/google/gwt/i18n/client/DefaultCurrencyData.java b/user/src/com/google/gwt/i18n/client/DefaultCurrencyData.java
index 05fbf79..23f7456 100644
--- a/user/src/com/google/gwt/i18n/client/DefaultCurrencyData.java
+++ b/user/src/com/google/gwt/i18n/client/DefaultCurrencyData.java
@@ -54,52 +54,38 @@
     this.fractionDigits = fractionDigits;
   }
 
-  @Override
   public String getCurrencyCode() {
     return currencyCode;
   }
 
-  @Override
   public String getCurrencySymbol() {
     return currencySymbol;
   }
 
-  @Override
   public int getDefaultFractionDigits() {
     return fractionDigits;
   }
 
-  @Override
   public String getPortableCurrencySymbol() {
     return getCurrencySymbol();
   }
 
-  @Override
-  public String getSimpleCurrencySymbol() {
-    return getCurrencySymbol();
-  }
-
-  @Override
   public boolean isDeprecated() {
     return false;
   }
 
-  @Override
   public boolean isSpaceForced() {
     return false;
   }
 
-  @Override
   public boolean isSpacingFixed() {
     return false;
   }
 
-  @Override
   public boolean isSymbolPositionFixed() {
     return false;
   }
 
-  @Override
   public boolean isSymbolPrefix() {
     return false;
   }
diff --git a/user/src/com/google/gwt/i18n/client/NumberFormat.java b/user/src/com/google/gwt/i18n/client/NumberFormat.java
index 5424ed3..c7c5ff6 100644
--- a/user/src/com/google/gwt/i18n/client/NumberFormat.java
+++ b/user/src/com/google/gwt/i18n/client/NumberFormat.java
@@ -321,17 +321,17 @@
   private static NumberFormat cachedPercentFormat;
   private static NumberFormat cachedScientificFormat;
 
-  // Constants for characters used in programmatic (unlocalized) patterns.
-  private static final char CURRENCY_SIGN = '\u00A4';
-
   // Number constants mapped to use latin digits/separators.
   private static NumberConstants latinNumberConstants = null;
+
   // Localized characters for dot and comma in number patterns, used to produce
   // the latin mapping for arbitrary locales.  Any separator not in either of
   // these strings will be mapped to non-breaking space (U+00A0).
   private static final String LOCALIZED_COMMA_EQUIVALENTS = ",\u060C\u066B\u3001\uFE10\uFE11\uFE50\uFE51\uFF0C\uFF64";
-
   private static final String LOCALIZED_DOT_EQUIVALENTS = ".\u2024\u3002\uFE12\uFE52\uFF0E\uFF61";
+
+  // Constants for characters used in programmatic (unlocalized) patterns.
+  private static final char CURRENCY_SIGN = '\u00A4';
   private static final char PATTERN_DECIMAL_SEPARATOR = '.';
   private static final char PATTERN_DIGIT = '#';
   private static final char PATTERN_EXPONENT = 'E';
@@ -353,25 +353,26 @@
   }
 
   /**
-   * Provides the standard currency format for the current locale.
+   * Provides the standard currency format for the default locale.
    *
    * @return a <code>NumberFormat</code> capable of producing and consuming
    *         currency format for the default locale
    */
   public static NumberFormat getCurrencyFormat() {
     if (cachedCurrencyFormat == null) {
-      cachedCurrencyFormat = getCurrencyFormat(CurrencyList.get().getDefault());
+      cachedCurrencyFormat = new NumberFormat(
+          defaultNumberConstants.currencyPattern(), CurrencyList.get().getDefault(), false);
     }
     return cachedCurrencyFormat;
   }
 
   /**
-   * Provides the standard currency format for the current locale using a
+   * Provides the standard currency format for the default locale using a
    * specified currency.
    *
    * @param currencyData currency data to use
    * @return a <code>NumberFormat</code> capable of producing and consuming
-   *         currency format for the current locale
+   *         currency format for the default locale
    */
   public static NumberFormat getCurrencyFormat(CurrencyData currencyData) {
     return new NumberFormat(defaultNumberConstants.currencyPattern(),
@@ -379,20 +380,21 @@
   }
 
   /**
-   * Provides the standard currency format for the current locale using a
+   * Provides the standard currency format for the default locale using a
    * specified currency.
    *
    * @param currencyCode valid currency code, as defined in
    *     com.google.gwt.i18n.client.constants.CurrencyCodeMapConstants.properties
    * @return a <code>NumberFormat</code> capable of producing and consuming
-   *         currency format for the current locale
+   *         currency format for the default locale
    * @throws IllegalArgumentException if the currency code is unknown
    */
   public static NumberFormat getCurrencyFormat(String currencyCode) {
-    return getCurrencyFormat(lookupCurrency(currencyCode));
+    // TODO(jat): consider caching values per currency code.
+    return new NumberFormat(defaultNumberConstants.currencyPattern(),
+        lookupCurrency(currencyCode), false);
   }
 
-
   /**
    * Provides the standard decimal format for the default locale.
    *
@@ -449,44 +451,6 @@
   }
 
   /**
-   * Provides the global currency format for the current locale, using its
-   * default currency.
-   * 
-   * @return a <code>NumberFormat</code> capable of producing and consuming
-   *         currency format for the current locale
-   */
-  public static NumberFormat getGlobalCurrencyFormat() {
-    return getGlobalCurrencyFormat(CurrencyList.get().getDefault());
-  }
-
-  /**
-   * Provides the global currency format for the current locale, using a
-   * specified currency.
-   *
-   * @param currencyData currency data to use
-   * @return a <code>NumberFormat</code> capable of producing and consuming
-   *         currency format for the current locale
-   */
-  public static NumberFormat getGlobalCurrencyFormat(CurrencyData currencyData) {
-    return new NumberFormat(defaultNumberConstants.globalCurrencyPattern(),
-        currencyData, false);
-  }
-  
-  /**
-   * Provides the global currency format for the current locale, using a
-   * specified currency.
-   *
-   * @param currencyCode valid currency code, as defined in
-   *     com.google.gwt.i18n.client.constants.CurrencyCodeMapConstants.properties
-   * @return a <code>NumberFormat</code> capable of producing and consuming
-   *         currency format for the current locale
-   * @throws IllegalArgumentException if the currency code is unknown
-   */
-  public static NumberFormat getGlobalCurrencyFormat(String currencyCode) {
-    return getGlobalCurrencyFormat(lookupCurrency(currencyCode));
-  }
-
-  /**
    * Provides the standard percent format for the default locale.
    *
    * @return a <code>NumberFormat</code> capable of producing and consuming
@@ -517,48 +481,6 @@
   }
 
   /**
-   * Provides the simple currency format for the current locale using its
-   * default currency. Note that these formats may be ambiguous if the
-   * currency isn't clear from other content on the page.
-   *
-   * @return a <code>NumberFormat</code> capable of producing and consuming
-   *         currency format for the current locale
-   */
-  public static NumberFormat getSimpleCurrencyFormat() {
-    return getSimpleCurrencyFormat(CurrencyList.get().getDefault());
-  }
-
-  /**
-   * Provides the simple currency format for the current locale using a
-   * specified currency. Note that these formats may be ambiguous if the
-   * currency isn't clear from other content on the page.
-   *
-   * @param currencyData currency data to use
-   * @return a <code>NumberFormat</code> capable of producing and consuming
-   *         currency format for the current locale
-   */
-  public static NumberFormat getSimpleCurrencyFormat(CurrencyData currencyData) {
-    return new NumberFormat(defaultNumberConstants.simpleCurrencyPattern(),
-        currencyData, false);
-  }
-
-  /**
-   * Provides the simple currency format for the current locale using a
-   * specified currency. Note that these formats may be ambiguous if the
-   * currency isn't clear from other content on the page.
-   * 
-   * @param currencyCode valid currency code, as defined in
-   *        com.google.gwt.i18n.client
-   *        .constants.CurrencyCodeMapConstants.properties
-   * @return a <code>NumberFormat</code> capable of producing and consuming
-   *         currency format for the current locale
-   * @throws IllegalArgumentException if the currency code is unknown
-   */
-  public static NumberFormat getSimpleCurrencyFormat(String currencyCode) {
-    return getSimpleCurrencyFormat(lookupCurrency(currencyCode));
-  }
-
-  /**
    * Specify whether all new NumberFormat instances will use latin digits
    * and related characters rather than the localized ones.
    *
@@ -601,97 +523,70 @@
     final String monetarySeparator = remapSeparator(
         orig.monetarySeparator());
     return new NumberConstants() {
-      @Override
       public String currencyPattern() {
         return orig.currencyPattern();
       }
 
-      @Override
       public String decimalPattern() {
         return orig.decimalPattern();
       }
 
-      @Override
       public String decimalSeparator() {
         return decimalSeparator;
       }
 
-      @Override
       public String defCurrencyCode() {
         return orig.defCurrencyCode();
       }
 
-      @Override
       public String exponentialSymbol() {
         return orig.exponentialSymbol();
       }
 
-      @Override
-      public String globalCurrencyPattern() {
-        return orig.globalCurrencyPattern();
-      }
-
-      @Override
       public String groupingSeparator() {
         return groupingSeparator;
       }
 
-      @Override
       public String infinity() {
         return orig.infinity();
       }
 
-      @Override
       public String minusSign() {
         return orig.minusSign();
       }
 
-      @Override
       public String monetaryGroupingSeparator() {
         return monetaryGroupingSeparator;
       }
 
-      @Override
       public String monetarySeparator() {
         return monetarySeparator;
       }
 
-      @Override
       public String notANumber() {
         return orig.notANumber();
       }
 
-      @Override
       public String percent() {
         return orig.percent();
       }
 
-      @Override
       public String percentPattern() {
         return orig.percentPattern();
       }
 
-      @Override
       public String perMill() {
         return orig.perMill();
       }
 
-      @Override
       public String plusSign() {
         return orig.plusSign();
       }
 
-      @Override
       public String scientificPattern() {
         return orig.scientificPattern();
       }
 
-      @Override
-      public String simpleCurrencyPattern() {
-        return orig.simpleCurrencyPattern();
-      }
-
-      @Override
       public String zeroDigit() {
         return "0";
       }
@@ -786,15 +681,14 @@
   }-*/;
 
   /**
-   * Information about the currency being used.
+   * The currency code.
    */
-  private CurrencyData currencyData;
+  private final String currencyCode;
 
   /**
-   * Holds the current decimal position during one call to
-   * {@link #format(boolean, StringBuilder, int)}.
+   * Currency symbol to use.
    */
-  private transient int decimalPosition;
+  private final String currencySymbol;
 
   /**
    * Forces the decimal separator to always appear in a formatted number.
@@ -802,30 +696,18 @@
   private boolean decimalSeparatorAlwaysShown = false;
 
   /**
-   * Holds the current digits length during one call to
-   * {@link #format(boolean, StringBuilder, int)}.
-   */
-  private transient int digitsLength;
-
-  /**
-   * Holds the current exponent during one call to
-   * {@link #format(boolean, StringBuilder, int)}.
-   */
-  private transient int exponent;
-  /**
    * The number of digits between grouping separators in the integer portion of
    * a number.
    */
   private int groupingSize = 3;
+
   private boolean isCurrencyFormat = false;
+
   private int maximumFractionDigits = 3; // invariant, >= minFractionDigits.
 
   private int maximumIntegerDigits = 40;
-
   private int minExponentDigits;
-
   private int minimumFractionDigits = 0;
-
   private int minimumIntegerDigits = 1;
 
   // The multiplier for use in percent, per mille, etc.
@@ -849,6 +731,24 @@
   private boolean useExponentialNotation = false;
 
   /**
+   * Holds the current exponent during one call to
+   * {@link #format(boolean, StringBuilder, int)}.
+   */
+  private transient int exponent;
+
+  /**
+   * Holds the current decimal position during one call to
+   * {@link #format(boolean, StringBuilder, int)}.
+   */
+  private transient int decimalPosition;
+
+  /**
+   * Holds the current digits length during one call to
+   * {@link #format(boolean, StringBuilder, int)}.
+   */
+  private transient int digitsLength;
+
+  /**
    * Constructs a format object based on the specified settings.
    *
    * @param numberConstants the locale-specific number constants to use for this
@@ -867,12 +767,13 @@
     }
     this.numberConstants = numberConstants;
     this.pattern = pattern;
-    currencyData = cdata;
+    currencyCode = cdata.getCurrencyCode();
+    currencySymbol = cdata.getCurrencySymbol();
 
     // TODO: handle per-currency flags, such as symbol prefix/suffix and spacing
     parsePattern(this.pattern);
     if (!userSuppliedPattern && isCurrencyFormat) {
-      minimumFractionDigits = currencyData.getDefaultFractionDigits();
+      minimumFractionDigits = cdata.getDefaultFractionDigits();
       maximumFractionDigits = minimumFractionDigits;
     }
   }
@@ -1467,15 +1368,9 @@
             isCurrencyFormat = true;
             if ((pos + 1) < len && pattern.charAt(pos + 1) == CURRENCY_SIGN) {
               ++pos;
-              if (pos < len - 3 && pattern.charAt(pos + 1) == CURRENCY_SIGN
-                  && pattern.charAt(pos + 2) == CURRENCY_SIGN) {
-                pos += 2;
-                affix.append(currencyData.getSimpleCurrencySymbol());
-              } else {
-                affix.append(currencyData.getCurrencyCode());
-              }
+              affix.append(currencyCode);
             } else {
-              affix.append(currencyData.getCurrencySymbol());
+              affix.append(currencySymbol);
             }
             break;
           case PATTERN_PERCENT:
diff --git a/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties b/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties
index 35c09a4..00e0b1c 100644
--- a/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties
+++ b/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties
@@ -13,7 +13,7 @@
 # the License.
 
 # This file contains additional data about currencies which are not included in
-# the CLDR data.  Currently, this file contains four fields separated by "|".
+# the CLDR data.  Currently, this file contains three fields separated by "|".
 # Empty trailing fields can be omitted along with their separators.
 #
 # The first field is a "portable" currency symbol, which is intended to be
@@ -33,160 +33,52 @@
 #
 # The third field overrides the CLDR-derived currency symbol if present.
 #
-# The fourth field is the simple currency symbol, if present.
-#
 # The following were set to 10 originally, which is POSITION_FLAG without
 # POS_FIXED_FLAG.  As I understand the code, this would have no effect.
 #  CZK DKK EUR ILS ISK NOK RUB SEK
-AED = DH|||dh
-AFN = |||Af.
-ALL = |||Lek
-AMD = |||Dram
-AOA = |||Kz
-ARS = AR$|||$
-AUD = AU$|||$
-AWG = |||Afl.
-AZN = |||man.
-BAM = |||KM
-BBD = |||$
-BDT = Tk|||\u09F3
-BIF = |||FBu
-BGN = |||lev
-BHD = |||din
-BMD = |||$
-BND = |||$
-BOB = |||Bs
-BRL = R$|||R$
-BSD = |||$
-BTN = |||Nu.
-BWP = |||P
-BYR = |||BYR
-BZD = |||$
-CAD = C$|||$
-CDF = |||FrCD
-CHF = CHF|||CHF
-CLP = CL$|||$
-CNY = RMB¥|||¥
-COP = COL$|||$
-CRC = CR₡|||\u20A1
-CUC = |||$
-CUP = $MN|||$
-CVE = |||CVE
-CZK = Kč|||K\u010D
-DJF = Fdj
-DKK = kr|||kr
-DOP = RD$|||$
-DZD = |||din
-EGP = LE|||E£
-ERN = |||Nfk
-ETB = |||Birr
-EUR = €|||\u20AC
-FJD = |||$
-FKP = |||£
-GBP = GB£|||£
-GEL = |||GEL
-GHS = |||GHS
-GIP = |||£
-GMD = |||GMD
-GNF = |||FG
-GTQ = |||Q
-GYD = |||$
-HKD = HK$|||$
-HNL = ||L
-HRK = |||kn
-HTG = |||HTG
-HUF = |||Ft
-IDR = |||Rp
-ILS = IL₪|||\u20AA
-INR = Rs|||\u20B9
-IQD = |||din
-IRR = |||Rial
-ISK = kr|||kr
-JMD = JA$|||$
-JOD = |||din
-JPY = JP¥|||¥
-KES = Ksh
-KGS = |||KGS
-KHR = |||Riel
-KMF = |||CF
-KPW = |||\u20A9
-KRW = KR₩|||\u20A9
-KWD = |||din
-KYD = |||$
-KZT = |||\u20B8
-LAK = |||\u20AD
-LBP = |||L£
-LKR = SLRs|||Rs
-LRD = |||$
-LSL = |||LSL
-LTL = |||Lt
-LVL = |||Ls
-LYD = |||din
-MDL = |||MDL
-MKD = |||dh
-MGA = |||Ar
-MKD = |||din
-MMK = |||K
-MNT = MN₮|||\u20AE
-MOP = |||MOP
-MRO = |||MRO
-MUR = |||Rs
-MWK = |||MWK
-MXN = Mex$|||$
-MYR = RM|||RM
-MZN = |||MTn
-NAD = |||$
-NIO = |||C$
-NGN = |||\u20A6
-NOK = NOkr|||kr
-NPR = |||Rs
-NZD = |||$
-OMR = |||Rial
-PAB = B/.|||B/.
-PEN = S/.|||S/.
-PHP = PHP|||\u20B1
-PKR = PKRs.|||Rs
-PLN = |||z\u0142
-PYG = |||Gs
-QAR = |||Rial
-RON = |||RON
-RSD = |||din
-RUB = руб|||Rup
-RWF = |||RF
-SAR = SR|||Rial
-SBD = |||$
-SCR = |||SCR
-SDG = |||SDG
-SEK = kr|||kr
-SGD = S$|||$
-SHP = |||£
-SLL = |||SLL
-SOS = |||SOS
-SRD = |||$
-STD = |||Db
-SYP = |||£
-SZL = |||SZL
-THB = THB|||\u0E3F
-TJS = |||Som
-TND = |||din
-TOP = |||T$
+AED = DH
+ARS = AR$
+AUD = AU$
+BDT = Tk
+BRL = R$
+CAD = C$
+CHF = CHF
+CLP = CL$
+CNY = RMB¥
+COP = COL$
+CRC = CR₡
+CUP = $MN
+CZK = Kč
+DKK = kr
+DOP = RD$
+EGP = LE
+EUR = €
+GBP = GB£
+HKD = HK$
+ILS = IL₪
+INR = Rs
+ISK = kr
+JMD = JA$
+JPY = JP¥
+KRW = KR₩
+LKR = SLRs
+MNT = MN₮
+MXN = Mex$
+MYR = RM
+NOK = NOkr
+PAB = B/.
+PEN = S/.
+PHP = PHP
+PKR = PKRs.
+RUB = руб
+SAR = SR
+SEK = kr
+SGD = S$
+THB = THB
 TRY = YTL
-TTD = |||$
-TWD = NT$|||NT$
-TZS = |||TSh
-UAH = |||\u20B4
-UGX = |||UGX
-USD = US$|||$
-UYU = UY$|||$
-UZS = |||so\u02BCm
-VEF = |||Bs
-VND = ₫|SymSuffix||\u20AB
-VUV = |||VUV
-WST = |||WST
-XAF = |||FCFA
-XCD = |||$
-XOF = |||CFA
-XPF = |||FCFP
-YER = YER|||Rial
-ZAR = ZAR|||R
-ZMK = |||ZWK
+TWD = NT$
+USD = US$
+UYU = UY$
+VND = ₫|SymSuffix
+YER = YER
+ZAR = ZAR
diff --git a/user/src/com/google/gwt/i18n/client/constants/NumberConstants.java b/user/src/com/google/gwt/i18n/client/constants/NumberConstants.java
index aa1a55f..d7c2b8b 100644
--- a/user/src/com/google/gwt/i18n/client/constants/NumberConstants.java
+++ b/user/src/com/google/gwt/i18n/client/constants/NumberConstants.java
@@ -28,23 +28,21 @@
  * use LocaleInfo.getCurrentLocale().getNumberConstants() instead.
  */
 public interface NumberConstants {
-  String notANumber();
-  String currencyPattern();
-  String decimalPattern();
-  String decimalSeparator();
-  String defCurrencyCode();
-  String exponentialSymbol();
-  String globalCurrencyPattern();
-  String groupingSeparator();
-  String infinity();
-  String minusSign();
-  String monetaryGroupingSeparator();
-  String monetarySeparator();
-  String percent();
-  String percentPattern();
-  String perMill();
-  String plusSign();
-  String scientificPattern();
-  String simpleCurrencyPattern();
-  String zeroDigit();
+  String   notANumber();
+  String   currencyPattern();
+  String   decimalPattern();
+  String   decimalSeparator();
+  String   defCurrencyCode();
+  String   exponentialSymbol();
+  String   groupingSeparator();
+  String   infinity();
+  String   minusSign();
+  String   monetaryGroupingSeparator();
+  String   monetarySeparator();
+  String   percent();
+  String   percentPattern();
+  String   perMill();
+  String   plusSign();
+  String   scientificPattern();
+  String   zeroDigit();
 }
diff --git a/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.java b/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.java
index 0c5e294..2fd1b77 100644
--- a/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.java
+++ b/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.java
@@ -27,60 +27,21 @@
  * locale. 
  */
 public interface NumberConstantsImpl extends Constants, NumberConstants  {
-  @Override
-  String notANumber();
-
-  @Override
-  String currencyPattern();
-
-  @Override
-  String decimalPattern();
-
-  @Override
-  String decimalSeparator();
-
-  @Override
-  String defCurrencyCode();
-
-  @Override
-  String exponentialSymbol();
-
-  @Override
-  String globalCurrencyPattern();
-
-  @Override
-  String groupingSeparator();
-
-  @Override
-  String infinity();
-
-  @Override
-  String minusSign();
-
-  @Override
-  String monetaryGroupingSeparator();
-
-  @Override
-  String monetarySeparator();
-
-  @Override
-  String percent();
-
-  @Override
-  String percentPattern();
-
-  @Override
-  String perMill();
-
-  @Override
-  String plusSign();
-
-  @Override
-  String scientificPattern();
-
-  @Override
-  String simpleCurrencyPattern();
-
-  @Override
-  String zeroDigit();
+  String   notANumber();
+  String   currencyPattern();
+  String   decimalPattern();
+  String   decimalSeparator();
+  String   defCurrencyCode();
+  String   exponentialSymbol();
+  String   groupingSeparator();
+  String   infinity();
+  String   minusSign();
+  String   monetaryGroupingSeparator();
+  String   monetarySeparator();
+  String   percent();
+  String   percentPattern();
+  String   perMill();
+  String   plusSign();
+  String   scientificPattern();
+  String   zeroDigit();
 }
diff --git a/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.properties b/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.properties
index e8a9abe..a971da3 100644
--- a/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.properties
+++ b/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.properties
@@ -1,6 +1,5 @@
 # This file is generated from CLDR ver 1.7.1
 decimalSeparator = .
-globalCurrencyPattern = \u00A4\u00A4\u00A4\u00A4#,##0.00 \u00A4\u00A4;(\u00A4\u00A4\u00A4\u00A4#,##0.00 \u00A4\u00A4)
 groupingSeparator = ,
 percent = %
 zeroDigit = 0
@@ -14,7 +13,6 @@
 monetaryGroupingSeparator = ,
 decimalPattern = #,##0.###
 scientificPattern = #E0
-simpleCurrencyPattern = \u00A4\u00A4\u00A4\u00A4#,##0.00;(\u00A4\u00A4\u00A4\u00A4#,##0.00)
 percentPattern = #,##0%
 currencyPattern = \u00A4#,##0.00;(\u00A4#,##0.00)
 defCurrencyCode = USD
diff --git a/user/src/com/google/gwt/i18n/client/impl/CurrencyDataImpl.java b/user/src/com/google/gwt/i18n/client/impl/CurrencyDataImpl.java
index 6716e02..92ec8ab 100644
--- a/user/src/com/google/gwt/i18n/client/impl/CurrencyDataImpl.java
+++ b/user/src/com/google/gwt/i18n/client/impl/CurrencyDataImpl.java
@@ -71,41 +71,25 @@
   private final int flagsAndPrecision;
 
   /**
-   * Portable currency symbol, may be the same as {@link #getCurrencySymbol()}.
+   * Portable currency symbol, may be the same as {@link #currencySymbol}.
    */
   private final String portableCurrencySymbol;
 
   /**
-   * Simple currency symbol, may be the same as {@link #getCurrencySymbol()}.
-   */
-  private final String simpleCurrencySymbol;
-
-  /**
    * Create a new CurrencyData whose portable symbol is the same as its local
    * symbol.
    */
-  public CurrencyDataImpl(String currencyCode, String currencySymbol, int flagsAndPrecision) {
-    this(currencyCode, currencySymbol, flagsAndPrecision, null, null);
-  }
-
-  /**
-   * Create a new CurrencyData whose portable symbol is the same as its local
-   * symbol.
-   */
-  public CurrencyDataImpl(String currencyCode, String currencySymbol, int flagsAndPrecision,
-      String portableCurrencySymbol) {
-    this(currencyCode, currencySymbol, flagsAndPrecision, portableCurrencySymbol, null);
+  public CurrencyDataImpl(String currencyCode, String currencySymbol,
+      int flagsAndPrecision) {
+    this(currencyCode, currencySymbol, flagsAndPrecision, currencySymbol);
   }
 
   public CurrencyDataImpl(String currencyCode, String currencySymbol,
-      int flagsAndPrecision, String portableCurrencySymbol, String simpleCurrencySymbol) {
+      int flagsAndPrecision, String portableCurrencySymbol) {
     super(currencyCode, currencySymbol,
         getDefaultFractionDigits(flagsAndPrecision));
     this.flagsAndPrecision = flagsAndPrecision;
-    this.portableCurrencySymbol = portableCurrencySymbol == null ? currencySymbol
-        : portableCurrencySymbol;
-    this.simpleCurrencySymbol = simpleCurrencySymbol == null ? currencySymbol
-        : simpleCurrencySymbol;
+    this.portableCurrencySymbol = portableCurrencySymbol;
   }
 
   @Override
@@ -119,11 +103,6 @@
   }
 
   @Override
-  public String getSimpleCurrencySymbol() {
-    return simpleCurrencySymbol;
-  }
-
-  @Override
   public boolean isDeprecated() {
     return isDeprecated(flagsAndPrecision);
   }
diff --git a/user/src/com/google/gwt/i18n/client/impl/CurrencyDataJso.java b/user/src/com/google/gwt/i18n/client/impl/CurrencyDataJso.java
index 8b3ca62..865335b 100644
--- a/user/src/com/google/gwt/i18n/client/impl/CurrencyDataJso.java
+++ b/user/src/com/google/gwt/i18n/client/impl/CurrencyDataJso.java
@@ -32,7 +32,6 @@
  *       d5:    space is forced, 0=no space present
  *       d6:    spacing around currency symbol is based on d5
  *   3 - portable currency symbol (optional)
- *   4 - simple currency symbol (optional)
  * </pre>
  */
 public final class CurrencyDataJso extends JavaScriptObject implements CurrencyData {
@@ -40,52 +39,38 @@
   protected CurrencyDataJso() {
   }
 
-  @Override
   public native String getCurrencyCode() /*-{
     return this[0];
   }-*/;
 
-  @Override
   public native String getCurrencySymbol() /*-{
     return this[1];
   }-*/;
 
-  @Override
   public int getDefaultFractionDigits() {
     return CurrencyDataImpl.getDefaultFractionDigits(getFlagsAndPrecision());
   }
 
-  @Override
   public native String getPortableCurrencySymbol() /*-{
     return this[3] || this[1];
   }-*/;
 
-  @Override
-  public native String getSimpleCurrencySymbol() /*-{
-    return this[4] || this[1];
-  }-*/;
-
-  @Override
   public boolean isDeprecated() {
     return CurrencyDataImpl.isDeprecated(getFlagsAndPrecision());
   }
 
-  @Override
   public boolean isSpaceForced() {
     return CurrencyDataImpl.isSpaceForced(getFlagsAndPrecision());
   }
 
-  @Override
   public boolean isSpacingFixed() {
     return CurrencyDataImpl.isSpacingFixed(getFlagsAndPrecision());
   }
 
-  @Override
   public boolean isSymbolPositionFixed() {
     return CurrencyDataImpl.isSymbolPositionFixed(getFlagsAndPrecision());
   }
 
-  @Override
   public boolean isSymbolPrefix() {
     return CurrencyDataImpl.isSymbolPrefix(getFlagsAndPrecision());
   }
diff --git a/user/src/com/google/gwt/i18n/rebind/CurrencyListGenerator.java b/user/src/com/google/gwt/i18n/rebind/CurrencyListGenerator.java
index 214e1bb..a6a9cef 100644
--- a/user/src/com/google/gwt/i18n/rebind/CurrencyListGenerator.java
+++ b/user/src/com/google/gwt/i18n/rebind/CurrencyListGenerator.java
@@ -74,8 +74,6 @@
 
     private final String symbol;
 
-    private String simpleSymbol;
-
     /**
      * Create an instance.
      * 
@@ -125,7 +123,6 @@
       String[] currencySplit = SPLIT_VERTICALBAR.split(currencyData);
       String currencyDisplay = currencySplit[0];
       String currencySymbol = null;
-      String simpleCurrencySymbol = null;
       if (currencySplit.length > 1 && currencySplit[1].length() > 0) {
         currencySymbol = currencySplit[1];
       }
@@ -148,7 +145,6 @@
         // 1 - space-separated flags regarding currency symbol
         // positioning/spacing
         // 2 - override of CLDR-derived currency symbol
-        // 3 - simple currency symbol
         String[] extraSplit = SPLIT_VERTICALBAR.split(extraData);
         currencyPortableSymbol = extraSplit[0];
         if (extraSplit.length > 1) {
@@ -170,11 +166,6 @@
         if (extraSplit.length > 2 && extraSplit[2].length() > 0) {
           currencySymbol = extraSplit[2];
         }
-        // If a non-empty simple symbol is supplied, use it for the currency
-        // symbol.
-        if (extraSplit.length > 3 && extraSplit[3].length() > 0) {
-          simpleCurrencySymbol = extraSplit[3];
-        }
         // If we don't have a currency symbol yet, use the portable symbol if
         // supplied.
         if (currencySymbol == null && currencyPortableSymbol.length() > 0) {
@@ -185,17 +176,10 @@
       if (currencySymbol == null) {
         currencySymbol = currencyCode;
       }
-      if (currencyPortableSymbol.length() == 0) {
-        currencyPortableSymbol = currencySymbol;
-      }
-      if (simpleCurrencySymbol == null) {
-        simpleCurrencySymbol = currencySymbol;
-      }
       displayName = currencyDisplay;
       symbol = currencySymbol;
       flags = currencyFlags;
       portableSymbol = currencyPortableSymbol;
-      simpleSymbol = simpleCurrencySymbol;
       obsolete = currencyObsolete;
     }
 
@@ -203,12 +187,17 @@
       return displayName;
     }
 
+    public int getFlags() {
+      return flags;
+    }
+
     public String getJava() {
       StringBuilder buf = new StringBuilder();
       buf.append("new CurrencyDataImpl(\"").append(quote(code)).append("\", \"");
       buf.append(quote(symbol)).append("\", ").append(flags);
-      buf.append(", \"").append(quote(portableSymbol)).append('\"');
-      buf.append(", \"").append(quote(simpleSymbol)).append('\"');
+      if (portableSymbol.length() > 0) {
+        buf.append(", \"").append(quote(portableSymbol)).append('\"');
+      }
       return buf.append(')').toString();
     }
 
@@ -216,10 +205,19 @@
       StringBuilder buf = new StringBuilder();
       buf.append("[ \"").append(quote(code)).append("\", \"");
       buf.append(quote(symbol)).append("\", ").append(flags);
-      buf.append(", \"").append(quote(portableSymbol)).append('\"');
-      buf.append(", \"").append(quote(simpleSymbol)).append('\"');
+      if (portableSymbol.length() > 0) {
+        buf.append(", \"").append(quote(portableSymbol)).append('\"');
+      }
       return buf.append(']').toString();
     }
+
+    public String getSymbol() {
+      return symbol;
+    }
+
+    public boolean isObsolete() {
+      return obsolete;
+    }
   }
 
   private static final String CURRENCY_DATA = CurrencyDataImpl.class.getCanonicalName();
@@ -669,11 +667,12 @@
    * If no new currency data is added for this locale over its superclass, the
    * method is omitted entirely.
    * 
+   * @param allCurrencyData map of currency codes to currency data for the
+   *          current locale, including all inherited currencies data
+   * @param className name of the class we are generating
    * @param writer SourceWriter instance to use for writing the class
    * @param currencies array of valid currency names in the order they should be
    *          listed
-   * @param allCurrencyData map of currency codes to currency data for the
-   *          current locale, including all inherited currencies data
    */
   private void writeCurrencyMethodJava(SourceWriter writer,
       String[] currencies, Map<String, CurrencyInfo> allCurrencyData) {
@@ -708,11 +707,12 @@
    * If no new currency data is added for this locale over its superclass, the
    * method is omitted entirely.
    * 
+   * @param allCurrencyData map of currency codes to currency data for the
+   *          current locale, including all inherited currencies data
+   * @param className name of the class we are generating
    * @param writer SourceWriter instance to use for writing the class
    * @param currencies array of valid currency names in the order they should be
    *          listed
-   * @param allCurrencyData map of currency codes to currency data for the
-   *          current locale, including all inherited currencies data
    */
   private void writeCurrencyMethodNative(SourceWriter writer,
       String[] currencies, Map<String, CurrencyInfo> allCurrencyData) {
@@ -754,11 +754,10 @@
    * If no new names are added for this locale over its superclass, the method
    * is omitted entirely.
    * 
+   * @param className name of the class we are generating
    * @param writer SourceWriter instance to use for writing the class
    * @param currencies array of valid currency names in the order they should be
    *          listed
-   * @param allCurrencyData map of currency codes to currency data for the
-   *          current locale, including all inherited currencies data
    */
   private void writeNamesMethodJava(SourceWriter writer, String[] currencies,
       Map<String, CurrencyInfo> allCurrencyData) {
@@ -794,11 +793,10 @@
    * If no new names are added for this locale over its superclass, the method
    * is omitted entirely.
    * 
+   * @param className name of the class we are generating
    * @param writer SourceWriter instance to use for writing the class
    * @param currencies array of valid currency names in the order they should be
    *          listed
-   * @param allCurrencyData map of currency codes to currency data for the
-   *          current locale, including all inherited currencies data
    */
   private void writeNamesMethodNative(SourceWriter writer, String[] currencies,
       Map<String, CurrencyInfo> allCurrencyData) {
diff --git a/user/test/com/google/gwt/i18n/client/NumberFormat_en_Test.java b/user/test/com/google/gwt/i18n/client/NumberFormat_en_Test.java
index f69c5cd..3769508 100644
--- a/user/test/com/google/gwt/i18n/client/NumberFormat_en_Test.java
+++ b/user/test/com/google/gwt/i18n/client/NumberFormat_en_Test.java
@@ -124,34 +124,6 @@
     formatter = NumberFormat.getCurrencyFormat("ITL");
     str = formatter.format(1234.556);
     assertEquals("IT₤1,235", str);
-
-    // Test simple currency formatting
-    str = NumberFormat.getSimpleCurrencyFormat().format(1234.75);
-    assertEquals("$1,234.75", str);
-    str = NumberFormat.getSimpleCurrencyFormat().format(-1234.75);
-    assertEquals("($1,234.75)", str);
-    str = NumberFormat.getSimpleCurrencyFormat("CAD").format(1234.75);
-    assertEquals("$1,234.75", str);
-    str = NumberFormat.getSimpleCurrencyFormat("AUD").format(1234.75);
-    assertEquals("$1,234.75", str);
-    str = NumberFormat.getSimpleCurrencyFormat("JPY").format(1234.75);
-    assertEquals("¥1,235", str);
-    str = NumberFormat.getSimpleCurrencyFormat("CNY").format(1234.75);
-    assertEquals("¥1,234.75", str);
-
-    // Test global currency formatting
-    str = NumberFormat.getGlobalCurrencyFormat().format(1234.75);
-    assertEquals("$1,234.75 USD", str);
-    str = NumberFormat.getGlobalCurrencyFormat().format(-1234.75);
-    assertEquals("($1,234.75 USD)", str);
-    str = NumberFormat.getGlobalCurrencyFormat("CAD").format(1234.75);
-    assertEquals("$1,234.75 CAD", str);
-    str = NumberFormat.getGlobalCurrencyFormat("AUD").format(1234.75);
-    assertEquals("$1,234.75 AUD", str);
-    str = NumberFormat.getGlobalCurrencyFormat("JPY").format(1234.75);
-    assertEquals("¥1,235 JPY", str);
-    str = NumberFormat.getGlobalCurrencyFormat("CNY").format(1234.75);
-    assertEquals("¥1,234.75 CNY", str);
   }
 
   public void testExponential() {
