diff --git a/user/src/com/google/gwt/i18n/client/CurrencyData.java b/user/src/com/google/gwt/i18n/client/CurrencyData.java
index 0e286f5..a2dae16 100644
--- a/user/src/com/google/gwt/i18n/client/CurrencyData.java
+++ b/user/src/com/google/gwt/i18n/client/CurrencyData.java
@@ -43,6 +43,13 @@
   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 0dbf144..ad5a5a3 100644
--- a/user/src/com/google/gwt/i18n/client/CurrencyList.java
+++ b/user/src/com/google/gwt/i18n/client/CurrencyList.java
@@ -137,6 +137,7 @@
    * 
    * Deprecated currencies will not be included.
    */
+  @Override
   public final Iterator<CurrencyData> iterator() {
     return iterator(false);
   }
@@ -206,7 +207,7 @@
    * Generated implementations override this method.
    */
   protected CurrencyData getDefaultJava() {
-    return new CurrencyDataImpl("USD", "$", 2, "US$");
+    return new CurrencyDataImpl("USD", "$", 2, "US$", "$");
   }
 
   /**
@@ -225,10 +226,10 @@
    */
   protected HashMap<String, CurrencyData> loadCurrencyMapJava() {
     HashMap<String, CurrencyData> result = new HashMap<String, CurrencyData>();
-    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));
+    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¥", "¥"));
     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 23f7456..05fbf79 100644
--- a/user/src/com/google/gwt/i18n/client/DefaultCurrencyData.java
+++ b/user/src/com/google/gwt/i18n/client/DefaultCurrencyData.java
@@ -54,38 +54,52 @@
     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 c7c5ff6..5424ed3 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 String LOCALIZED_DOT_EQUIVALENTS = ".\u2024\u3002\uFE12\uFE52\uFF0E\uFF61";
   private static final char PATTERN_DECIMAL_SEPARATOR = '.';
   private static final char PATTERN_DIGIT = '#';
   private static final char PATTERN_EXPONENT = 'E';
@@ -353,26 +353,25 @@
   }
 
   /**
-   * Provides the standard currency format for the default locale.
+   * Provides the standard currency format for the current 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 = new NumberFormat(
-          defaultNumberConstants.currencyPattern(), CurrencyList.get().getDefault(), false);
+      cachedCurrencyFormat = getCurrencyFormat(CurrencyList.get().getDefault());
     }
     return cachedCurrencyFormat;
   }
 
   /**
-   * Provides the standard currency format for the default locale using a
+   * Provides the standard 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 default locale
+   *         currency format for the current locale
    */
   public static NumberFormat getCurrencyFormat(CurrencyData currencyData) {
     return new NumberFormat(defaultNumberConstants.currencyPattern(),
@@ -380,21 +379,20 @@
   }
 
   /**
-   * Provides the standard currency format for the default locale using a
+   * Provides the standard 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 default locale
+   *         currency format for the current locale
    * @throws IllegalArgumentException if the currency code is unknown
    */
   public static NumberFormat getCurrencyFormat(String currencyCode) {
-    // TODO(jat): consider caching values per currency code.
-    return new NumberFormat(defaultNumberConstants.currencyPattern(),
-        lookupCurrency(currencyCode), false);
+    return getCurrencyFormat(lookupCurrency(currencyCode));
   }
 
+
   /**
    * Provides the standard decimal format for the default locale.
    *
@@ -451,6 +449,44 @@
   }
 
   /**
+   * 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
@@ -481,6 +517,48 @@
   }
 
   /**
+   * 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.
    *
@@ -523,70 +601,97 @@
     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";
       }
@@ -681,14 +786,15 @@
   }-*/;
 
   /**
-   * The currency code.
+   * Information about the currency being used.
    */
-  private final String currencyCode;
+  private CurrencyData currencyData;
 
   /**
-   * Currency symbol to use.
+   * Holds the current decimal position during one call to
+   * {@link #format(boolean, StringBuilder, int)}.
    */
-  private final String currencySymbol;
+  private transient int decimalPosition;
 
   /**
    * Forces the decimal separator to always appear in a formatted number.
@@ -696,18 +802,30 @@
   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.
@@ -731,24 +849,6 @@
   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
@@ -767,13 +867,12 @@
     }
     this.numberConstants = numberConstants;
     this.pattern = pattern;
-    currencyCode = cdata.getCurrencyCode();
-    currencySymbol = cdata.getCurrencySymbol();
+    currencyData = cdata;
 
     // TODO: handle per-currency flags, such as symbol prefix/suffix and spacing
     parsePattern(this.pattern);
     if (!userSuppliedPattern && isCurrencyFormat) {
-      minimumFractionDigits = cdata.getDefaultFractionDigits();
+      minimumFractionDigits = currencyData.getDefaultFractionDigits();
       maximumFractionDigits = minimumFractionDigits;
     }
   }
@@ -1368,9 +1467,15 @@
             isCurrencyFormat = true;
             if ((pos + 1) < len && pattern.charAt(pos + 1) == CURRENCY_SIGN) {
               ++pos;
-              affix.append(currencyCode);
+              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());
+              }
             } else {
-              affix.append(currencySymbol);
+              affix.append(currencyData.getCurrencySymbol());
             }
             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 00e0b1c..35c09a4 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 three fields separated by "|".
+# the CLDR data.  Currently, this file contains four 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,52 +33,160 @@
 #
 # 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
-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
+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$
 TRY = YTL
-TWD = NT$
-USD = US$
-UYU = UY$
-VND = ₫|SymSuffix
-YER = YER
-ZAR = ZAR
+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
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 d7c2b8b..aa1a55f 100644
--- a/user/src/com/google/gwt/i18n/client/constants/NumberConstants.java
+++ b/user/src/com/google/gwt/i18n/client/constants/NumberConstants.java
@@ -28,21 +28,23 @@
  * use LocaleInfo.getCurrentLocale().getNumberConstants() instead.
  */
 public interface NumberConstants {
-  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();
+  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();
 }
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 2fd1b77..0c5e294 100644
--- a/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.java
+++ b/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.java
@@ -27,21 +27,60 @@
  * locale. 
  */
 public interface NumberConstantsImpl extends Constants, NumberConstants  {
-  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();
+  @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();
 }
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 a971da3..e8a9abe 100644
--- a/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.properties
+++ b/user/src/com/google/gwt/i18n/client/constants/NumberConstantsImpl.properties
@@ -1,5 +1,6 @@
 # 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
@@ -13,6 +14,7 @@
 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 92ec8ab..6716e02 100644
--- a/user/src/com/google/gwt/i18n/client/impl/CurrencyDataImpl.java
+++ b/user/src/com/google/gwt/i18n/client/impl/CurrencyDataImpl.java
@@ -71,25 +71,41 @@
   private final int flagsAndPrecision;
 
   /**
-   * Portable currency symbol, may be the same as {@link #currencySymbol}.
+   * Portable currency symbol, may be the same as {@link #getCurrencySymbol()}.
    */
   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, currencySymbol);
+  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, String portableCurrencySymbol) {
+      int flagsAndPrecision, String portableCurrencySymbol, String simpleCurrencySymbol) {
     super(currencyCode, currencySymbol,
         getDefaultFractionDigits(flagsAndPrecision));
     this.flagsAndPrecision = flagsAndPrecision;
-    this.portableCurrencySymbol = portableCurrencySymbol;
+    this.portableCurrencySymbol = portableCurrencySymbol == null ? currencySymbol
+        : portableCurrencySymbol;
+    this.simpleCurrencySymbol = simpleCurrencySymbol == null ? currencySymbol
+        : simpleCurrencySymbol;
   }
 
   @Override
@@ -103,6 +119,11 @@
   }
 
   @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 865335b..8b3ca62 100644
--- a/user/src/com/google/gwt/i18n/client/impl/CurrencyDataJso.java
+++ b/user/src/com/google/gwt/i18n/client/impl/CurrencyDataJso.java
@@ -32,6 +32,7 @@
  *       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 {
@@ -39,38 +40,52 @@
   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 a6a9cef..214e1bb 100644
--- a/user/src/com/google/gwt/i18n/rebind/CurrencyListGenerator.java
+++ b/user/src/com/google/gwt/i18n/rebind/CurrencyListGenerator.java
@@ -74,6 +74,8 @@
 
     private final String symbol;
 
+    private String simpleSymbol;
+
     /**
      * Create an instance.
      * 
@@ -123,6 +125,7 @@
       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];
       }
@@ -145,6 +148,7 @@
         // 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) {
@@ -166,6 +170,11 @@
         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) {
@@ -176,10 +185,17 @@
       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;
     }
 
@@ -187,17 +203,12 @@
       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);
-      if (portableSymbol.length() > 0) {
-        buf.append(", \"").append(quote(portableSymbol)).append('\"');
-      }
+      buf.append(", \"").append(quote(portableSymbol)).append('\"');
+      buf.append(", \"").append(quote(simpleSymbol)).append('\"');
       return buf.append(')').toString();
     }
 
@@ -205,19 +216,10 @@
       StringBuilder buf = new StringBuilder();
       buf.append("[ \"").append(quote(code)).append("\", \"");
       buf.append(quote(symbol)).append("\", ").append(flags);
-      if (portableSymbol.length() > 0) {
-        buf.append(", \"").append(quote(portableSymbol)).append('\"');
-      }
+      buf.append(", \"").append(quote(portableSymbol)).append('\"');
+      buf.append(", \"").append(quote(simpleSymbol)).append('\"');
       return buf.append(']').toString();
     }
-
-    public String getSymbol() {
-      return symbol;
-    }
-
-    public boolean isObsolete() {
-      return obsolete;
-    }
   }
 
   private static final String CURRENCY_DATA = CurrencyDataImpl.class.getCanonicalName();
@@ -667,12 +669,11 @@
    * 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) {
@@ -707,12 +708,11 @@
    * 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,10 +754,11 @@
    * 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) {
@@ -793,10 +794,11 @@
    * 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 3769508..f69c5cd 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,6 +124,34 @@
     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() {
